总结记录——(opencv取任意位置矩形矫正算法)

如何将一个斜放的矩形从一个图像里复制出来?

大致思路如下:
1、创建一个与源图像src 的 size 相同的单通道矩阵 mask ,并 cvZero( mask );
2、用 cvPolyLine() 将已知的4个角点连成一个四边形,画在 mask 上;
3、用 cvFillConvexPoly 或 cvFillPoly 将 mask 上的四边形涂色;
4、用 cvCopy(src, dst, mask) 将四边形区域复制到 dst。

在 cvCopy 之后可以用 cvResize 将图像转换至较小的一幅图像上,具体地:

1-4 ……;
5、求出能包含已知角点的、水平/垂直的最小矩形 minrect (可以用 cvBoundingRect 、也可以自行编程获取 minrect);
6、创建一幅与 minrect 相同大小的图像 scaled_dst ;
7、将 cvCopy 所得的 dst 图像的 ROI 设置为 minrect 的位置:cvSetImageROI(dst, minrect) ;
8、获得所需的小图像:cvResize(dst, scaled_dst)

这个过程是复制出了这个矩形,但这个矩形在新的scaled_dst仍为斜的,或者可以说他复制出了包围这个斜矩形的最小矩形,但这个斜矩形还是没能正过来。如果要得到包围这个斜矩形的最小矩形在原图像上用cvSetImageROI()就好了。

cvSetImageROI(),可以设置成斜的矩形吗?好像它的参数必须为一个正矩形。
我是想把这个斜矩形拷出来。其他没有别的东西。

那可以用 OpenCV 的仿射变换函数来实现,具体地:

1、创建一个与倾斜矩形相同大小的图像 dst ;
2、将倾斜矩形的角点坐标 srt_pns 换算为 垂直矩形的角点坐标 dst_pns ,利用 cvGetAffineTransform 获取旋转矩阵 map_matrix;
3、利用 cvWarpAffine 函数将原图像 srt 旋转,使感兴趣的矩形区域由倾斜旋转至垂直(或水平);
4、利用 cvSetImageROI 和 cvResize 将感兴趣区域复制到 dst 。

是的,这个方法应该是可行的,我原来那个旋转有点麻烦,我目前利用的是cvGetQuadrangleSubPix()实现旋转,但它有个缺点就是必须是旋转中心在原图像中心(不然旋转前后坐标不知道如何对应),这样我的做法其实是:
1.计算斜矩形在原图像中的左上角点坐标。
2.使用cvGetRectSubPix()以左上角点坐标为中心,复制出一个包括原斜矩形的子图像dst1。
3.使用cvGetQuadrangleSubPix()实现对上部的子图dst1旋转并复制出一个新子图dst2(与子图像大小一致),角度可以通过原左上角点和原右上角点坐标计算得出。
4.使用cvGetRectSubPix()复制出斜矩形旋转后的子图,此时原斜矩形左上角点在dst2的中心,且已经转到水平。

你可能感兴趣的:(图像处理,opencv)