/ParticleFilter

粒子滤波算法实现

Primary LanguageC++

ParticleFilter

粒子滤波算法实现 代码来源:http://www.cvvision.cn/2465.html blog内容: 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:cvvision 链接:http://www.cvvision.cn/2465.html 来源:CV视觉网

本文通过opencv实现了一种目标跟踪算法——粒子滤波算法,算法的**来源于文献[1][2],且在其**上稍 微做了些修改。其大概过程是:首先手动用鼠标框出一个目标区域,计算其直方图特征值作为模板,然后在该目标中心周围撒粒子,根据所撒粒子为中心的矩形框内 计算其直方图特征,并与目标相比较,最后根据比较出的结果重复上面过程,即重采样的方法撒粒子,粒子扩散,状态观察,目标预测。最后通过实验证明,取得了 较好的效果。

关键字:目标跟踪,粒子滤波,opencv

      前言

目标跟踪过程分为2部分,即目标特征提取和目标跟踪算法。

其中目标特征提取又包括以下几种:1. 各种色彩空间直方图,利用色彩空间的直方图分布作为目标跟踪的特征,可以减少物体远近距离的影响,因为其颜色分布大致相同。2.轮廓特征,提取目标的轮廓 特征,可以加快算法的速度,且可以在目标有小部分影响的情况下同样有效果。3. 纹理特征,如果被跟踪目标是有纹理的,则根据其纹理特征来跟踪效果会有所改善。

目标跟踪算法目前大概分为以下4种:1. 基于meanshift算法,即利用meanshift算法可以快速找到领域目标最相似的地方,效果还不错,但是其只能找到局部最大值,且不能解决遮挡问 题以及不能自适应跟踪目标的形状,方向等。其后面有学者对其做了改进,比如说camshift,就可以自适应物体的大小,方向,具有较好的跟踪效果。2. Kalman滤波的**,该**是利用物体的运动模型来,即服从高斯模型,来对目标状态进行预测,然后与观察模型进行比较,根据2者之间的误差来寻找运动 目标的状态,但是该算法的精度不高,因为其高斯运动模型在现实生活中很多条件下并得不到满足,并且该算法对杂乱的背景也很敏感。3. 基于粒子滤波的**,每次通过实验可以重采样粒子的分布,根据该分布对粒子进行扩散,然后通过扩散的结果来观察目标的状态,最后更新目标的状态。该算法最 大的特点是跟踪速度快,且能解决一部分遮挡问题,在实际应用过程中越来越多。4.基于目标建模的方法。该方法具有一定的针对性,需要提前知道所需跟踪的目 标是什么,比如说车辆,人脸,行人等。由于已经知道了跟踪目标,所以必须对目标进行建模,然后利用该模型来进行跟踪。该方法的局限性是必须提前知道所跟踪 的目标是什么,因而其推广性比较差。

本文通过学习文献[1],初步从理论上了解了粒子滤波的几个步骤,然后参考文献[2]中基于颜色直方图的跟踪算法,自己实现了一个粒子滤波目标跟踪器。本文实现的算法只能进行单目标跟踪,后面有学者将粒子滤波的**扩展到多目标跟踪,比如说文献[3].

            实现过程

 

1. 在摄像头采集到的视频序列中手动标注一个目标区域,用矩形框表示,并计算该目标区域内的直方图,作为匹配模板。

2. 在选中的目标区域中心处撒预定值为100的粒子数目,并对这100个粒子的结构体都初始化为同样的值,比如说粒子位置为目标区域中心,粒子矩形长宽为目标矩形长宽,粒子的初始尺寸为1.等等。

其粒子的结构体和注释如下:

/定义粒子结构体/

typedef struct particle

{

   int orix,oriy;//原始粒子坐标

   int x,y;//当前粒子的坐标

   double scale;//当前粒子窗口的尺寸

   int prex,prey;//上一帧粒子的坐标

   double prescale;//上一帧粒子窗口的尺寸

   Rect rect;//当前粒子矩形窗口

   Mat hist;//当前粒子窗口直方图特征

   double weight;//当前粒子权值

}PARTICLE;

3. 利用二阶动态模型对这100个粒子进行随机扩散,每个粒子根据二阶随机动态模型扩散到一个新的位置。

4. 计算以新位置处每个粒子为中心的矩形框内图像的直方图特征,然后每个特征都与目标模板直方图进行比较,计算其相似度。

5. 根据计算得到的相似度算出每个粒子的权值,即相似度伟大的权值越大,并且对权值进行归一化。

6. 取最大权值处的粒子中心为跟踪目标中心,并根据粒子结构体中的尺寸成员算出目标的矩形框。

7. 根据上一个状态的粒子分布情况,按照其权值乘以粒子总数100进行重采用,即权值大的粒子其采样得到的粒子数也大。这样可以重采用重新得到100个粒子。

8. 根据这100个粒子的情况,重新进入步骤3进行循环,经过对粒子权值分布的重采样,根据二阶随机运动模型进行粒子扩散,根据直方图的巴氏距离推断粒子权值,然后取权值最大的那个作为目标,如此循环。