繁体   English   中英

OpenCV旋转,扭曲和转换新图像中的ROI

[英]OpenCV rotate, distort and translate ROI in new image

我有一幅想要获得垂直ROI的图像,应用一些转换并添加到另一幅图像。

我在StackOverflow和其他论坛上阅读了很多问题和答案,但是我仍然对这个问题感到困惑。 目前,我正在使用OpenCV的C接口,但是如果需要的话,我可以使用C ++(我必须编写一个转换函数,因为我正在Cocoa中使用CGImageRef)。

为了从顶部图像(见下文)到底部图像,我想我必须:

  • 在第一张图像上获得投资回报;
  • 缩小比例;
  • 得到我的“宽度”角(中心角是固定的);在中心和2个圆之间的线上获得交点;
  • 使图像失真,使拐角处停留在我的相交点;
  • 绕中心点旋转并将其放入输出图像。

ROI旋转和扭曲

目前,我很好地做到了这一点:

  • 获得投资回报;
  • 用cvResize缩放它;
  • 获取交点应该不会太复杂,因为它是纯几何形状,而我将其用于其他目的。

但是,我完全不知道如何扭曲所生成的ROI图像,而且我也不知道在OpenCV中是否有可能。 我需要使用一种透视校正吗?

而且,我一直在尝试一些我发现的不错的帖子解决方案,它们可以随旋转的边界框一起旋转,但目前效果不佳。

编辑:

好吧,我设法完成了第一部分工作:

  • 在基础图像中获得投资回报;
  • 旋转并将其放置在距中心固定距离的位置。

圆缝扫描

我使用了这篇文章中解释和编码的方法: https : //stackoverflow.com/a/16285286/1060921

我只添加了一个变量来设置旋转点并获得我的内圆。

注意 :我在调用该方法之前设置了ROI,因此post方法中的ROI是...图像大小。 然后,使用cvAdd将其放置在最终图像的中心。

在这里,我得到了摄像机输入的一个像素切片。 我现在想做的是使较大的切片变形,例如从内圆上的2个像素变形到外圆上的5个像素。

请参阅本教程 ,该教程使用warpPerspective纠正透视变形。

编辑:在您的情况下, warpAffine应该是更好,更简单的解决方案。

因此,您可以执行以下操作,只需使用四个点而不是三个点即可:

Point2f srcTri[3];
Point2f dstTri[3];

Mat rot_mat( 2, 3, CV_32FC1 );
Mat warp_mat( 2, 3, CV_32FC1 );
Mat src, warp_dst, warp_rotate_dst;

/// Load the image
src = imread( ... );

/// Set the dst image the same type and size as src
warp_dst = Mat::zeros( src.rows, src.cols, src.type() );

/// Set your 3 points to calculate the  Affine Transform
srcTri[0] = Point2f( 0,0 );
srcTri[1] = Point2f( src.cols - 1, 0 );
srcTri[2] = Point2f( 0, src.rows - 1 );

dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );
dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );
dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );

/// Get the Affine Transform
warp_mat = getAffineTransform( srcTri, dstTri );

/// Apply the Affine Transform just found to the src image
warpAffine( src, warp_dst, warp_mat, warp_dst.size() );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM