camshift:
Continuously Adaptive Mean Shift algorithm的简称。基于MeanSift的改进算法,可以跟踪视频中尺寸可能产生变化的目标。
Meanshift只估计数据分布的梯度(变化的方向)。若梯度为0的地方则表示是这个分布的峰值。
重心:一阶矩与零阶矩的比值。
移动窗口到此重心的位置。由于窗口的移动,窗口的内容也将改变,于是又将重复刚才重新定位窗口中心的步骤。窗口中心重定位的过程通常会收敛到Meanshift矢量为0,也就是窗口不能再移动。收敛的位置为窗口像素的局部最大值处。
将Meanshift算法扩展到连续图像序列,就是Camshift算法,它将视频的所有帧都做Meanshift运算,并将上一帧的结果,即搜索窗的大小和中心,作为下一帧meanshift算法搜索窗的初始值,如此迭代下去,就可以实现对目标的跟踪。
根据概率分布图计算下一帧跟踪框的大小。2D直方图的概率分布图可由二阶矩得到,跟踪框的旋转角和大小也可相应得到。
基于OpenCV的Camshift算法的步骤如下:
(1)初始化搜索框;
(2)将图像由RGB颜色空间转换到hsv颜色空间;
(3)从hsv图像中分离处h通道的图像;
(4)用手势分割得到的掩模板(mask)分割出h通道图像的手势区域
(5)对h通道的图像建立直方图
(6)对h的直方图作反向投影图
(7)利用Meanshift算法在反向投影图中迭代搜索,直到其收敛或达到最大迭代次数。并保存零次矩;
(8)利用第(7)步得到的搜索框的中心位置和窗口尺寸信息作为初始值,返回到第(2)步,重新计算,即进入下一帧的目标跟踪。
直方图:条形图。比如颜色可以取值0~255,把这256个值分组,分成16组,则1~16的数值有多少个,直方图的y坐标值就是几,得到条形图。
反向投影图:位置(0,0)上的像素值为0,对应的bin为[0,3),有4个元素,所以反向直方图在该位置上的值这个bin的值4,在直方图中值较多的地方,反向投影图中该位置的值较大,在图像中该位置权重就比较大,离重心近。
catmull曲线插值:
第一、二帧,直接更新坐标值。
第三帧,根据前两帧的光标位置,用第一帧的光标位置作为P1控制点,第二帧的光标位置作为P3控制点,第三帧的光标位置作为P4控制点,即可利用P1P1P3P4四个控制点得到P1P3间的插值曲线。
第四帧以后,将前三帧的光标位置和当前帧的光标位置作为四个控制点P1P2P3P4,计算P2P3之间的Catmull曲线。
对最后三帧,可将前两帧的光标位置分别作为P1P2控制点,最后一帧的光标位置作为P4控制点,可根据P1P2P4P4控制点得到P2P4之间的Catmull曲线。