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 包含被跟踪物体的最小矩形 */
转载于:https://blog.51cto.com/3754839/1401696