opencv 旋转矩形的提取

Major_Tom_F 2017-11-29 04:16:28
opencv 怎么将旋转的矩形提取出来啊?下面是部分代码
因为图片中有旋转的矩形,想用RotatedRect 检测出包围的最小外接矩形,但是在通过ROI提取的时候不行,因为不是Rec类型的。请问这个问题怎么解决?最好就简单的配合下面代码展开,非常感谢!!

for(int i=0; i<contours.size();i++)
{

RotatedRect rect=minAreaRect(contours[i]); //RotatedRect
Point2f P[4];
rect.points(P);
for(int j=0;j<=3;j++)
{
line(imgSrc,P[j],P[(j+1)%4],Scalar(255),1); //这个地方通过画线得到的外接矩形就是想要的区域
}
Rect bRect = rect.boundingRect(); //
rectangle(imgSrc, bRect, Scalar(128));

roi[i]=imgSrc(rect);
}
...全文
1206 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-11-30
  • 打赏
  • 举报
回复 1
WarpAffine 对图像做仿射变换 void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, CvScalar fillval=cvScalarAll(0) ); src 输入图像. dst 输出图像. map_matrix 2×3 变换矩阵 flags 插值方法和以下开关选项的组合: CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval. CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换。 fillval 用来填充边界外面的值 函数 cvWarpAffine 利用下面指定的矩阵变换输入图像: 如果没有指定 CV_WARP_INVERSE_MAP , , 否则, 函数与 cvGetQuadrangleSubPix 类似,但是不完全相同。 cvWarpAffine 要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对小图像不太合适)而且输出图像的部分可以保留不变。而 cvGetQuadrangleSubPix 可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。 要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform 。
Major_Tom_F 2017-11-30
  • 打赏
  • 举报
回复
引用 2 楼 zhangli00 的回复:
RotateRect有个成员angle,是这个矩形旋转的角度,根据这个角度进行仿射变换,就是上面赵老师说的那个,就可以旋转摆正了,再来提取roi就可以了,不过注意,RotateRect是C++里面的对象,赵老师给的cvWarpAffine是C里面的方法,你应该用cv::WarpAffine或者把RotateRect换成C里面对应的对象,不记得叫什么了,反正名字差别很大
非常感谢!是这样的,就是一个图片中有这些倾斜的文字,我用寻找轮廓能检测提取,可是矩形是正的,我就想用minAreaRect这个方法。您说的得到角度然后旋转,我试一直是整个图旋转,我没办法让我想要的单个文字旋转。还请继续赐教。
csulizhang 2017-11-30
  • 打赏
  • 举报
回复
RotateRect有个成员angle,是这个矩形旋转的角度,根据这个角度进行仿射变换,就是上面赵老师说的那个,就可以旋转摆正了,再来提取roi就可以了,不过注意,RotateRect是C++里面的对象,赵老师给的cvWarpAffine是C里面的方法,你应该用cv::WarpAffine或者把RotateRect换成C里面对应的对象,不记得叫什么了,反正名字差别很大

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧