CamShift算法原理
      我们将MeanShift算法扩展到连续图像序列(一般都是指视频图像序列),这样就形成了CamShift算法。CamShift算法的全称是"Continuously Apaptive Mean-SHIFT",它的基本思想是视频图像的所有帧作MeanShift运算,并将上一帧的结果(即Search Window的中心和大小)作为下一帧MeanShift算法的Search Window的初始值,如此迭代下去,就可以实现对目标的跟踪。整个算法的具体步骤分5步:
Step 1:将整个图像设为搜寻区域。
Step 2:初始话Search Window的大小和位置。
Step 3:计算Search Window内的彩色概率分布,此区域的大小比Search Window要稍微大一点。
Step 4:运行MeanShift。获得Search Window新的位置和大小。
Step 5:在下一帧视频图像中,用Step 3获得的值初始化Search Window的位置和大小。跳转到Step 3继续运行。

源码分析如下:

#define CV_INLINE inline//内联函数  /*********************************** CvTermCriteria *************************************/  #define CV_TERMCRIT_ITER    1 #define CV_TERMCRIT_NUMBER  CV_TERMCRIT_ITER #define CV_TERMCRIT_EPS     2  typedef struct CvTermCriteria { 	//类型     int    type;  /* may be combination of                      CV_TERMCRIT_ITER                      CV_TERMCRIT_EPS */     //迭代的最大次数     int    max_iter;     //特定的阈值     double epsilon; }CvTermCriteria;  CV_INLINE  CvTermCriteria  cvTermCriteria( int type, int max_iter, double epsilon ) {     CvTermCriteria t;      t.type = type;     t.max_iter = max_iter;     t.epsilon = (float)epsilon;      return t; }    /****************************************************************************************\ *                                       Tracking                                         * \****************************************************************************************/  /* Implements CAMSHIFT algorithm - determines object position, size and orientation    from the object histogram back project (extension of meanshift) */ CVAPI(int)  cvCamShift( const CvArr* prob_image, CvRect  window,                        CvTermCriteria criteria, CvConnectedComp* comp,                        CvBox2D* box CV_DEFAULT(NULL) ); /* prob_image 色彩概率分布图像 window     search window的初始值 criteria   判断搜索是否停止的一个标准 comp       保存运算结果,包括新的search window的位置和面积 box        包含被跟踪物体的最小矩形 */