新手学习opencv十一:运动目标(前景)检测
原理:视频序列相邻两帧或三帧间采用基于像素的时间差分,通过闭值化来提取出图像中的运动区域。
优点:算法简单、计算量小,无需训练背景,对缓慢变换的光照不是很敏感。
缺点:容易受天气、阴影及杂乱背景干扰,阈值T的选择相当关键,稳定性差。
2.背景差分法
原理:用背景的参数模型来近似背景图像,将当前帧与背景图像进行差分比较实现对运动区域的检测
优点:计算量小,较高的实时性,利用已有帧信息进行背景动态更新
缺点:如何建立对于不同场景的动态变化均具有自适应性的背景模型,减少动态场景变化对运动分割的影响。
3.GMM混合高斯模型
原理:使用K(基本为3到5个)个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型,为图像的每个像素点指定一个初始的均值、标准差以及权重,收集N帧图像利用在线EM算法得到每个像素点的均值、标准差以及权重。从N+1帧开始检测每个点是否属于背景点。
优点:适应光线的变化,对缓慢移动的物体效果也较好。
缺点:计算量大,难于实现实时性。
4.光流法
原理:光流法的主要任务就是计算光流场,即在适当的平滑性约束条件下,根据图像序列的时空梯度估算运动场,通过分析运动场的变化对运动目标和场景进行检测与分割。
通常有基于全局光流场和特征点光流场两种方法。
优点:在比较理想的情况下,它能够检测独立运动的对象,不需要预先知道场景的任何信息,可以很精确地计算出运动物体的速度,并且可用于摄像机运动的情况
缺点:全局光流场计算方法计算量大,噪声、多光源、阴影和遮挡等因素会对光流场分布的计算结果造成严重影响;而且光流法计算复杂,很难实现实时处理
5.Vibe算法
原理:利用单帧视频序列初始化背景模型,对于一个像素点,结合相邻像素点拥有相近像素值的空间分布特性,随机的选择它的邻域点的像素值作为它的模型样本值。背景模型为每个背景点存储一个样本集,然后每个新的像素值和样本集比较判断是否属于背景。
优点:计算量小,易于实时性,抗噪性及目标分割的完整性较好,
缺点:由于可能采用了运动物体的像素初始化样本集,容易引入拖影(Ghost)区域,并且鬼影消除慢
6.还有基于Codebook码本模型的算法和基于稀疏表示的以及深度学习模型的算法
实现了三帧差法、背景差分法、GMM、vibe、及改进的vibe(主要是快速消除ghost区域)。
说明:
三帧差法、背景差分法、GMM用的是Mat,vibe、及改进的vibe用的是IplImage和cvMat
支持单帧抓图和保存所有结果(图片的形式)
vibe算法耗时计算的不准。
代码稳定性有待验证,测试了很多数据,检测结果还是和数据本身有很大关系。视频中出现快速移动、来回移动、风吹、遮挡、下雪等时,检测结果较差。整体而言,vibe算法要好些,但其他方法在特定情况下检测结果也较好。我主要用来检测运动的车辆,检测结果还是可以接受的。改进的vibe(主要是快速消除ghost区域,然后做其他事情)就不贴出来了。
下面可下载的代码,我把改进的vibe算法删除了。
环境:
vs2010opencv2.4.9release下的exe可以直接运行;编译工程需要在windows下配置opencv,见:新手学习opencv二:安装详细说明
以下是改进vibe检测效果。
三帧差法:
背景差分:
GMM:(GMM也需要设置好参数)
Vibe: