2013-05-07 97 views
2

我有一张图像,我想从中获得垂直ROI,应用一些转换并添加到另一张图像。OpenCV在新图像中旋转,扭曲和翻译ROI

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

从顶部图像获取(见下文),在底部的形象,我想我必须:

  • 获得第一个图像上的ROI;
  • 将其缩小;
  • 获取我的“宽度”角度(角度固定)中心和2个圆圈之间的交点。
  • 扭曲的图像,使角落坚持我的交点;
  • 围绕中心点旋转并将其放入输出图像中。

ROI rotate and distort

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

  • 获取投资回报;
  • 使用cvResize缩放它;
  • 获取交点不应太复杂,因为它是纯几何图形,我为了其他目的而实现它。

但是,我不知道如何扭曲我的投资回报率的结果图像,我不知道它是否甚至可以在OpenCV中。我需要使用一种视角矫正吗?

而且,我一直在尝试通过这里找到的几个很好的帖子解决方案来与旋转的边框一起旋转,但目前没有好的结果。

编辑:

好吧,我设法做的工作的第一部分:

  • 获取的基础图像的ROI;
  • 旋转并将其放置在离中心一段固定的距离处。

Circle SlitScan

我使用的方法解释,并在这个职位编码:https://stackoverflow.com/a/16285286/1060921

我只加一个变量来设置旋转点,让我的内圆。

NB:我设置了ROI BEFORE来调用方法,因此post方法中的ROI是...图像大小。然后我用cvAdd将它放在最终图像的中心。

在这里,我得到我的相机输入的一个像素片。 我现在想要做的是扭曲更大的切片,例如从内圈的2个像素到外圈的5个像素。

回答

0

看到这个tutorial它使用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());