为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > 基于OpenCv目标跟踪系统的实现

基于OpenCv目标跟踪系统的实现

2021-04-21 2页 doc 2MB 5阅读

用户头像 个人认证

wassyy

本人从事施工专职安全员多年,对施工现场安全管理、内业资料管理具有丰富的经验。

举报
基于OpenCv目标跟踪系统的实现基于OpenCV的运动目标跟踪系统的实现徐俊斌SA11009039摘要:运动目标跟踪在军事制导、视觉导航、机器人、智能交通、公共安全等领域有着广泛的应用.例如在车辆违章抓拍系统中,车辆的跟踪就是必不可少的.在入侵检测中,人、动物、车辆等大型运动目标的检测与跟踪也是整个系统运行的关键所在.因此在计算机视觉领域中目标跟踪是一个很重要的分支。传统的的运动目标检测主要有三种方法:背景图像差分法,时态差分法和光流法。然而这几种算法均不能很好地解决目标存在旋转或部分遮挡等复杂情况下的跟踪难题。本文基于OpenCV设计出改进的运动目标检测与...
基于OpenCv目标跟踪系统的实现
基于OpenCV的运动目标跟踪系统的实现徐俊斌SA11009039摘要:运动目标跟踪在军事制导、视觉导航、机器人、智能交通、公共安全等领域有着广泛的应用.例如在车辆违章抓拍系统中,车辆的跟踪就是必不可少的.在入侵检测中,人、动物、车辆等大型运动目标的检测与跟踪也是整个系统运行的关键所在.因此在计算机视觉领域中目标跟踪是一个很重要的分支。传统的的运动目标检测主要有三种:背景图像差分法,时态差分法和光流法。然而这几种算法均不能很好地解决目标存在旋转或部分遮挡等复杂情况下的跟踪难。本文基于OpenCV设计出改进的运动目标检测与跟踪算法---CAMSHIFT算法来实现运动目标的跟踪,并在VC++编译环境下,利用USB摄像头作为视频采集器,通过观察实验结果可以看出,本文的运动目标检测算法能够正确地检测出视频图像中的运动目标,而且在检测性能上优于传统的检测算法。关键词:目标跟踪;OpenCV;CAMSHIFT算法;VC++0引言目标跟踪是计算机视觉的一个重要分支,日益广泛应用于科学技术、国防安全、航空、医药卫生以及国民经济等领域。实现目标跟踪的关键在于完整地分割目标、合理提取特征和准确地识别目标,同时,要考虑算法实现的时间,以保证实时性。当视频图像中被跟踪目标发生姿态变化,存在旋转或部分遮挡时,简单的灰度模板或者Hausdorff距离匹配一般很难达到实时跟踪目标的要求,出现误匹配或者跟踪丢失的情况,而且跟踪效果较低。GaryR.Bradski提出的CAMSHIFT(ContinuouslyAdaptiveMeanShift)算法是以颜色直方图为目标模式的目标跟踪算法,可以有效地解决目标变形和部分遮挡的问题,而且运算效率很高。该文首先详细介绍CAMSHIFT算法,并结合Intel公司开发的开源OpenCV计算机视觉库,实现了运动目标跟踪,并验证了CAMSHIFT算法的有效性以及展现OpenCV计算视觉库的灵活性和优越性。1CAMSHIFT算法原理CAMSHIFT算法是利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的中心位置。这个算法可以分为三个部分:1、色彩投影图(反向投影):(1).RGB颜色空间对光照亮度变化较为敏感,为了减少此变化对跟踪效果的影响,首先将图像从RGB空间转换到HSV空间。(2).然后对其中的H分量作直方图,在直方图中代了不同H分量值出现的概率或者像素个数,就是说可以查找出H分量大小为h的概率或者像素个数,即得到了颜色概率查找表。(3).将图像中每个像素的值用其颜色出现的概率对替换,就得到了颜色概率分布图。这个过程就叫反向投影,颜色概率分布图是一个灰度图像。2、MEANSHIFTMEANSHIFT算法是一种密度函数梯度估计的非参数方法,通过迭代寻优找到概率分布的极值来定位目标。算法过程为:(1).在颜色概率分布图中选取搜索窗W(2).计算零阶距:计算一阶距:计算搜索窗的质心:(3).调整搜索窗大小宽度为;长度为1.2s;(4).移动搜索窗的中心到质心,如果移动距离大于预设的固定阈值,则重(2)(3)(4),直到搜索窗的中心与质心间的移动距离小于预设的固定阈值,或者循环运算的次数达到某一最大值,停止计算。关于MEANSHIFT的收敛性证明可以google相关文献。3、CAMSHIFT将MEANSHIFT算法扩展到连续图像序列,就是CAMSHIFT算法。它将视频的所有帧做MEANSHIFT运算,并将上一帧的结果,即搜索窗的大小和中心,作为下一帧MEANSHIFT算法搜索窗的初始值。如此迭代下去,就可以实现对目标的跟踪。算法过程为:(1).初始化搜索窗(2).计算搜索窗的颜色概率分布(反向投影)(3).运行MEANSHIFT算法,获得搜索窗新的大小和位置。(4).在下一帧视频图像中用(3)中的值重新初始化搜索窗的大小和位置,再跳转到(2)继续进行。CAMSHIFT算法能有效解决目标变形和遮挡的问题,对系统资源要求不高,时间复杂度低,在简单背景下能够取得良好的跟踪效果。但当背景较为复杂,或者有许多与目标颜色相似像素干扰的情况下,会导致跟踪失败。因为它单纯的考虑颜色直方图,忽略了目标的空间分布特性,所以这种情况下需加入对跟踪目标的预测算法。2计算机视觉库OpenCV简介OpenCV(opensourcecomputervisionlibrary)诞生于Intel研究中心,是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数字图像和视频处理。同时利用面向对象的VC++6.0编程工具,采用C/C++语言编写,可以在Linux/Windows/Mac等操作系统上运行,大大提高了计算机的运行速度。OpenCV还提供了Python、Ruby、MATLAB以及其他语言的接口。它包含的函数有500多个,覆盖了计算机视觉的许多应用领域。OpenCV主要用于对图像进行一些高级处理,比如说特征检测与跟踪、运动、目标分割与识别以及3D重建等。与其他计算机视觉工具相比,OpenCV的优越性如表1所示:表1图像处理、计算机视觉工具比较(IPL,OpenCV,IPP,VisDSK与Matlab)开发工具开发单位应用领域免费情况源码公开与否备注IPLIntel图像处理Free不公开已被并入到IPPOpenCVIntel图像处理、计算机视觉Free公开基于Intel芯片代码优化IPPIntel集成开发环境库NotFree不公开基于Intel芯片代码优化VisDSKMicrosoft图像处理Free公开无优化MatlabMathWorks多学科、多种工作平台NotFree不公开速度慢,不易编译成可执行文件作为一种开源数据库,OpenCV具有如下一些特征:a)采用C/C++编写,开放源码b)统一的结构和功能定义c)独立于操作系统、硬件、图像管理器d)强大的图像和矩阵运算能力e)支持Windows和Linux操作系统f)具有底层和高层的应用开发包以上OpenCV函数库的功能特点,使得开发人员可以很快掌握图像、视频处理,计算机视觉等方面的设计方法,能够更快的实现开发人员的算法思想,省去了传统设计方法中重复性的底层开发工作。由于OpenCV良好的移植性和统一的结构及其稳定性,可以缩短系统设计的开发周期,系统运行更稳定。2.1OpenCV的数据结构OpenCV设计一些基本数据类型,基本的数据类型包括:图像类的Iplmage,矩阵类的CvMat,可变集合类的CvSeq,CvSet,CvGraph以及用于多维柱状图的混合CvHistogram。辅助数据类型包括:用于表示二维点坐标的CvPoint,用于表示图像宽和高的CvSize等。2.2OpenCV的函数体系OpenCV中每个函数的命名都以“CV”开始,然后是该函数的行为及目标。例如用来创建图像的函数“cvCreatelmage”,载入图像的函数“cvLoadlmage”。OpenCV是为图像处理及计算机视觉在实际工程中的应用而设计的一个类库,其中所有的函数都由于其在实际应用中所实现的不同的功能而分属不同的类型,主要的函数类型有:(1)基本的图像处理与分析函数。这个类型的函数主要用于实现一些基本的图像处理与分析功能,例如图像平滑函数cvSmooth,Sobel,算子cvSobe,Canny,边缘分割函数cvCanny等。(2)结构分析函数。包括有轮廓处理函数,几何学函数以及平面细分函数。(3)运动分析与目标跟踪函数。包括有用于运动分析与目标跟踪的函数,例如背景重建函数cvAcc,用光流法或动态轮廓模型来实现目标跟踪的函数cvCalcOpticalFlowBM和cvSnakelmage以及卡尔曼滤波函数CvKalman等。(4)摄像机标定和3D重建函数。包括有用于摄像机标定,姿态估计以及从两个摄像机进行3D相似重构的函数。(5)GUI与视频处理函数。包括有高级图形用户接口highGUI用以实现对图像的载入、显示及保存等基本操作以及用以实现视频输入输出及处理的函数。3CAMSHIFT算法实现在OpenCV库中,CvCamShiftTracker类就是用来实现CAMSHIFT算法的,使得进行二次开发变得很简单。该函数为:intcvCamShift(constCvArr*prob_image,CvRectwindow,CvTermCriteriacriteria,CvConnectedComp*cornp,CvBox2D*box=NULL);prob_image:目标直方图的反向投影window:初始搜索窗口criteria:确定窗口搜索停止的准则comp:生成的结构,包含收敛的搜索窗VI坐标(comp→rect字段)与窗口内部所有像素点的和(comps→area字段)box:目标的带边界盒子。如果非NULL则包含目标的尺寸和方向。算法图如图1所示:图1:算法流程图根据本文的算法,利用Windows平台下的VC++作为编译平台,利用OpenCV函数库,实现运动目标检测跟踪算法。首先初始化摄像头,读取摄像头数据,用背景提取算法,建立初始背景,然后用当前帧与背景帧差分,提取运动目标,用质心投影算法计算目标的质心,最后用改进的CAMSHIFT算法读取质心投影算法返回的质心信息对目标进行实时跟踪。程序框图如图2所示。图2:程序流程图利用该函数,在VC6.0开发环境下,就很容易实现CAMSHIFT算法跟踪运动物体,图3是程序控制界面:图3:程序控制界面4实验结果与分析本实验中,用笔记本自带的USB摄像头来跟踪一运动物体,下图4-图7一系列图像是采用CAMSHIFT算法跟踪运动物体部分图像。图4:摄像头拍到的场景图5:手动选择目标物体图6:物体快速移动时跟踪目标图7:物体发生旋转、变形时跟踪目标由此可见,基于颜色直方图的CAMSHIFT算法可以有效地解决目标变形和旋转问题,而且运算效率很高,可以实时跟踪运动目标。5结论本文在详细分析CAMSHIFT算法原理的基础上,采用Intel公司开发的OpenCV视觉库,在VC6.0开发环境下,实现了运动目标实时跟踪,解决了目标旋转、变形、部分遮挡问题。同时,可以看到,在开源库OpenCV的基础上,根据自己所开发应用程序所要实现的功能选择所需的库函数,能够大大减少在计算机视觉领域中的开发时间和精力,缩短程序开发的周期。6附录(程序代码部分)#include"cv.h"#include"highgui.h"#include#includeIplImage*image=0,*hsv=0,*hue=0,*mask=0,*backproject=0,*histimg=0;CvHistogram*hist=0;intbackproject_mode=0;intselect_object=0;inttrack_object=0;intshow_hist=1;CvPointorigin;CvRectselection;CvRecttrack_window;CvBox2Dtrack_box;CvConnectedComptrack_comp;inthdims=16;floathranges_arr[]={0,180};float*hranges=hranges_arr;intvmin=10,vmax=256,smin=30;voidon_mouse(intevent,intx,inty,intflags,void*param){if(!image)return;if(image->origin)y=image->height-y;if(select_object){selection.x=MIN(x,origin.x);selection.y=MIN(y,origin.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->height);selection.width-=selection.x;selection.height-=selection.y;}switch(event){caseCV_EVENT_LBUTTONDOWN:origin=cvPoint(x,y);selection=cvRect(x,y,0,0);select_object=1;break;caseCV_EVENT_LBUTTONUP:select_object=0;if(selection.width>0&&selection.height>0)track_object=-1;break;}}CvScalarhsv2rgb(floathue){intrgb[3],p,sector;staticconstintsector_data[][3]={{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^=sector&1?255:0;rgb[sector_data[sector][0]]=255;rgb[sector_data[sector][1]]=0;rgb[sector_data[sector][2]]=p;returncvScalar(rgb[2],rgb[1],rgb[0],0);}intmain(intargc,char**argv){CvCapture*capture=0;if(argc==1||(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))capture=cvCaptureFromCAM(argc==2?argv[1][0]-'0':0);elseif(argc==2)capture=cvCaptureFromAVI(argv[1]);if(!capture){fprintf(stderr,"Couldnotinitializecapturing...\n");return-1;}printf("Hotkeys:\n""\tESC-quittheprogram\n""\tc-stopthetracking\n""\tb-switchto/frombackprojectionview\n""\th-show/hideobjecthistogram\n""Toinitializetracking,selecttheobjectwithmouse\n");cvNamedWindow("Histogram",1);cvNamedWindow("CamShiftDemo",1);cvSetMouseCallback("CamShiftDemo",on_mouse,0);cvCreateTrackbar("Vmin","CamShiftDemo",&vmin,256,0);cvCreateTrackbar("Vmax","CamShiftDemo",&vmax,256,0);cvCreateTrackbar("Smin","CamShiftDemo",&smin,256,0);for(;;){IplImage*frame=0;inti,bin_w,c;frame=cvQueryFrame(capture);if(!frame)break;if(!image){/*allocateallthebuffers*/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);hist=cvCreateHist(1,&hdims,CV_HIST_ARRAY,&hranges,1);histimg=cvCreateImage(cvSize(320,200),8,3);cvZero(histimg);}cvCopy(frame,image,0);cvCvtColor(image,hsv,CV_BGR2HSV);if(track_object){int_vmin=vmin,_vmax=vmax;cvInRangeS(hsv,cvScalar(0,smin,MIN(_vmin,_vmax),0),cvScalar(180,256,MAX(_vmin,_vmax),0),mask);cvSplit(hsv,hue,0,0,0);if(track_object<0){floatmax_val=0.f;cvSetImageROI(hue,selection);cvSetImageROI(mask,selection);cvCalcHist(&hue,hist,0,mask);cvGetMinMaxHistValue(hist,0,&max_val,0,0);cvConvertScale(hist->bins,hist->bins,max_val?255./max_val:0.,0);cvResetImageROI(hue);cvResetImageROI(mask);track_window=selection;track_object=1;cvZero(histimg);bin_w=histimg->width/hdims;for(i=0;ibins,i)*histimg->height/255);CvScalarcolor=hsv2rgb(i*180.f/hdims);cvRectangle(histimg,cvPoint(i*bin_w,histimg->height),cvPoint((i+1)*bin_w,histimg->height-val),color,-1,8,0);}}cvCalcBackProject(&hue,backproject,hist);cvAnd(backproject,mask,backproject,0);cvCamShift(backproject,track_window,cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER,10,1),&track_comp,&track_box);track_window=track_comp.rect;if(backproject_mode)cvCvtColor(backproject,image,CV_GRAY2BGR);if(image->origin)track_box.angle=-track_box.angle;cvEllipseBox(image,track_box,CV_RGB(255,0,0),3,CV_AA,0);}if(select_object&&selection.width>0&&selection.height>0){cvSetImageROI(image,selection);cvXorS(image,cvScalarAll(255),image,0);cvResetImageROI(image);}cvShowImage("CamShiftDemo",image);cvShowImage("Histogram",histimg);c=cvWaitKey(10);if((char)c==27)break;switch((char)c){case'b':backproject_mode^=1;break;case'c':track_object=0;cvZero(histimg);break;case'h':show_hist^=1;if(!show_hist)cvDestroyWindow("Histogram");elsecvNamedWindow("Histogram",1);break;default:;}}cvReleaseCapture(&capture);cvDestroyWindow("CamShiftDemo");return0;}
/
本文档为【基于OpenCv目标跟踪系统的实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索