基于openCV的动态背景下的运动目标检测
from: /doc/89c6692a222a84b2ced0d502/1
摘要:介绍在动态背景下对视频图像序列进行运动目标的检测,主要包括三个步骤,分别是运动估计,运动补偿和目标检测。在运动估计中采用的主要是基于特征点匹配算法。这种算法与传统的块匹配算法最大的好处在于它的数据量少,计算简单迅速而且图像的匹配可靠性更高。最后用计算机视觉类库openCV进行实现。
关键词:运动目标检测; openCV;特征点匹配
Moving Object Detection in the Dynamic Background Based on openCV Abstract:Introducing a moving object detection algorithm of the dynamic background in the video image sequence,which includes three steps. They are motion estimation, motion compensation and object detection. At the motion estimation, we take an algorithm based on the feature points matching. The advantages of this algorithm is that it needs fewer data and indicates faster calculating speed compared to the block matching algorithm. What’s more, the matching of the video image sequence is more reliable. Then used openCV realized the algorithm.
Keywords: moving object detection; openCV; feature points matching
引言
在生活中摄像头可以说随处可见,我们经常需要对视频中的运动目标进行相关操作,这就设涉及到了对运动目标的检测及跟踪。作为视觉领域的一部分,它不仅对我们的生活,在军事,医学等各种领域里都有着广泛的影响。
所谓运动目标的检测就是在一段序列图像中检测出变化区域,并将运动目标从背景图像中提取出来[2],它是基础,能否正确的检测与分割出运动目标对后续的工作有着巨大的影响。常见的运动目标检测方法有:背景差分法,帧差法,累积差分法,光流法。本文主要介绍的是一种在动态背景下对运动目标进行检测的算法。
检测算法介绍
检测算法有很多种,不同的算法有他们各自的利与弊。背景差分法:是事先将背景图像存储下来,再与观测图像进行差分运算,实现对运动区域的检测。这种方法能得到较为完整的运动目标信息,但背景图像必须随着外部条件比如光照等的变化而不断更新,所以背景模型的获取和更新比较麻烦。帧差法:直接比较相邻两帧图像对应像点的灰度值的不同,然后通过阈值来提取序列图像中的运动区域[2]。这种方法更新速度快,算法简单易实现,适应性强,不需要获取背景图像。但是背景与运动目标间需要有一定程度的灰度差,否则可能在目标内部产生空洞,不能完整的提取出运动目标。为了改进相邻两帧间的差分效果,人们提出了累积差分法。累积差分法是利用三帧图像计算两个差分图像,再令其对应像素相乘的算法。它通过分析整个图像序列的变化来检测小位移或缓慢运动的物体。光流法是在时间上连续的两幅图想中,用向量来表示移动前后的对应点,在适当平滑性约束的条件下,根据图像序列的时空梯度估计运动场,通过分析运动场的变化对运动目标和场景进行检测和分割。
上面的几种算法都是基于静态背景下的方法,下面主要介绍动态背景下运动目标的检测。 因为生活中我们在很多情况下背景图像都不是静态的,有时摄像机都是安装在一个运动的平台上,或者它本身也会在一定范围内进行扫描运动这样一来就会出现图像背景的全局运动,这时就需要做对帧间图像的配准,再经过全局背景的运动补偿就可以通过差分检测检测出目标。
这种通过全局运动估计进行运动目标检测的主要步骤如图1-1所示:
运动估计:运动矢量估计的算法有许多种,这里采用的是特征点匹配算法,也是目前使用较多的一种算法。它的方法是在图像中找到基准图像的每一特征点的唯一匹配点,通过两帧间点位置的变化求出其位移矢量,再将所有运动信息带入运动模型求出背景的全局运动参数。以基准图像的特征点为中心在打匹配图像中使用三步搜索算法进行快速搜索,三步搜索算法的具体三步为[4]:
(1) 以当前特征点为中心,以4(可以更改)为步幅,将各单位正方形上的顶点(共9个点)与当前特征点进行匹配,求出最佳匹配的特征点中心位置。
(2) 以第一步求出的最佳特征点为中心,以2为步幅,将各单位正方形上的顶点(共9个点)与当前特征点进行匹配,求出最佳匹配的特征点中心位置。
(3) 以第二步求出的最佳特征点为中心,以1为步幅,将各单位正方形上的顶点(共9个点)与当前特征点进行匹配,求出最佳匹配的特征点中心位置。
它与当前特征点中心的位置偏移量即为估计的位移量。
在openCV中CvBlob结构是描述的团块位置,大小标识符,我们可以对它进行简单的改写来表示我们需要的特征点。
运动补偿:这一步的主要目的是尽量将由于摄像机的扫描而引起的背景“移动”消除。这里不需要估计所有像素点的运动矢量,在上面特征点匹配的基础上,采用仿射变换模型参数。设t时刻特征点的位置为(X,Y),t+1时刻的坐标为(X’,Y’),若以二维仿射变换描述其运动,则关系可表示为:
X’ d0 X Y’
由上式可知三个不共线的特征点就可以求得唯一解,显然这是不合理的,所以我们采用最小二乘法,用所有已知特征点来求解参数。这样可以减小误差。反向运动补偿后当前的帧图像和参考的帧图像重合这样就可以消除因摄像机扫描晃动而引起的背景移动。
目标检测:将背景图像的稳定序列进行帧差即可获得运动目标区域,完成目标检测。
结合openCV
openCV简介:OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法[1]。
openCV常用函数:
分配图像:IplImage* cvCreateImage(CvSize size, int depth, int channels);
depth为像素深度,channels为每个像素值的通道数
释放图像:void cvRealeaseImage(IplImage**);
读取图像:img=cvLoadImage(filename);//filename为文件的目录名
openCV基础结构:
CvPoint:定义整型坐标上的点
Typedef struct CvPoint{
} Int x; //x坐标 Int y; //y坐标
上文中的矩形表达式主要用的就是CvPoint这个函数。用CvPoint来定义点(X,Y)
CvSize:定义矩形框大小
Typedef struct CvSize{
Int width;
Int height;
}
还有其他基础结构如:CvRect,CvScalar,CvMat,CvArr,IplImage等就不一一介绍了。
首先cvCvtColor函数转换图片至灰度图:灰度化就是将一张三通道RGB颜色的图像变成单通道灰度图,为接下来的图像处理做准备。在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。下图为灰度图:
cvThreshold函数转换为自适应二值图:二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果,二值化的处理强化了锐利的边缘,进一步去除图像中无用的信息,但在使用过程中要注意阈值的选取。可以说二值化是数字图像处理中非常重要的最基础的一步,可以发现我们在做很多项目过程中,第一步往往就是进行二值化处理。
接下来就是进行一系列形态学腐蚀膨胀处理,在阈值分割后,图像中可能还存在一些空洞噪声影响,形态学处理进行进一步去噪等。膨胀腐蚀主要是通过cvDilate和cvErode这两个函数来实现效果,在用openCV结合上面的算法最后处理出的结果如下图:
结论
由此可以看出在openCV环境下用特征点匹配的算法可以对动态背景下的运动目标进行检测。
参考文献:
[1]百度百科
[2]《数字图像处理系统工程导论》 郭宝龙 孙伟 主编 西安电子科技大学出版社
[3]《数字图像处理(应用篇)》 谷口庆治 编 科学出版社共立出版
[4]《数字图像处理与图像通信(修订版)》 朱秀昌 刘峰 胡栋 编 北京邮电大学出版社
[5]《OpenCV教程(基础篇)》 刘瑞祯 于仕琪 编著 北京航空航天大学出版社