使用C中的OpenCV定义图像ROI

我有一个关于如何使用OpenCV定义ROI的问题。 我知道函数cvSetImageROI的定义,但我想知道是否可以使用与矩形不同的OpenCV定义ROI。 例如,以圆圈或不同forms定义ROI。

有可能这样做吗?

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

以下代码可以在此处找到,甚至可以在图像上使用位掩码设置循环ROI。

 #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; } 

对于五边形或六边形,只需调整它以改变面罩的几何形状。 检查这个问题: 在OpenCV中使用ROI? 。

您应该使用掩码来模拟非矩形ROI。

以下是循环投资回报率的代码。 但是,要更改为其他形状,只需将CvCircle()函数替换为其他形状即可。 cvAnd(src, src, res, roi); 是这里最重要的掩蔽function。

 //(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; }