将图像的区域复制到另一个图像中的另一个区域
Posted
技术标签:
【中文标题】将图像的区域复制到另一个图像中的另一个区域【英文标题】:Copying Region of an Image to another Region in another Image 【发布时间】:2012-04-13 08:42:16 【问题描述】:我想做一件非常简单的事情:将图像中的区域复制到新图像中的新区域中。在 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)
位置的输出中。谁能告诉我为什么这不起作用?
【问题讨论】:
您提供的代码片段不完整。您能否发布整个代码,包括您实际执行复制的操作。 How to set ROI in OpenCV?的可能重复 也可能是***.com/questions/6566295/…的副本 对不起,我错过了最后一行,我刚刚编辑了它。 关于您的评论 karlphilip,实际上没有回答那里的问题。当做 frameO(r).copyTo(destROI);图像很好地复制到 destROI。如果我显示它,它将包含新图像,但它不会影响我希望图像结束的输出。 【参考方案1】:实际上这些命令在 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 中。
【讨论】:
【参考方案2】:同一进程的另一种方法是使用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());
我知道我玩游戏迟到了,也许它对未来的用户有用。
【讨论】:
以上是关于将图像的区域复制到另一个图像中的另一个区域的主要内容,如果未能解决你的问题,请参考以下文章
MFC中,如何将CBitmap中的图片复制到另一CBitmap的一块区域中,即如何读取一个CBit