realkate1

导航

【opencv学习笔记】SetImageROI函数设置ROI区域的作用及用法

 虽然先前知道ROI区域是感兴趣区域,但是真正看到调用了OpenCV的cvSetImageROI函数时,并不知道它的作用,所以还是单独写了一段代码对这个函数进行探究。

 

OpenCVchm文档中对cvSetImageROI函数的介绍如下:

void cvSetImageROI( IplImage* image, CvRect rect );
image 
图像. 
rect 
ROI 矩形. 
函数 cvSetImageROI 基于给定的矩形设置图像的 ROI(感兴趣区域) . 如果ROI是NULL 并且参数RECT的值不等于整个图像, ROI被分配. 不像 COI, 大多数的 OpenCV 函数支持 ROI 并且处理它就像它是一个分离的图像 (例如, 所有的像素坐标从ROI的左上角或左下角(基于图像的结构)计算。 

测试代码:

 

[cpp] view plain copy
 
  1. #include<cv.h>  
  2. #include<cxcore.h>  
  3. #include<highgui.h>  
  4. void main()  
  5. {  
  6.     IplImage *res,*dst;  
  7.     CvRect rect;  
  8.     rect.x=130,rect.y=30,rect.width=200,rect.height=200;  
  9.     res=cvLoadImage("C:/Users/lufee/Pictures/cat.jpg");//载入一张图片  
  10.     dst=cvCreateImage(cvSize(200,200),8,3);//创建图像空间  
  11.   
  12.     //创建窗口  
  13.     cvNamedWindow("res",CV_WINDOW_AUTOSIZE);  
  14.     cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);  
  15.   
  16.     //设置ROI区域  
  17.     cvSetImageROI(res,rect);  
  18.   
  19.     //提取ROI  
  20.     cvCopy(res,dst);  
  21.   
  22.     //取消设置  
  23.     cvResetImageROI(res);  
  24.   
  25.     //显示图像  
  26.     cvShowImage("res",res);  
  27.     cvShowImage("dst",dst);  
  28.     cvWaitKey(0);  
  29.   
  30.     cvDestroyWindow("res");  
  31.     cvDestroyWindow("dst");  
  32.   
  33.     cvReleaseImage(&res);  
  34.     cvReleaseImage(&dst);  
  35.   
  36.   
  37.   
  38. }  

 

 

运行结果(res为原图,dst为提取的ROI区域):


 

个人总结:

   在对某IplImage图像用cvSetImageROI函数设置了ROI后,对图像的处理都将仅限于ROI区域,相当于该图像变为了ROI中的图像,测试代码值仅用cvCopy(复制图像的函数),进行了测试,实际上对于任何处理图像IplImage类型的函数,处理设置了ROI区域的图像类对象,都是处理它的ROI区域。

 

如果ROI为NULL并且参数rect的值不等于整个图像,则ROI被分配。大多数OpenCV函数都支持ROI,并将它作为一个独立图像进行处理,所有像素坐标都是从ROI的左上角或者左下角(基于图像结构)开始计算的。
比如:
IplImage *img1=cvLoadImage("1.jpg");
cvSetImageROI(img1,cvRect(100,100,356,156));//设置img1的ROI区域
之后显示img1图像是只显示ROI标识的一部分,即改变了指针img1,但是它仍旧保留有原来图像的信息,在执行这一句cvResetImageROI(img1);之后,img1指示原来的图像信息。执行下面的例子即可明了显示。

posted on 2016-03-03 16:31  realkate1  阅读(12728)  评论(0编辑  收藏  举报