提到 目标跟踪(Object Tracking),很多专业人士都不陌生,它是计算机视觉里面 用于视频分析的一个很大的分类,就像目标检测一样,是视频分析算法的底层支撑。
目标跟踪的算法有很多,像 Mean-Shift、光流法、粒子滤波、卡尔曼滤波等 传统方法,也有 TLD、CT、Struct、KCF 等掺杂了某些 “外力”,不那么纯粹的方法。但不管怎样,Tracking这项工作有着很大的研究群体,也不乏有人为之奋斗终生!
• CamShift
CamShift 是 连续自适应的Mean-Shift算法(Continuously Adaptive Mean-SHIFT),作为入门级的目标跟踪,包括两部分:
1. 对视频中的每一帧做 Mean-Shift;
2. 将上一帧的 Mean-Shift 结果 作为下一帧的输入,反复迭代;
算法步骤非常简单,问题可以演化为: Mean-Shift 是什么?其输入输出又是什么?
Mean-Shift 就是大名鼎鼎的 均值漂移,这里面有两层含义:
1)均值
空间R中有N个样本点,任选一点x0,假定有k个点落在x的邻域范围(半径h)内,那么MeanShift向量可以定义为:
其中Sk是一个半径为h的高维球区域,满足公式:
说的再通俗一点,分两步:
A) 任选空间内的一点x0,以该点为圆心做一个半径h的球(可能扩展到高维),统计球内的所有点,为x0的邻域点;
B) 圆心到邻域点连线作为向量,所有向量和求均值,即得到 Mean-Shift 向量。
通过均值计算,我们得到一个(x0, x'0)的向量,如图橘色箭头。
2)漂移
将圆心 x0 移动到 Mean-Shift 向量 的终点 x'0 ,就是 漂移(比平移好听)。以x'0 为新的中心,重复上面的过程,迭代计算,直到收敛。
Mean-Shift 这种特征使得其在 目标跟踪、聚类、图像平滑等问题上都有应用。
核心思想是 利用概率密度的梯度爬升 来寻找局部最优。输入一个图像的区域范围,逐步迭代,对应区域朝 质心(重心)漂移。
概率密度函数 与 反向投影
事实上,我们需要将 待跟踪的目标 ROI进行提取 直方图,计算输入图像对应直方图的 反向投影,得到输入图像在已知目标颜色直方图的条件下的颜色概率密度分布图,包含了目标在当前帧中的相干信息。
对于目标区域内的像素,可得到该像素属于目标像素的概率,而对于非目标区域内的像素,该概率为0。
参考下面代码进行理解:
/* linolzhang 2013.11
CamShift跟踪
*/
#include "opencv/cv.h"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/highgui/highgui.hpp"
#pragma comment(lib,"opencv_core24