一、mean-shift 算法
mean-shift 算法是一种在一组数据的密布分布中寻找局部极值的稳定的方法。若分布是连续的,处理过程就是比较容易,这种情况下本质上只需要对数据的密度直方图应用爬山算法即可。但是,对于离散的数据集,这个问题在某种程度上是比较麻烦的。
mean-shift 算法的步骤如下:
(1)选择搜索窗口。包括窗口的初始位置、窗口的类型、窗口的形状、窗口的大小
(2)计算窗口的重心(可能是带权重的)
(3)将窗口的中心设置在计算出的重心处。
(4)返回第(2)步,直到窗口的位置不再变化。
mean-shift 算法只估计数据分布的梯度(变化的方向)。若变化为0的地方则表示是这个分布的峰值(虽然可能是局部的)。当然在附近或其他尺度上可能还有峰值。mean-shift 矢量告诉我们如何将mean-shift 窗口的中心重新移动到由计算得出的此窗口的重心的位置。窗口的移动造成了窗口内容的改变,于是我们又重复刚才的重新定位窗口中心的步骤。窗口中心重定位的过程通常会收敛到mean-shift 矢量为0。收敛的位置在窗口中像素分布的局部最大值处。
二、CamShift 算法
CamShift 算法:与mean-shift不同的是,CamShift 搜索窗口会自我调整尺寸。如果有一个易于分割的分布(例如保持紧密的人脸特征),此算法可以根据人在走近或远离摄像机时脸的尺寸而自动调整窗口的尺寸。
三、相关函数
1、在反向投影图中发现目标中心
int cvMeanShift(const CvArr* prob_image, CvRect window, CvTermCriteria criteria, CvConnectedComp* comp );
prob_image
目标直方图的反向投影(见 cvCalcBackProject).
window
初始搜索窗口
criteria
确定窗口搜索停止的准则
comp
生成的结构,包含收敛的搜索窗口坐标 (comp->rect 字段) 与窗口内部所有象素点的和 (comp->area 字段).
函数 cvMeanShift 在给定反向投影和初始搜索窗口位置的情况下,用迭代方法寻找目标中心。当搜索窗口中心的移动小于某个给定值时或者函数已经达到最大迭代次数时停止迭代。 函数返回迭代次数。
函数cvMeanShift( )使用的是矩形窗口的mean-shift算法,但同样可以用于跟踪。在这种情况下,需要首先选择代表物体的特征分布(例如,颜色+纹理),然后在物体的特征分布上开始mean-shift窗口搜索,最后计算下一帧视频中所选择的特征的分布。从当前的窗口位置开始,mean-shift算法寻找特征分布的新的峰值或者mode,它们设置在最初产生颜色和纹理的物体中心。
2、发现目标中心,尺寸和方向
int cvCamShift( const CvArr* prob_image, CvRect window, CvTermCriteria criteria,
CvConnectedComp* comp, CvBox2D* box=NULL );
prob_image
目标直方图的反向投影 (见 cvCalcBackProject).
window
初始搜索窗口
criteria
确定窗口搜索停止的准则
comp
生成的结构,包含收敛的搜索窗口坐标 (comp->rect 字段) 与窗口内部所有象素点的和 (comp->area 字段).
box
目标的带边界盒子。如果非 NULL, 则包含目标的尺寸和方向。
函数 cvCamShift 实现了 CAMSHIFT 目标跟踪算法。首先它调用函数 cvMeanShift 寻找目标中心,然后计算目标尺寸和方向。最后返回函数 cvMeanShift 中的迭代次数。 CvCamShiftTracker 类在 cv.hpp 中被声明,函数实现了彩色目标的跟踪。