ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:679.67KB ,
资源ID:3528637      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3528637.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于MeanShift算法的目标跟踪.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于MeanShift算法的目标跟踪.docx

1、基于MeanShift算法的目标跟踪基于MeanShift算法的目标跟踪1 算法描述1.1 meanshift算法背景meanShift这个概念最早是由Fukunage在1975年提出的,Fukunage等人在一篇关于概率密度梯度函数的估计中提出这一概念。其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。如今,我们说的meanShift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。在很长一段时间内,meanShift算法都没有得到足够的重视,直到1995年另一篇重要论文的发表。该

2、论文的作者Yizong Cheng定义了一族核函数,使得随着样本与被偏移点的距离不同,其偏移量对均值偏移向量的贡献也不同。其次,他还设定了一个权重系数,使得不同样本点的重要性不一样,这大大扩展了meanShift的应用范围。此外,还有研究人员将非刚体的跟踪问题近似为一个meanShift的最优化问题,使得跟踪可以实时进行。目前,利用meanShift进行跟踪已经相当成熟。1.2 meanshift算法原理Meanshift可以应用在很多领域,比如聚类,图像平滑,图像分割,还在目标跟踪领域有重要的应用。Meanshift跟踪算法是通过计算候选目标与目标模板之间相似度的概率密度分布,然后利用概率密

3、度梯度下降的方向来获取匹配搜索的最佳路径,加速运动目标的定位和降低搜索的时间,因此其在目标实时跟踪领域有着很高的应用价值。该算法由于采用了统计特征,因此对噪声具有很好的鲁棒性;由于是一个蛋参数算法,容易作为一个模块和其他算法集成;采用核函数直方图建模,对边缘阻挡、目标的旋转、变形以及背景运动都不敏感;同时该算法构造了一个可以用meanshift算法进行寻优的相似度函数。Meanshift本质上是最陡下降法,因此其求解过程收敛速度快,使得该算法具有很好的实用性。Meanshift算法的思想是利用概率密度的梯度爬升来寻找局部最优。它要做的就是输入一个在图像的范围,然后一直朝着重心迭代,直到满足你的

4、要求或者达到迭代最大次数结束。在opencv中,进行meanshift其实很简单,输入一张图像(imgProb),再输入一个开始迭代的方框(windowIn)和一个迭代条件(criteria),输出的是迭代完成的位置(comp )。这是函数原型: int cvMeanShift( const void* imgProb, CvRect windowIn, CvTermCriteria criteria, CvConnectedComp* comp )参数介绍:imgProb:目标直方图的反向投影windowIn:初试的搜索框Criteria:确定搜索窗口的终止条件Comp:生成的结构,包含收敛

5、的搜索窗口坐标 (comp-rect 字段) 与窗口内部所有像素的和 (comp-area 字段)1.3 meanshift算法跟踪目标实现步骤1.首先从摄像头或者本地文件读入视频2.选择要跟踪的物体,程序读取一帧视频3.计算视频帧的色调直方图4.计算视频帧的反向投影图5.输入反向投影图和跟踪矩形框,调用meanshift算法迭代,寻找局部最优解。根据重心的移动,调整跟踪矩形框6.读取下一帧视频,用当前矩形框作为输入,重复执行步骤2-51.4 meanshift算法实现过程1 在颜色概率分布图中选取搜索窗W2 计算零阶距: 计算一阶距: 计算搜索窗的质心:3 调整搜索窗大小宽度为 长度为1.2

6、s4 移动搜索窗的中心到质心,如果移动距离大于预设的固定阈值,则重复2)3)4),直到搜索窗的中心与质心间的移动距离小于预设的固定阈值,或者循环运算的次数达到某一最大值,停止计算。1.5 meanshift算法跟踪效果使用摄像头跟踪人的肤色效果如图1.5.1所示。图 1.5.1对应于图1.5.1的反向投影图如下图1.5.2所示。图 1.5.2点选区域的像素点直方图如图1.5.3所示。图 1.5.3从以上效果图可以发现,meanshift算法处理的是HSV中的色调分量。换句话说,就是通过追踪相同的颜色,而达到追踪物体的功能。程序首先计算点选框里的有效像素点,通过统计获得像素点分布直方图;然后计算

7、出视频的反向投影图,即是像素点的概率分布图。如上图1.5.2所示,越亮的点就是与原物体越匹配的点,大量的亮点的聚集处就极有可能是需要跟踪的物体;最后用矩形框框住当前帧中带跟踪的物体,如上图1.5.1所示的结果。当被跟踪的物体的色调与背景相似时,跟踪就会失效,如图1.5.4所示。图 1.5.4显然,当背景与被跟踪物体颜色难以区分时跟踪会失败。原因很简单,meanshift算法实现跟踪的原理就是通过计算色调的概率分布达到跟踪的效果,所以待跟踪的物体一定要与背景在色调上有区分度。类似的,本程序也可以通过设置:调试-命令参数,使用本地的视频文件来实现视频中特定物体的跟踪,具体方法如图1.5.5所示。由

8、于实验的效果与使用摄像头跟踪物体差不多,所以就不一一截图显示了。图 1.5.52 程序源码与数据结构#include#include stdafx.h#ifdef _CH_#pragma package #endif#ifndef _EiC#include #include cv.h#include highgui.h#include #endif IplImage *image = 0, *hsv = 0, *hue = 0, *mask = 0, *backproject = 0, *histimg = 0;/用HSV中的Hue分量进行跟踪CvHistogram *hist = 0;/直方

9、图类int backproject_mode = 0;int select_object = 0;int track_object = 0;int show_hist = 1;CvPoint origin;CvRect selection;CvRect track_window;CvBox2D track_box;/Meanshift跟踪算法返回的Box类/typedef struct CvBox2D/CvPoint2D32f center; /* 盒子的中心*/CvSize2D32f size; /* 盒子的长和宽*/float angle; /* 水平轴与第一个边的夹角,用弧度表示*/Cv

10、Box2D;CvConnectedComp track_comp;/连接部件/typedef struct CvConnectedComp/double area; /* 连通域的面积*/float value; /* 分割域的灰度缩放值*/CvRect rect; /* 分割域的ROI */ CvConnectedComp;int hdims = 32;/划分直方图bins的个数,越多越精确float hranges_arr = 0,180;/像素值的范围float* hranges = hranges_arr;/用于初始化CvHistogram类int vmin = 10, vmax =

11、256, smin = 30;/用于设置滑动条int cvmeanshift(const void *imgProb,CvRect windowIn, CvTermCriteria criteria, CvConnectedComp* comp) /实现meanshift算法 CvMoments moments; /CvMoments用来计算矩形的重心,面积等形状特征 int i=0,eps; CvMat stub, *mat=(CvMat*)imgProb; CvMat cur_win; CvRect cur_rect=windowIn; /当前矩形框 CV_FUNCNAME(cvmeans

12、hift); if(comp) /初始化跟踪矩形 comp-rect=windowIn; moments.m00=moments.m01 =moments.m10 =0; /将阶矩和阶矩置 _BEGIN_; CV_CALL(mat=cvGetMat(mat,&stub); if( CV_MAT_CN( mat-type ) 1 ) /通道数选择出错 CV_ERROR( CV_BadNumChannels, cvUnsupportedFormat ); if( windowIn.height = 0 | windowIn.width = 0 ) /点选的窗口无效 CV_ERROR( CV_Sts

13、BadArg, Input window has non-positive sizes ); if( windowIn.x mat-cols |windowIn.y mat-rows ) CV_ERROR( CV_StsBadArg, Initial window is not inside the image ROI ); CV_CALL( criteria = cvCheckTermCriteria( criteria, 1., 100 ); /迭代的标准,精度=1.0,迭代次数=100 eps = cvRound( criteria.epsilon * criteria.epsilon

14、); /精度eps=1 for( i = 0; i criteria.max_iter; i+ ) int dx, dy, nx, ny; double inv_m00; /选取搜索区域,对该矩形区域计算它的,1阶矩 CV_CALL( cvGetSubRect( mat, &cur_win, cur_rect ); CV_CALL( cvMoments( &cur_win, &moments ); /* Calculating center of mass */ if( fabs(moments.m00) DBL_EPSILON ) break; /搜索区域的质量m00 inv_m00 = m

15、oments.inv_sqrt_m00*moments.inv_sqrt_m00; /搜索区域的水平重心偏移dx dx = cvRound( moments.m10 * inv_m00 - windowIn.width*0.5 ); /搜索区域的垂直重心偏移dy dy = cvRound( moments.m01 * inv_m00 - windowIn.height*0.5 ); /搜索区域的重心坐标(nx,ny) nx = cur_rect.x + dx; ny = cur_rect.y + dy; /跟踪目标处于图像边缘时进行一些对应的处理 if( nx mat-cols ) nx =

16、mat-cols - cur_rect.width; if( ny mat-rows ) ny = mat-rows - cur_rect.height; dx = nx - cur_rect.x; dy = ny - cur_rect.y; cur_rect.x = nx; cur_rect.y = ny; /* Check for coverage centers mass & window */ /精度达到要求时就可以退出循环 if( dx*dx + dy*dy rect=cur_rect; comp-area=(float)moments.m00; /图像面积 return i;voi

17、d on_mouse( int event, int x, int y, int flags, void* param )/鼠标回调函数,该函数用鼠标进行跟踪目标的选择 if( !image ) return; if( image-origin ) y = image-height - y; /如果图像原点坐标在左下,则将其改为左上 if( select_object ) /select_object为,表示在用鼠标进行目标选择 /此时对矩形类selection用当前的鼠标位置进行设置 selection.x = MIN(x,origin.x); selection.y = MIN(y,ori

18、gin.y); selection.width = selection.x + CV_IABS(x - origin.x); selection.height = selection.y + CV_IABS(y - origin.y); selection.x = MAX( selection.x, 0 ); selection.y = MAX( selection.y, 0 ); selection.width = MIN( selection.width, image-width ); selection.height = MIN( selection.height, image-heig

19、ht ); selection.width -= selection.x; selection.height -= selection.y; switch( event ) case CV_EVENT_LBUTTONDOWN: /鼠标按下,开始点击选择跟踪物体 origin = cvPoint(x,y); selection = cvRect(x,y,0,0); select_object = 1; break; case CV_EVENT_LBUTTONUP: /鼠标松开,完成选择跟踪物体 select_object = 0; if( selection.width 0 & selectio

20、n.height 0 ) /如果选择物体有效,则打开跟踪功能 track_object = -1; break; CvScalar hsv2rgb( float hue )/用于将Hue量转换成RGB量 int rgb3, p, sector; static const int sector_data3= 0,2,1, 1,2,0, 1,0,2, 2,0,1, 2,1,0, 0,1,2; hue *= 0.033333333333333333333333333333333f; sector = cvFloor(hue); p = cvRound(255*(hue - sector); p =

21、sector & 1 ? 255 : 0; rgbsector_datasector0 = 255; rgbsector_datasector1 = 0; rgbsector_datasector2 = p; return cvScalar(rgb2, rgb1, rgb0,0); int main( int argc, char* argv ) CvCapture* capture = 0; if( argc = 1 | (argc = 2 & strlen(argv1) = 1 & isdigit(argv10) /打开摄像头 capture = cvCaptureFromCAM( arg

22、c = 2 ? argv10 - 0 : 0 ); else if( argc = 2 ) /打开avi capture = cvCaptureFromAVI( argv1 ); if( !capture ) /打开视频流失败 fprintf(stderr,Could not initialize capturing.n); return -1; printf( Hot keys: n tESC - quit the programn tc - stop the trackingn tb - switch to/from backprojection viewn th - show/hide

23、object histogramn To initialize tracking, select the object with mousen ); /打印程序功能列表 cvNamedWindow( Histogram, 1 ); /用于显示直方图 cvNamedWindow( MeanShiftDemo, 1 ); /用于显示视频 cvSetMouseCallback( MeanShiftDemo, on_mouse, 0 ); /设置鼠标回调函数 cvCreateTrackbar( Vmin, MeanShiftDemo, &vmin, 256, 0 ); cvCreateTrackbar

24、( Vmax, MeanShiftDemo, &vmax, 256, 0 ); cvCreateTrackbar( Smin, MeanShiftDemo, &smin, 256, 0 ); /设置滑动条 for(;) /进入视频帧处理主循环 IplImage* frame = 0; int i, bin_w, c; frame = cvQueryFrame( capture ); /读取一帧图像 if( !frame ) break; if( !image ) /image为,表明刚开始还未对image操作过,先建立一些缓冲区 image = cvCreateImage( cvGetSize

25、(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 ); /分配反向投影图空间,大小一样,单通道 hist = cvCreateHist( 1, &hd

26、ims, CV_HIST_ARRAY, &hranges, 1 ); /分配直方图空间 histimg = cvCreateImage( cvSize(320,200), 8, 3 ); /分配用于直方图显示的空间 cvZero( histimg ); /置背景为黑色 cvCopy( frame, image, 0 ); cvCvtColor( image, hsv, CV_BGR2HSV ); /把图像从RGB表色系转为HSV表色系 if( track_object ) /track_object非零,表示有需要跟踪的物体 int _vmin = vmin, _vmax = vmax; cv

27、InRangeS( hsv, cvScalar(0,smin,MIN(_vmin,_vmax),0), cvScalar(180,256,MAX(_vmin,_vmax),0), mask ); /制作掩膜板,只处理像素值为H:180,S:smin256,V:vminvmax之间的部分 cvSplit( hsv, hue, 0, 0, 0 ); /分离H分量 if( track_object bins, hist-bins, max_val ? 255. / max_val : 0., 0 ); / 对直方图的数值转为255 cvResetImageROI( hue ); /去除ROI cvResetImageROI( mask ); /去除ROI track_window = selection; track_object = 1; /置track_object为,表明属性提取完成 cvZero( histimg ); bin_w = histimg-width / hdims; for( i = 0; i hdims; i+ ) /画直方图到图像空间 int val = cvRound( cvGetReal1D(hist-

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1