转载请注明出处!
!!
目标跟踪--CamShift
CamShift全称是ContinuouslyAdaptive Mean Shift,即连续自适应的MeanShift算法。而MeanShift算法,首先得对MeanShift算法有个初步的了解,可以參考这里。而CamShift是在MeanShift的基础上,依据上一帧的结果。来调整下一帧的中心位置和窗体大小,所以。当跟踪的目标在视频中发生变化时,可以对这个变化有一定的调整。
OpenCV自带样例中的camShift算法,能够分为三个部分:(引用自这里 http://blog.csdn.net/carson2005/article/details/7439125)
一、计算色彩投影图(反向投影):
(1)为了降低光照变化对目标跟踪的影响,首先将图像从RGB颜色空间转换到HSV颜色空间。
(2)对H分量进行直方图统计,直方图代表了不同H分量取值出现的概率。或者说能够据此查找出H分量的大小为x时的概率或像素个数。即,得到颜色概率查找表;
(3)将图像中每一个像素的值用其颜色出现的概率进行替换,由此得到颜色概率分布图;
以上三个步骤称之为反向投影,须要提醒的是。颜色概率分布图是一个灰度图像。
二、meanShift寻优
前面提到过meanShift算法(http://blog.csdn.net/carson2005/article/details/7337432)是一种非參数概率密度预计方法,它通过不断迭代计算得到最优搜索窗体的位置和大小。
三、camShift跟踪算法
前面提到,camShift事实上就是在视频序列的每一帧其中都运用meanShift,并将上一帧的meanShift结果作为下一帧的初始值,如此不断循环迭代,就能够实现目标的跟踪了。
在openCV中自带有camShift函数。老看一下实现,代码中有部分解释。(凝视功劳来自http://www.cnblogs.com/tornadomeet/archive/2012/03/15/2398769.html)
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include
#include
using namespace cv;
using namespace std;
Mat image;
bool backprojMode = false; //表示是否要进入反向投影模式。ture表示准备进入反向投影模式
bool selectObject = false;//代表是否在选要跟踪的初始目标,true表示正在用鼠标选择
int trackObject = 0; //代表跟踪目标数目
bool showHist = true;//是否显示直方图
Point origin;//用于保存鼠标选择第一次单击时点的位置
Rect selection;//用于保存鼠标选择的矩形框
int vmin = 10, vmax =256, smin = 30;
void onMouse(int event, int x, int y, int, void*)
{
if (selectObject)//仅仅有当鼠标左键按下去时才有效,然后通过if里面代码就能够确定所选择的矩形区域selection了
{
selection.x = MIN(x, origin.x);