opncv中的ROI介绍

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

        

        如上图所示,就是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区域进行模板匹配运算。
        
例子4ROI区域像素值的访问
        
可以想把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);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值