将图像的区域复制到另一个图像中的另一个区域

时间:2012-04-13 08:42:17

标签: c++ opencv computer-vision

我想做一件非常简单的事情:将图像中的区域复制到新图像中的新区域。在OpenCV 2.3备忘单中,他们提出了以下解决方案:

  

“示例3.将图像ROI复制到另一个带转换的图像”

Rect r(1, 1, 10, 20);
Mat dstroi = dst(Rect(0,10,r.width,r.height));
src(r).convertTo(dstroi, dstroi.type(), 1, 0);

我的代码如下:

Mat frameO, frameS;

original >> frameO;
stabilized >> frameS;

Mat output(frameO.rows+40, frameO.cols*2+60, CV_32FC3);
output.setTo(0);            
Rect r(0,0, frameO.cols, frameO.rows);
Mat destROI = output(Rect(20,20, frameO.cols, frameO.rows));
frameO(r).copyTo(destROI);

我只是想在frameO位置复制输出中的图片Rect(20,20, frameO.cols, frameO.rows)
任何人都可以告诉我为什么这不起作用?

2 个答案:

答案 0 :(得分:13)

实际上这些命令在OpenCV 2.3中不起作用,但现在以下版本在2.4版本中运行良好:

Mat frame1 = imread(nameReading1);

Mat output(frame1.rows*2, frame1.cols*2, frame1.type());
output.setTo(0);

frame1.copyTo(output(Rect(0, 0, frame1.cols, frame1.rows)));

只要类型一致,这将在输出中复制frame1,因此在创建输出时要小心。 frame1将复制到Rect(0, 0, frame1.cols, frame1.rows)定义的输出中的ROI中。

答案 1 :(得分:0)

用于同一过程的另一种方法是使用WarpAffine函数。

由于您已经知道ROI,因此可以创建子MAT来存储临时数据并将其粘贴到任何所需大小的新图像中。

 Mat tempImage = imageTest.SubMat(rowStart, rowEnd, colStart, colEnd);
 Mat targetImage = new Mat(rowEnd - rowStart, colEnd - colStart, MatType.CV_64FC3);
 tempImage.CopyTo(targetImage);

现在您可以将内容粘贴到新图像上,如下所示:

double[,] transMatDynamicScaling = new double[2, 3] { { 1, 0, desiredROW }, { 0, 1, desiredCol } }; Mat transformationMAT = new Mat(2, 3, MatType.CV_64FC1, transMatDynamicScaling);

最后,您可以使用warpfunction粘贴到newImage中(记住要在内存中创建新图像)

Cv2.WarpAffine(targetImage,addImage1,transformDynamicScaling,addImage1.Size());

我知道我对游戏迟到了,也许它将对将来的用户有用。