ROI非常有用,例如我们想把图像中的人脸扣出来,进行人脸识别。需要注意的时候,ROI一定在图像内部,而不能超出图像的范围。 对图像设定ROI的函数是: cvSetImageROI(IplImage* src,CvRect rect); src表示的是源图像,rect只的是ROI区域。 如果要取消ROI区域,那么使用函数: cvResetImageROI(IplImage* src); 这个函数,就把src上的ROI区域取消掉。 下面举几个例子: 例子1: 从一幅大图像中,取出一小块图像并保存这一个小块图像。 代码如下: IplImage *img1 = cvLoadImage("elvita.jpg", 1); cvSetImageROI(img1, cvRect(10, 15, 150, 250)); IplImage *img2 = cvCreateImage(cvGetSize(img1), cvCopy(img1, img2, NULL); cvResetImageROI(img1); 例子2: 两幅不同大小的图像相加 IplImage *img1 = cvLoadImage("elvita.jpg", 1); IplImage *img2 = cvLoadImage("fifi.jpg", 1); CvRect rect = cvRect(25, 25, img2->width, img2->height); cvSetImageROI(img1, rect); cvAdd(img1, img2, img1, NULL); cvResetImageROI(img1); 例子3:在一个特定区域进行模板匹配 (关于模板匹配的完整代码下载) IplImage *src = cvLoadImage("myphoto.jpg", 1); IplImage *template = cvLoadImage("eye.jpg", 1); CvRect rect = cvRect(25, 25, 120, 120); //设置ROI区域 cvSetImageROI(src, rect); IplImage *result = cvCreateImage(cvSize(rect.width cvMatchTemplate(src, template, result, CV_TM_SQDIFF); CvPoint double cvMinMaxLoc(result, &minvalue, &maxvalue, &minlocation, &maxlocation, 0); cvRectangle(src, cvResetImageROI(src); 在上面的例子中,先定义ROI区域,再进行模板匹配,这样会加快匹配的速度,因为,只在ROI区域进行模板匹配运算。 例子4:ROI区域像素值的访问 可以想把ROI区域拷贝到一幅新的图像中,然后再访问其像素值 CvRect rect = cvRect(10, 20, 50, 60); IplImage* subimg; cvSetImageROI(img, rect); //ROI区域拷贝 cvCopy(img, subimg, NULL); //释放ROI区域 cvResetImageROI(img); 或者可以通过ROI的左边信息进行访问 CvRect rect = cvRect(10, 20, 50, 60); //设置ROI区域 cvSetImageROI(img, rect); for (i = rect.y; i < (rect.y + rect.height); i++) { } cvResetImageROI(img); |
|