无论是在图片显示中或者是在光流法寻找角点的过程中,我们都会遇到ROI这个东西。它的作用就是让我们能够专注于图像或者当前视频帧中的某一块区域(我们称之为感兴趣区域) 进行处理,而不是对整个图像或者是整个视频帧进行处理,这不仅能够排除掉一些不必要的误差干扰,还能减少运算量。接下来分别说明来图像和光流法视频中如何设置ROI.
代码如下:
/*
* Description : setting ROI in image
* Author : Liulongpo
* Date : 2015年3月8日19:50:26
*
*/
#include <cv.h>
#include <highgui.h>
using namespace std;
int main (int argc, char **argv)
{
// 加载原图像
IplImage* img = cvLoadImage("F://12.jpg");
// 创建新的要显示感兴趣区域的图像
IplImage* img2 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
// 创建感兴趣ROI矩形区域
CvRect rect = cvRect(100,100,500,500);
cvCopy(img,img2);
cvSetImageROI(img2,rect);
cvNamedWindow("源图像",1);
cvShowImage("源图像",img);
cvNamedWindow("ROI图像",1);
cvShowImage("ROI图像",img2);
while(1)
{
if(cvWaitKey(100) == 27)
break;
}
cvDestroyWindow("源图像");
cvDestroyWindow("ROI图像");
cvReleaseImage(&img);
cvReleaseImage(&img2);
}
显示效果如下图:
左边的是原来的图像,右边是设置ROI区域显示的图像
接下来说说光流法中如何设置ROI区域,这个对于运用光流法进行运动物体检测跟踪的去噪有着非常重要的作用。
看代码:
/*
* Description : Tracking Moving object based on optical flow
* Author : Liulongpo
* Date : 2015年3月8日19:50:26
*
*/
...
// 设置感兴趣的区域,过滤掉不相关的部分
// 感兴趣区域为 左上角坐标(700,0) 宽度为900,高度为2000的矩形
CvRect rect= cvRect(700,0,900,2000);
IplImage *ImageROI = cvCreateImage(cvGetSize(cvQueryFrame(capture)),IPL_DEPTH_8U,1);
// 初始化图像,图像矩阵的所有值都为0
cvZero(ImageROI);
// 设置图像的感兴趣区域
cvSetImageROI(ImageROI, rect);
// 这句是必须的,否则无法画出角点
cvSet(ImageROI,cvScalar(255));
// 释放图像image中被设定的感兴趣区域ROI,与cvSetImageROI相对应
cvResetImageROI(ImageROI);
...
// 光流检测
cvGoodFeaturesToTrack (src_img1, eig_img, temp_img, g_corners1, &corner_count, qLevel, minDist, ImageROI);
效果如下:
这是运用ROI去除不关注部分后的光流法跟踪效果。
第二幅图就是我们感兴趣的区域矩形,这里的截图是当视频源出现抖动时,描绘出来的角点,只是为了看出ROI局域而截图。
原文:http://blog.csdn.net/llp1992/article/details/44136245