查看文章 |
基于openCV,MFC。运用背景差分实现运动检测、运用camshift算法实现目标跟踪。以下是做这个程序时的一些学习笔记(记录的东西并不都是我程序里的东西),以时间顺序排列,分割线代表不同阶段。 实验: 选择背景场景中不包含运动部分、光线保持不变的视频做运动检测和跟踪 用平均背景法建立背景 形态学处理 Camshift跟踪 平均背景法 计算每个像素的平均值和标准差作为背景模型 累积元素的浮点图像IavgF 累积每帧图像之间的绝对差 计算平均原始图像和绝对差分图像 设定高低阙值(原始图像平均+(6~7)*绝对差分图像)之间的为背景之外的为前景 用于背景场景中不包含运动部分要求光线保持不变 (将物体的像素值平均涂抹到整个视频区域,冲淡它的像素对整个视频区域(背景)的影响,再用阙值分割的方法将这种影响消除。那么可以想象如果视频区域越大(另一方面是物体像素越小),冲淡效果越好;物体在视频区域停留时间越短,冲淡效果越好??) Codebook背景模型 得到每个像素或一组像素的时间序列模型 能解决像素剧烈变化问题 跟踪 经典的跟踪不明物体的方法是跟踪视觉上的重要的关键点,并不是整个物体。 寻找角点 被选择的点或特征应该是独一无二的。如果一个点在两个正交方向上都有明显的导数,则我们认为此点更倾向是独一无二的。角点是一类含有足够信息且能从当前帧和下一帧中都能提取出来的点。 SIFT(scale-invariant feature transform)缩放不变 光流 稠密光流(将图像中的每个像素都与速度关联,计算量大) 稀疏光流(指点具有明显特征的一组点) 金字塔LK:从图像的金字塔的最高层(细节最少)开始想金字塔低层(丰富细节)进行跟踪。 Mean-shift:在一组数据的密度分布中寻找局部极值的稳定的方法 1. 选择搜索窗口 2. 计算窗口的重心 3. 将窗口中心设置在计算出的重心处 4. 返回(2),直到窗口位置不再变化(小于一定阙值) Camshift(Continuously Apaptive Mean-SHIFT):建立在mean-shift之上,可以跟踪视频中尺寸产生变化的目标。 基本思想是视频图像的所有帧作MeanShift运算,并将上一帧的结果(即Search Window的中心和大小)作为下一帧MeanShift算法的Search Window的初始值,如此迭代下去,就可以实现对目标的跟踪 //----------------------------------------------------分割线------------------------------------------------- Camshift 由于RGB 色彩空间对光照亮度变化比较敏感,为了减少光照亮度变化对跟踪效果的影响, CamShift 算法要求将图像由RGB 色彩空间转换为HSV 色彩空间后进行处理 MeanShift算法缺乏必要的模型更新,其固定不变的核函数窗宽影响了跟踪的准确性,在目标存在明显尺度变化时,会导致尺度定位不准确,甚至造成目标的丢失 ,CamShift算法能够自动调节窗口大小以适应被跟踪目标在图像中的大小,然而该算法也有不足之处,在大面积颜色干扰情况下,该算法不能实现有效的跟踪 MeanShift是为了静态的概率分布而设计的算法,而CamShift是为了动态的概率分布而设计的算法 ,在跟踪过程中,CamShift利用目标的颜色直方图模型得到每帧图像的颜色投影图,并根据上一帧的结果自适应调整搜索窗口的位置和大小,从而使得当前图像中目标的尺寸和中心位置 图显示了MeanShift算法的第一张图像,图中白色方框即为初始搜索框,初始搜索框是预先给定的;(怎样自动设置初始搜索框?) MeanShift在聚类,模态检测,最优化等领域都有广泛的应用。在图像处理领域,MeanShift主要用做图像平滑、图像分割以及物体跟踪。 在实际应用中,如果目标颜色为单一颜色,并且与周围环境有很大区别,则CamShift能够很好的实现查找目标;同时可以在采集到的图像中进行图像滤波,图像高级形态学操作开运算、闭运算等预处理,对处理后的图像进行CamShift可以得到更为理想的效果。 所示的六棱锥模型,在图像亮度值V很低的情况下,对应的S值也很低,整个色度H就会在很小的区域范围内,这样就会导致色度H噪声较多,影响CamShift算法查找目标。因此在实际应用中应选择亮度较高的环境。 选择目标颜色较为一致的目标,并且与周围环境能够明显的区分;(2)选择光照较为理想的环境进行实验。 根据运动检测(背景差分、帧间差分)确定目标被跟踪区域 跟踪算法的分类 基于边缘 基于背景估计 基于运动场估计 基于小区域 基于模板匹配 基于主动轮廓线 跟踪的复杂性在于 三维世界到二维像平面的投影导致信息损失 图像中的噪声 复杂的目标运动 场景光照改变 实时处理要求 跟踪目标特征选择 颜色(使用最广泛,对光照敏感) 边缘(对光照变化不敏感 canny边缘检测) 光流 纹理(对光线变化不敏感) Camshaft跟踪颜色特征,所以即使有被遮挡的时候,也不会丢失跟踪目标? Camshift步骤 【0】怎样自动得到【1】的选择区域,即怎样自动确定跟踪目标 将RGB空间转换为HSV空间,提取H颜色分量hue 【1】得到需要跟踪的区域selection,选取框属性提取 cvCalcHist( &hue, hist, 0, mask ); //得到选择框内的色彩直方图(考虑hue分量的取值范围) 跟踪窗口track_window初始化为selection 【2】根据获得的色彩直方图将原始图像转化成色彩概率分布图像,这个过程就被称作"Back Projection"。 根据目标模板颜色概率分布直方图和原图像的H分量计算图像反向投影图。在处理前,目标图像中的每一个象素的值描述的在这一点的颜色信息,而处理后,图像中每一个象素的值就变成了这个颜色信息出现在此处的可能性的一种离散化的度量,出现的可能性大,象素的值就大,反之则小。 cvCalcBackProject( &hue, backproject, hist );//计算hue的反向投影图 用cvAnd( backproject, mask, backproject, 0 );得到掩模的反向投影 【3】用cvCamShift( backproject, track_window , cvTermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ),&track_comp, );对目标直方图的反向投影backproject进行搜索,返回跟踪结果track_window = track_comp.rect;即为下一帧的跟踪窗口 【4】用cvEllipseBox( image, track_window, CV_RGB(255,0,0), 3, CV_AA, 0 );//画出跟踪结果的位置 返回【1】循环。。。 //----------------------------------------------------分割线------------------------------------------------- 对运动物体的跟踪: 如果背景固定,可用帧差法然后在计算下连通域将面积小的去掉即可 如果背景单一,即你要跟踪的物体颜色和背景色有较大区别可用基于颜色的跟踪如CAMSHIFT鲁棒性都是较好的 如果背景复杂,如背景中有和前景一样的颜色就需要用到一些具有预测性的算法如卡尔曼滤波等可以和CAMSHIFT结合 Camshift编程实现步骤 【1】.手动在程序中设置选择框(x,y),对特定视频进行跟踪,测试程序。 【2】.编写自动获得选择框的程序,可跟踪一个目标 3.实现对多个目标的跟踪,(设定一个阙值,限定出比较明显的几个目标) 现在程序实现到了前2步,1.0版本 源代码下载地址(我初学MFC,程序有问题的地方请指正):http://www.pudn.com/downloads231/sourcecode/graph/detail1088134.html |

