Définir le retour sur investissement de l’image avec OpenCV en C

J’ai une question sur la façon de définir un retour sur investissement avec OpenCV. Je sais ce que la définition de la fonction cvSetImageROI mais je veux savoir s’il est possible de définir un ROI avec OpenCV avec une forme différente de celle du rectangle. Par exemple, définissez un retour sur investissement dans un cercle ou sous une forme différente.

C’est possible de faire ça?

cvSetImageROI (img1, cvRect (a, b, c, d));

Le code suivant, que vous auriez pu trouver ici ou même ici, définit un retour sur investissement circulaire en utilisant un masque de bits sur votre image.

 #include "cv.h" #include "highgui.h" int main(int argc, char** argv) { IplImage* src, * res, * roi; /* usage:   */ if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } src = cvLoadImage(argv[1], 1); res = cvCreateImage(cvGetSize(src), 8, 3); roi = cvCreateImage(cvGetSize(src), 8, 1); /* prepare the 'ROI' image */ cvZero(roi); /* Note that you can use any shape for the ROI */ cvCircle( roi, cvPoint(130, 100), 50, CV_RGB(255, 255, 255), -1, 8, 0 ); /* extract subimage */ cvAnd(src, src, res, roi); /* * do the main processing with subimage here. * in this example, we simply invert the subimage */ cvNot(res, res); /* 'restore' subimage */ IplImage* roi_C3 = cvCreateImage(cvGetSize(src), 8, 3); cvMerge(roi, roi, roi, NULL, roi_C3); cvAnd(res, roi_C3, res, NULL); /* merge subimage with original image */ cvNot(roi, roi); cvAdd(src, res, res, roi); /* show result */ cvNamedWindow(argv[1], 1); cvNamedWindow("res", 1); cvShowImage(argv[1], src); cvShowImage("res", res); cvWaitKey(0); /* be tidy */ cvDestroyAllWindows(); cvReleaseImage(&src); cvReleaseImage(&res); cvReleaseImage(&roi); return 0; } 

Pour un pentagone ou un hexagone, adaptez-le simplement afin de changer la forme géomésortingque du masque. Cochez cette question SO: Utilisation du ROI dans OpenCV? .

Vous êtes censé utiliser des masques pour simuler un retour sur investissement non rectangular.

Vous trouverez ci-dessous le code de la ROI circulaire. Cependant, pour changer de forme, il suffit de remplacer la fonction CvCircle () par une autre forme. cvAnd(src, src, res, roi); est la fonction de masquage la plus importante ici.

 //(c) 2012 enthusiasticgeek for Stack overflow #include "cv.h" #include "highgui.h" #define REQUIRED_RADIUS (100) int main(int argc, char** argv) { IplImage* src, * res, * roi; /* usage:   */ if (argc < 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } src = cvLoadImage(argv[1], 1); cvSetImageROI(src,cvRect(src->width/2-REQUIRED_RADIUS, src->height/2-REQUIRED_RADIUS,REQUIRED_RADIUS*2,REQUIRED_RADIUS*2)); res = cvCreateImage(cvGetSize(src), 8, 3); roi = cvCreateImage(cvGetSize(src), 8, 1); /* prepare the 'ROI' image */ cvZero(roi); cvZero(res); /* Note that you can use any shape for the ROI */ cvCircle( roi, cvPoint(REQUIRED_RADIUS,REQUIRED_RADIUS),//src->width/2, src->height/2), REQUIRED_RADIUS, CV_RGB(255, 255, 255), -1, 8, 0 ); /* extract subimage */ cvAnd(src, src, res, roi); /* show result */ cvNamedWindow("res", 1); cvShowImage("res", res); cvWaitKey(0); /* be tidy */ cvDestroyAllWindows(); cvReleaseImage(&src); cvReleaseImage(&res); cvReleaseImage(&roi); return 0; }