我想做一件非常简单的事情:将图像中的区域复制到新图像中的新区域。在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)
。
任何人都可以告诉我为什么这不起作用?
答案 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());
我知道我对游戏迟到了,也许它将对将来的用户有用。