meanshift跟踪算法原理及代码

来源:互联网 发布:c语言开发从入门到精通 编辑:程序博客网 时间:2024/05/02 02:20

【致谢】http://blog.csdn.net/luckydongbin/article/details/1534192

用meshift算法可以实时实现物体的跟踪,但是该方法因为基于颜色直方图因此对于颜色变化敏感,而且该法搜索窗口规定,同时不能实现较大幅度的跟踪,克服这个问题可以参考Camshift,opencv有实例。meanshift适用于单张图像。camshift适用于连续图像。

///cvmeanshift函数的使用
///cvMeanShift实质已简化为计算图像像素分布的重心。
///cvMeanShift用于跟踪还需要选择代表物体特征的分布,确定物体特征,在每一帧上根据特征分布寻找收敛点。
#include <stdlib.h>
#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <math.h>


//using namespace std;
//using namespace cv;




void main()
{
char image_name[100];//存储打开文件名称
uchar* m_b = NULL;
IplImage* img = 0;
CvConnectedComp  my_mp;

int win_width = 50;//初始搜索窗口

sprintf(image_name, "%s%s", "E:\\cvMeanShift\\lena",".bmp");
img = cvLoadImage(image_name);//打开图片
IplImage* img_shift = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1);
IplImage* pic = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 3);
cvCvtColor(img, img_shift, CV_BGR2GRAY);//必须是单通道图片才可以

cvNamedWindow( "mainWin");//创建窗口


cvMeanShift(img_shift, cvRect(50,80,win_width,win_width),cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 1000, 0.1), &my_mp);//img_shift:单通道图像;cvRect:初始窗口;1000指迭代次数,0.1指的是迭代条件  cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 1000, 0.1)  满足次数1000或者精度0.1停止迭代。
    ///my_mp是返回值,里面存储结果,其中my_mp->rect是收敛后窗口位置,my_mp->area是最终窗口中所有像素点的和。
    ///cvMeanShift实质已简化为计算图像像素分布的重心。
CV_IMAGE_ELEM(img_shift, uchar, my_mp.rect.y+win_width/2, my_mp.rect.x+win_width/2) = 255;//提取某点象素值;把最后的收敛窗口标出来,一个纯白的亮点 

printf("收敛点已经标注为白色亮点\n");

cvCvtColor(img_shift, pic, CV_GRAY2BGR);

cvSaveImage("E:\\cvMeanShift\\lena_after_mean.bmp", pic);
cvShowImage("mainWin", img_shift);

cvWaitKey(0);

cvDestroyWindow("mainWin");
cvReleaseImage(&img);

cvReleaseImage(&img_shift);
cvReleaseImage(&pic);
}


【以下转自】http://blog.csdn.net/luckydongbin/article/details/1534192

  meanshift是由Comaniciu最先提出来,是用于跟踪非刚性物体的一种算法。本的介绍也是源自Comaniciu的文章。下面是文章的一些基本信息:

Title:Kernel-Based Object Tracking

Authors:Dorin Comaniciu, Senior Member, IEEE, Visvanathan Ramesh, Member, IEEE, and Peter Meer, Senior Member, IEEE

Publication:IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 25, NO. 5, MAY 2003.pp564-577.

        同时,由于公式不容易直接粘贴过来,读者如有兴趣或疑问,请参考原文。另外,这里只介绍主要算法。

       为了表征目标,首先需要选择一个特征空间。参考目标,用在特征空间中概率密度函数q表示,例如参考模型可以选择目标的颜色概率密度函数。不失一般性,目标模型可以认为中心处于其所在空间的中心。在下一帧候选目标被定义为在位置y,用概率密度函数p(y)来表示。为了满足实时性的要求,它们分别用非参数的方法中的直方图统计^q和^p(y)表示。

        目标和候选直方图之间的相似度函数记作公式(1),相似度的局部最大意味着在候选模型与目标模型匹配。如果仅考虑颜色信息,候选区域的相似度变化会很大,匹
配效果不好。为了得到一个连续性的相似度函数,在空间域内,用一个核函数对目标
区域做滤波处理。

         目标模型中的特征概率可以用等式(2)来计算,其中表示归一化的像素位置,k(x)是一个凸的单调递减的核函数,它为距离中心远的像素分配小的权值,距离中心近的像素分配大的权值,b表示位置直方图索引,C为归一化常数。同理,对于目标候选模型也是用同样的k(x),但是带有带宽h,特征概率可以用等式(4)来计算。相似度函数定义了目标模型和候选模型的距离,  ^p和^q 的相似度函数用Bhattacharyya系数表示,公式(8,9)。

       在当前帧中,目标模型的匹配位置就是等式(9)中第二项的最大值。可以看出,在当前帧下,等式(9)的第二项用y位置核截面用k(x)的计算的概率密度和权重w表示。在邻域内,可以应用Meanshift过程找到最大的模式。在这个过程中,核通过等式(11) 从当前位置^y0移动到新的位置^y1。如此,循环迭代实现目标的跟踪。


原创粉丝点击