mean shift tracking

来源:互联网 发布:mac os 病毒查杀 编辑:程序博客网 时间:2024/05/22 06:30

meanshift均值漂移算法目标跟踪中的经典之经典,在opencv中已经帮我们实现了这个算法,即如下函数

        //! updates the object tracking window using meanshift algorithm

        int meanShift( InputArray probImage, CV_OUT CV_IN_OUT Rect& window, TermCriteria criteria );

其中,参数1:probImage: probImage是概率分布图(反向投影图)

        参数2:window: 需要跟新的窗口(x,y,width,height)

其实说白了,我们希望利用meanshift算法迭代找到probImage图(概率分布图)的重心位置(通过更新window来体现)。

利用meanshift做跟踪的大致步骤:

        (1) 计算目标区域的直方图:首先需要框定想要跟踪的目标(如手掌),确定目标有很多种方式,如可以人工通过鼠标选定,或者通过检测算法(如adboost手掌分类器)进行检测从而框定目标区域,之后,计算框定的目标区域的直方图(概率分布图)

        (2) 计算新帧的反向投影图:接着,对于新来的一帧图像,基于步骤(1)中得到直方图,求得新视频帧的反向投影图(概率分布图),这是因为反向投影图(概率图)中值最大的地方可能就是目标区域所在的地方(每一个像素点每一个像素点表示该点为目标区域的概率。这个点越亮,该点属于物体的概率越大),这也解释了为什么meanshift可以用来做跟踪,且需要输入图像是图像的反向投影图的原因了

        (3) 利用meanshift算法对步骤(2)中得到的反向投影图(概率分布图)进行迭代搜索(对图进行搜索),找到反向投影图的重心位置(即目标所在区域)

由上面可以看出,meanshift算法本质上的确是一个最优化理论中的求最优值得算法。它相当于最速下降法。即沿着梯度下降方法寻找目标函数的极值。在跟踪时,就是为了寻找到相似度值最大的候选目标位置。meanshift方法沿着概率密度的梯度方向(概率分布图)进行迭代移动,最终达到密度分布的最值位置。其迭代过程本质上是的最速下降法,下降方向为一阶梯度方向,步长为固定值。

meanshift跟踪时的代码大概为:

1.计算目标区域的直方图hist

calcHist(&roi, 1, 0, maskroi, hist, 1, &hue_Bins, &ranges);

2.计算新帧(待跟踪的帧)的反向投影(概率图)

calcBackProject(&hue, 1, 0, hist, backProject, &ranges, 1.0, true)

backProject &= mask

3.利用meanshift算法迭代寻找backProject的重心位置(其实是在trackWind和backProject交集的窗口上寻找backProject的重心位置)

meanShift(handProMap,trackWind, TermCriteria( CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 10, 1 ));


下面是理论的部分,通过一个图来看看meanshift的迭代过程。


图1


图2


图3


参考文献:

1.Meanshift,聚类算法

2.基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)

3.反向投影图

4.meanshift算法概述

5.CamShift算法,OpenCV实现1--Back Projection

6.CamShift算法,OpenCV实现2-Mean Shift算法

7.CamShift算法,OpenCV实现(3):CamShift算法

0 0
原创粉丝点击