web-dev-qa-db-ja.com

OpenCVでROIを設定する方法

2つの画像があり、最初の画像は他の画像よりも小さいです。最初の画像に2番目の画像をコピーする必要があります。そのためには、最初の画像にROIを設定し、2番目の画像を最初の画像にコピーしてから、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);
14
fdh

何かおかしいと思います。最初の画像が他の画像よりも小さく、2番目の画像を最初の画像にコピーする場合、ROIは必要ありません。 2番目の画像のサイズを変更して、最初の画像にコピーできます。

ただし、最初のものを2番目のものにコピーする場合は、次のコードが機能するはずです。

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);
17
Showpath

これは私が使用したコードです。コメントはそれを説明していると思います。

/* 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

3
Pieter-Jan