将图像区域复制到另一幅图像的另一区域

10

我想做一件非常简单的事情:将图像中的一个区域复制到新图像的一个新区域。在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) 的区域。
有人能告诉我为什么它不起作用吗?


您提供的代码片段不完整。请您发布完整的代码,包括实际执行复制操作的部分。 - ypnos
可能是如何在OpenCV中设置ROI?的重复问题。 - karlphillip
也可能是https://dev59.com/aWw15IYBdhLWcg3whMA1的重复。 - karlphillip
抱歉,我错过了最后一行,我刚刚编辑了它。 - Tulkkas
关于您的评论karlphilip,实际上那里的问题没有得到解答。当执行frameO(r).copyTo(destROI)时,图像会被成功复制到destROI中。如果我显示它,它将包含新图像,但它不会影响输出,而我希望图像最终出现在输出中。 - Tulkkas
你看到任何原因导致它不工作吗? - Tulkkas
2个回答

18

实际上,这些命令在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

同样的过程可以使用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()); 我知道我来晚了,也许对未来的用户有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接