如何在OpenCV中设置ROI?

14

我有两张图片,第一张比第二张小。我需要将第二张图像复制到第一张图像上。为此,我需要在第一张图像上设置ROI,将第二张图像复制到第一张图像上,然后重置ROI。

但是,我正在使用C++接口,所以我不知道该如何实现。在C语言中,我可以使用cvSetImageROI,但这在C++接口中不起作用。

那么,基本上,cvSetImageROI的C ++替代方法是什么?

//output is a pointer to the mat whom I want the second image (colourMiniBinMask) copied upon
Rect ROI (478, 359, 160, 120);

Mat imageROI (*output, ROI);

colourMiniBinMask.copyTo (imageROI);

imshow ("Gravity", *output);

3
请参考 https://dev59.com/HWw05IYBdhLWcg3wxUn_,这篇文章讨论了在OpenCV C接口中实现类似于cvSetImageROI的功能的方法。 - Tyler Hyndman
我已经尝试过了。我没有收到任何错误信息,但是我设置ROI的图像没有受到影响 - 它保持不变。我只是得到了该部分图像的副本而不是访问它。(我想)。 - fdh
如果src和dst矩阵的格式不匹配(即src=BGR,dst=BGRA),copyTo函数将重新创建内容。如果是这种情况,“imageROI.data”将被重新分配,您会看到指针的地址已更改。另一方面,imageROI的标头将保持不变。在这种情况下,请使用mixChannels、merge或cvtColor函数。 - vahapt
2个回答

17

我认为你有些地方出错了。如果第一个图像比另一个小,并且您想将第二个图像复制到第一个中,您不需要ROI。您只需调整第二个图像的大小并将其复制到第一个即可。

但是,如果您想将第一个图像复制到第二个图像中,我认为这段代码应该能够工作:

cv::Rect roi = cv::Rect((img2.cols - img1.cols)/2,(img2.rows - img1.rows)/2,img1.cols,img1.rows);

cv::Mat roiImg;
roiImg = img2(roi);

img1.copyTo(roiImg);

4
Mat roiImg(img2, roi); - Ben
抱歉,我的意思是第二张图片比第一张小,我想将第二张复制到第一张。我尝试了你的代码,但它不起作用。图像1(我想要更改其ROI的图像)根本没有改变。我在我的问题中包含了我的代码。还有其他建议吗? - fdh

3

这是我使用的代码。我认为注释已经解释了它。

/* ROI by creating mask for the parallelogram */
Mat mask = cvCreateMat(480, 640, CV_8UC1);
// Create black image with the same size as the original
for(int i=0; i<mask.cols; i++)
   for(int j=0; j<mask.rows; j++)
       mask.at<uchar>(Point(i,j)) = 0;

// Create Polygon from vertices
vector<Point> approxedRectangle;
approxPolyDP(rectangleVertices, approxedRectangle, 1.0, true);

// Fill polygon white
fillConvexPoly(mask, &approxedRectangle[0], approxedRectangle.size(), 255, 8, 0);                 

// Create new image for result storage
Mat imageDest = cvCreateMat(480, 640, CV_8UC3);

// Cut out ROI and store it in imageDest
image->copyTo(imageDest, mask);

我也写过这个问题,并放了一些图片 在这里


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