Déplacer la zone d’une image vers le centre à l’aide d’OpenCV

J’essaie de déplacer une région d’une image vers le centre, j’ai réussi à obtenir son contour et je sais comment la placer au centre. Mais ce que je veux, c’est déplacer les pixels qui se trouvent à l’intérieur du contour (jaune avec du noir) au centre et pas seulement le contour (qui est rose par CV_FILLED ).

Image:

Code:

 //Then segment the image. save in Mat crop // ---- Center image ----- // pos : contour interest RotatedRect rr = fitEllipse(contours[pos]); vector&contour = contours[pos]; //http://stackoverflow.com/a/29467236/4595387 //difference between the centre of the image and centre of the contour Point center = Point( crop.cols/2, crop.rows/2 ); int nX = center.x - rr.center.x; int nY = center.y - rr.center.y; for (size_t i=0; i< contour.size(); i++) { contour[i].x += nX; contour[i].y += nY; } cout << "x: " << rr.center.x; cout << "y: " << rr.center.y; //color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); //contour of the image to the center. cv::drawContours(crop, contours, pos, color, CV_FILLED); imshow("In",imagen_src); imshow("Out",crop); 

Vous devez essentiellement jouer avec copyTo avec un masque. Les étapes sont commentées dans le code. Si vous avez besoin d’une couleur d’arrière-plan différente, modifiez simplement backgroundColor dans le code ci-dessous.

Code:

 #include  using namespace cv; int main() { // Read image Mat3b img = imread("path_to_image"); // Convert to hsv Mat3b hsv; cvtColor(img, hsv, COLOR_BGR2HSV); // Threshold on yellow color (in hsv space) Mat1b maskOnYellow; inRange(hsv, Scalar(20, 100, 100), Scalar(40, 255, 255), maskOnYellow); // Find contours of yellow item vector> contours; findContours(maskOnYellow.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // Create a mask as a filled contour Mat1b mask(img.rows, img.cols, uchar(0)); drawContours(mask, contours, 0, Scalar(255), CV_FILLED); // Get the bounding box of the item Rect box = boundingRect(contours[0]); // Get the roi in the input image according to the mask Mat3b item(img(box)); // Create a black image (same size as the yellow item and same background bolor as result image) // to copy the result of the segmentation Vec3b backgroundColor(0,0,0); // black Mat3b segmentedItem(item.rows, item.cols, backgroundColor); // Copy only the masked part item.copyTo(segmentedItem, mask(box)); // Compute the center of the image Point center(img.cols / 2, img.rows / 2); // Create a result image Mat3b res(img.rows, img.cols, backgroundColor); // Compute the rectangle centered in the image, same size as box Rect centerBox(center.x - box.width/2, center.y - box.height/2, box.width, box.height); // Put the segmented item in the center of the result image segmentedItem.copyTo(res(centerBox)); imshow("Result", res); waitKey(); return 0; } 

Consortingbution:

entrez la description de l'image ici

Résultat:

entrez la description de l'image ici