如何在OpenCV中设置ROI?

时间:2011-11-21 01:53:52

标签: c++ c image opencv

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

但是我使用的是C ++界面,所以我不知道如何做到这一点。在C中我可以使用cvSetImageROI但这在C ++接口上不起作用。

那么基本上是C ++替代cvSetImageROI吗?

//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);

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

我也写了这个并写了一些照片here