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在 location 的输出中复制图像Rect(20,20, frameO.cols, frameO.rows)
任何人都可以告诉我为什么这不起作用?

4

2 回答 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将被复制到由 定义的输出中的 ROI 中Rect(0, 0, frame1.cols, frame1.rows)

于 2012-05-18T00:35:30.780 回答
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());

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

于 2019-05-08T08:01:12.607 回答