分享

Opencv中的ROI介绍

 君王之王 2015-12-08

        ROI(Region of Interest)是指图像中的一个矩形区域,可能你后续的程序需要单独处理这一个小区域,如图所示
Opencv中的ROI介绍 


        如上图所示,就是ROI的一个例子,如果你对图像设置了ROI,那么,Opencv的大多数函数只在该ROI区域内运算(只处理该ROI区域),如果没设ROI的话,就会出来整幅图像。
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),
                               img1->depth,
                               img1->nChannels);


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  - tpl->width  + 1,
                                     rect.height - tpl->height + 1),
                              IPL_DEPTH_32F, 1);


cvMatchTemplate(src, template, result, CV_TM_SQDIFF);


CvPoint    minlocation, maxlocation;
double    minvalue, maxvalue;
cvMinMaxLoc(result, &minvalue, &maxvalue, &minlocation, &maxlocation, 0);


cvRectangle(src,
            cvPoint(minlocation.x, minlocationc.y),
            cvPoint(minlocation.x + template->width, minlocationc.y + template->height),
            CV_RGB(255, 0, 0), 1, 0, 0 );

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++) {
    for (j = rect.x; j < (rect.x + rect.width); j++) {
        ((uchar*)(img->imageData + i * img->widthStep))[j*3] = 0;
        ((uchar*)(img->imageData + i * img->widthStep))[j*3+1] = 0;
        ((uchar*)(img->imageData + i * img->widthStep))[j*3+2] = 0;
    }
}

cvResetImageROI(img);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多