web-dev-qa-db-fra.com

Comment définir le ROI dans OpenCV?

J'ai deux images, la première plus petite que l'autre. J'ai besoin de copier la deuxième image sur la première image. Pour ce faire, je dois définir le retour sur investissement sur la première, copier la deuxième image sur la première, puis réinitialiser le retour sur investissement.

Cependant j'utilise l'interface C++ donc je n'ai aucune idée de comment faire cela. En C, j'aurais pu utiliser cvSetImageROI mais cela ne fonctionne pas sur l'interface C++.

Alors, quelle est l'alternative 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);
14
fdh

Je pense que vous avez quelque chose de mal. Si la première est plus petite que l'autre et que vous souhaitez copier la deuxième image dans la première, vous n'avez pas besoin d'un retour sur investissement. Vous pouvez simplement redimensionner la deuxième image en la copiant dans la première.

Cependant, si vous souhaitez copier le premier dans le second, je pense que ce code devrait fonctionner:

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

C'est le code que j'ai utilisé. Je pense que les commentaires l'expliquent.

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

J'ai également écrit à ce sujet et mis quelques photos ici .

3
Pieter-Jan