本文共 1392 字,大约阅读时间需要 4 分钟。
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.
2.
3.
4.
5.
6.
7.