基于meanshift的视频跟踪

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于mean-shift的视频跟踪
11720787 康晨概述
目标跟踪是计算机视觉和图像处理中的一个重要问题,目标的直方图具有特征稳定、抗部分遮挡、计算方法简单和计算量小的特点。

因此基于MeanShift的跟踪一般采用直方图对目标进行建模,然后通过相似度度量,最终实现目标的匹配和跟踪。

其中对目标模型和候选模型的描述,以及相似性的判别都大量用到了信号处理的知识。

主要原理及流程
MeanShift算法是通过人机交互的方式对被跟踪目标进行初始化的。

在起始帧,手动确定一个包含所有目标特征的矩形或椭圆,我们称之为被跟踪目标的目标区域,这个目标区域也是核函数作用的区域,区域的大小等于核函数的带宽(或者称“尺度”)。

假定我们在彩色的视频序列图像中跟踪目标,因此,图像像素的值域是RGB颜色空间,按照直方图的方式将RGB颜色空间中的每个子空间R、G或者B空间分成k个相等的区间,将每个区间称为一个bin,构成特征空间,特征空间中的特征值的个数(也就是bin的个数)为3。

m k
人脸特征提取与跟踪对初始帧目标区域内所有的像素点,计算特征空间中每个特征值的概率,我们称为目标模型的描述。

在以后的每帧图像中可能存在目标的候选区域中对特征空间的每个特征值的计算称为候选模型的描述。

一般核函数选择高斯函数。

利用相似性函数度量初始帧目标模型和当前帧的候选模型的相似性,通过求相似性函数最
大得到关于目标的 MeanShift 向量,这个向量即是目标从初始位置向正确位置转移的向量,由于 MeanShift 算法的收敛性,不断迭代计算 MeanShift 向量,在当前帧中,最终目标会收敛到目标的真实位置(一个静止点),从而达到跟踪的目的。

流程图:
目标模型的描述:如目标区域的中心为0x ,假设其中有1{}i i n x =K 个像素,特征值bin 的个数为m 个。

则目标模型的特征值1u m =K 估计的概率密度为:
201(||
)[()]n i u i i x x q c k b x u h
σ=-=-∑P (1.1) 这个表达式是基于核函数的轮廓函数的核密度估计表达式。

式中()k x 为核函数的轮廓函数,由于遮挡或者背景的影响,目标模型中心附近的像素比其它像素更可靠,()k x 对中心的像素给一个大的权值,而远离中心的像素给一个的权值。

函数()k x 中0||||i x x h
-的作用是消除不同大小目标计算时的影响,将椭圆表示的目标归一化为一个单位圆。

()x σ是delta 函数,[()]i b x u σ-总的作用是判断目标区域中像素i x 的颜色值是否属于第u 个bin ,如是其值为1,否则为0,C 是一个标准化的常量系数,使得11
m u u q ==∑
201
1||n i i c x x k h ==-∑P (1.2) 候选模型模型的描述:运动目标在第二帧及以后的每帧中,可能包含
目标的区域称为候选区域,其中心坐标为y ,也是核函数的中心坐标。

该区域中的像素用1{}k
i i n x =K 表示,参照 (1.1)式,对候选区域的描述我们称为目标候选模型,候选模型的特征值1u m =K 的概率密度为
201()||
[()]n i u h i i x x p y c k b x u h
σ=-=-∑P (1.3) 其中201
1||h n i i c x x k h ==-∑P 是标准化常量系数。

相似性函数描述:相似性函数描述目标模型核目标候选之间的相似程度,在理想情况下两模型的概率分布是完全一样的。

这里我们的相似性函数描述为:
1()m
u p y == (1.4)
其值是是0-1,函数值越大,越相似。

在当前帧中不同的候选区域 计算得到的候选模型,使得()p y 最大的候选区域即是在本帧中目标的位置。

C++程序代码
由于代码比较多只写出了其中的主要函数,代码中运用opencv 函数库。

void PlayVideo()
{
float arr[2]={0,180};
float* hranges = arr;
CvCapture* capture = 0;//视频获取函数的一个参数
capture = cvCaptureFromAVI( "1.avi" ); //获取视频的指针
//capture=cvCreateCameraCapture(0);
if( !capture )
{
fprintf(stderr,"Could not initialize capturing...\n");
return;
}
cvNamedWindow( "Tracking Demo", 1 );
cvNamedWindow( "Histogram", 1 );
cvNamedWindow( "Back Project", 1);
cvSetMouseCallback( "Tracking Demo", (CvMouseCallback)on_mouse );//设置鼠标事件的回调函数on_mouse
// Cap_aim(); //在这里设点好初始窗口和捕捉目标
for(;;)
{
IplImage* frame = 0;
int i, bin_w, c;
frame = cvQueryFrame( capture );//从摄像头或者文件中抓取并返回一帧if( !frame )
{ //
g_bIsFinished = true;
break;
}
if( !image )
{
/* allocate all the buffers *///完成初始化
image = cvCreateImage( cvGetSize(frame), 8, 3 );//
image->origin = frame->origin;
hsv = cvCreateImage( cvGetSize(frame), 8, 3 );
hue = cvCreateImage( cvGetSize(frame), 8, 1 );
mask = cvCreateImage( cvGetSize(frame), 8, 1 );
backproject = cvCreateImage( cvGetSize(frame), 8, 1 );
backproject->origin = frame->origin;
hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );//创建一个直方图指针
histimg = cvCreateImage( cvGetSize(frame), 8, 3 );
cvZero( histimg );//给数组赋初值0
}
cvCopy( frame, image, 0 );
cvCvtColor( image, hsv, CV_BGR2HSV );//色彩空间转换
if( track_object )
{
cvInRangeS( hsv, cvScalar(0, 0, 0,0), cvScalar(180, 255, 255, 0),
mask );//检查数组元素是否在两个数量之间
cvSplit( hsv, hue, 0, 0, 0 );//分割多通道数组成几个单通道数组或者:从数组中提取一个通道
if( track_object < 0 )//只有选定窗口后第一次为-1,执行该段画直方图的程序,以后为1,不再重画
{
float max_val = 0.f;
cvSetImageROI( hue, selection );//基于给定的矩形设置感兴趣区域cvSetImageROI( mask, selection );
cvCalcHist( &hue, hist, 0, mask );//计算图像image(s) 单通道的直方图cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );// 发现最大和最小直方块以及它们的位置
cvConvertScale( hist->bins, hist->bins, max_val ? 255. / max_val : 0., 0 );//首先对输入数组的元素进行比例缩放,然后将shift加到比例缩放后得到的各元素上:放大
cvResetImageROI( hue );//释放图像的感兴趣区域
cvResetImageROI( mask );
track_window = selection;//跟踪窗口
track_object = 1;
}
cvCalcBackProject( &hue, backproject, hist );//计算单通道的反向投影
cvAnd( backproject, mask, backproject, 0 );//计算两个数组的每个元素的按位与
cvMeanShift( backproject, track_window,
cvTermCriteria( CV_TERMCRIT_EPS |
CV_TERMCRIT_ITER, 20, 1 ),
&track_comp );//对跟踪窗口track_window进行跟踪,得到移动后的跟踪窗口track_comp中的track_comp.rect
track_window = track_comp.rect;//作为下一个跟踪窗口
CvScalar cc;
cc = cvScalar(255, 0, 0);
cvRectangle( image, cvPoint(track_window.x, track_window.y),
cvPoint(track_window.x+ track_window.width,
track_window.y+ track_window.height),
cc, 2, 8, 0 ); //绘制简单、指定粗细或者带填充的矩形:绘制下一个跟踪窗口
}//
if( select_object && selection.width > 0 && selection.height > 0 )//鼠标按下未起时框里图像的处理
{
cvSetImageROI( image, selection );//基于给定的矩形设置感兴趣区域
cvXorS( image, cvScalarAll(255), image, 0 );//计算数组元素与数量之间的按位异或
cvResetImageROI( image );//释放图像的感兴趣区域
}
cvShowImage( "Tracking Demo", image );
cvShowImage( "Histogram", histimg );
cvShowImage( "Back Project", backproject );
c = cvWaitKey(150);
if( c == 27 ) //
break;
}//for
cvReleaseCapture( &capture );
cvDestroyWindow( "Back Project" );
cvDestroyWindow( "Histogram" );
cvDestroyWindow("Tracking Demo");
}
Meanshift算法的效果图
我们通过图片可以看到第三幅图明显没有达到跟踪,这是因为人脸在视频中消失了,也就是人转了过去。

因此这是meanshift的缺点。

基于这个缺点,我们进行了改进,它不仅以目标模型为参考,我们以候选模型的前一帧图像也作为一个参考,两者各设一个权重。

经过改进后的效果图如图,在第三幅图即使人脸突然消失,也能比较好的跟踪到人脸。

改进后算法的效果图
小结
尽管在图像我们看到了比较好的效果,但是也有比没有改进前很多不好的地方,如当人脸消失一段时间又突然出现,这种情况的话,还是传统的方法比较好一些,因为meanshift是根据第一帧的,而我们的方法是第一帧和前一帧的权值,因此还需要继续改进算法,比如可以在不同情况下使用不同的权值。

参考文献:
[1]章毓晋,图像工程,清华大学出版社,2007
[2]朱胜利,MeanShift及相关算法在视频跟踪中的研究,博士论文,浙江:浙江大学,2006
[3]黎云汉,任梁提取与跟踪,博士论文,浙江:浙江大学,2008
[4]S. Ebadollahi, L. Xie, S.F. Chang and J.R. Smith. Visual event detection usingmulti-dimensional concept dynamics. In IEEE International Conference on Multimedia and Expo, pages 881–884, 2006.。

相关文档
最新文档