Opencv中的ROI介绍
2016-02-29 14:03
393 查看
转载地址:http://blog.sina.com.cn/s/blog_6631dd8a01019jmt.html
ROI(Region
of 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区域进行模板匹配运算。
例子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);
ROI(Region
of 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区域进行模板匹配运算。
例子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);
相关文章推荐
- ftok()函数深度解析
- 拿webshell权限方法(一)
- 利用XShell上传、下载文件(使用sz与rz命令),超实用!
- zabbix自定义ITEMS,提示not supported
- Hadoop技巧(01):插件,终端权限
- 【转】Linux 下修改Tomcat使用的JVM内存大小
- 类型:linux;问题:linux命令;结果:Linux常用命令大全
- OpenCV进行图像相似度对比的几种办法
- [Linux]Linux下如何查看有多少文件夹,多少子目录
- 搭建分布式Hadoop2.6.0和Spark1.6.0集群
- Linux——为CentOS 7添加Windows引导程序
- nginx反向代理--upstream模块
- cookielib和urllib2模块相结合模拟网站登录
- openGL的初始化设置
- C/S和B/S架构的概念、优缺点、应用以及区别
- Tomcat中session的管理机制
- Linux下用命令格式化U盘
- 点滴记录——Centos 6.5 yum安装Ganglia
- centos 命令大全
- 《Linux总线、设备与驱动》USBHID设备驱动