验证OpenCV中的Camshift跟踪算法_第1页
验证OpenCV中的Camshift跟踪算法_第2页
验证OpenCV中的Camshift跟踪算法_第3页
验证OpenCV中的Camshift跟踪算法_第4页
验证OpenCV中的Camshift跟踪算法_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2014-2015-(1)-图像系统设计《图像系统设计》实习报告成绩:评阅人:学院专业年级班级姓名学号日期问题描述:验证OpenCV中的Camshift跟踪算法,并给出至少一个输入上的改进,比如输入的不是颜色直方图,而是梯度直方图,比较结果;说明:视频跟踪或者目标识别中,需要获取目标的位置,然后再进行后续的分析。请参考OpenCV中的Camshift算法完成目标跟踪,并将输入的颜色信息改为其它特征来比较一下跟踪结果。问题分析:阐述你对问题的理解camshift利用目标的颜色直方图模型将图像转换为颜色概率分布图,初始化一个搜索窗的大小和位置,并根据上一帧得到的结果自适应调整搜索窗口的位置和大小,从而定位出当前图像中目标的中心位置。对算法的改进是将输入的颜色直方图变成梯度直方图,观察实现的结果跟原来有什么区别,是否能够从上一帧的结果定位出当前图像中目标的中心位置。这个问题的解决方案是通过OpenCV结合vs2010实现的,OpenCV的头文件不仅包含了Camshift算法的函数,还有创建直方图、计算反向投影等函数,为问题的解决提供了便利。解决问题的方案说明解决问题方案:利用OpenCV,通过调用函数打开笔记本电脑的摄像头作为视频流的输入,用鼠标截取图片并通过函数转换为HSV图,又将HSV图转换成直方图,最后转换成色彩概率分布图,计算搜索区域的质心位置,根据窗口中像素值总和调整窗口尺寸,移动窗口中心到质心的位置,并判断是否收敛。如果没有收敛,则返回到计算搜索区域质心的位置;如果收敛,则计算新的搜索区域的中心,和窗口尺寸,一方面确定处理区域,一方面返回到计算搜索区域质心的位置。实验环境配置因为需要OpenCV和vs2010的结合使用,我们必须对其进行环境的配置,以利于开发。我是在windows7x64的平台上安装vs2010和配置OpenCV(版本2.4.9)的。配置过程如下:下载OpenCV2.4.9并解压到D:\ProgramFiles。配置环境变量:计算机->(右键)属性->高级系统设置->高级(标签)->环境变量〉(双击)path(用户,系统里面的path任选其一)->在变量值里面添加相应的路径:D:\ProgramFiles\opencv\build\x64\vc10\bin;D:\ProgramFiles\opencv\build\x86\vc10\bin工程包含(include)目录的配置:打开vs2010,新建一个空的Win32控制台项目,一次选择“视图,其他窗口,属性管理器,在新出现的“属性管理器”工作区中。点击项目->Debug|Win32->Microsoft.Cpp.Win32.userDirectories(反键属性,或者双击)即可打开属性页面。【通用属性】->【VC++目录】->【包含目录中】,添加上:D:\ProgramFiles\opencv\build\includeD:\ProgramFiles\opencv\build\include\opencvD:\ProgramFiles\opencv\build\include\opencv2这三个目录。工程库(lib)目录的而配置:【通用属性】->【VC++目录】->【包含目录中】,添加上:D:\ProgramFiles\opencv\build\x86\vc10\lib链接库的配置:【通用属性】->【VC++目录】->【包含目录中】,添加上:opencv_ml249d.libopencv_calib3d249d.libopencv_contrib249d.libopencv_core249d.libopencv_features2d249d.libopencv_flann249d.libopencv_gpu249d.libopencv_highgui249d.libopencv_imgproc249d.libopencv_legacy249d.libopencv_objdetect249d.libopencv_ts249d.libopencv_video249d.libopencv_nonfree249d.libopencv_ocl249d.libopencv_photo249d.libopencv_stitching249d.libopencv_superres249d.libopencv_videostab249d.libopencv_objdetect249.libopencv_ts249.libopencv_video249.libopencv_nonfree249.libopencv_ocl249.libopencv_photo249.libopencv_stitching249.libopencv_superres249.libopencv_videostab249.libopencv_calib3d249.libopencv_contrib249.libopencv_core249.libopencv_features2d249.libopencv_flann249.libopencv_gpu249.libopencv_highgui249.libopencv_imgproc249.libopencv_legacy249.libopencv_ml249.lib6.在Windows文件夹下加入OpenCV动态链接库将D:\ProgramFiles\opencv\build\x86\vc10\bin目录下的所有dll文件复制到C:\Windows下面。数据模型:相关数据结构、对象模型、全局变量,重要形式参数、局部变量等等,它们的命名及用途解释1、cvInRangeS函数的使用cvInRangeS函数可用于检查一个矩阵中的像素灰度值是否属于某一指定范围。并且可以输出一个单通道矩阵来进行标识。voidcvInRangeS(constCvArr*src,CvScalarlower,CvScalarupper,CvArr*dst);src第一个原数组lower包括进的下边界.upper不包括进的上边界dst输出数组必须是8u或8s类型.对于单通道数组:dst(i)=(lower[0]<=src(i)[0]<upper[0])//值只能是0或1,处于设置的值的中间就为1,不在中间就为0对于双通道数组以此类推:dst(i)=((lower[0]<=src(i)[0]<upper[0])&&(lower[0]<=src(i)[0]<upper[0]));如果src(i)在lower和upper的范围内,则dst(i)被设置为0xff(每一位都是'1')否则置0。2、cvCreateHist函数的使用函数功能:创建直方图CvHistogram*cvCreateHist(intdims,int*sizes,inttype,float**ranges=NULL,intuniform=1);dims直方图维数的数目sizes直方图维数尺寸的数组type直方图的表示格式:CV_HIST_ARRAY意味着直方图数据表示为多维密集数组CvMatND;CV_HIST_TREE意味着直方图数据表示为多维稀疏数组CvSparseMat.ranges图中方块范围的数组.它的内容取决于参数uniform的值。这个范围的用处是确定何时计算直方图或决定反向映射(backprojected),每个方块对应于输入图像的哪个/哪组值。(对于单维直方图,该参数可以这样申明:floatranges_arr[]={0,255};//这里按照需要计算的范围而定float*ranges=hranges_arr;)uniform归一化标识。如果不为0,则ranges[i](i的取值为:0<=i数组,包括直方图第i维的上界和下界。在第i维上的整个区域[lower,upper]被分割成dims[i]个相等的块(dims[i]表示直方图第i维的块数),这些块用来确定输入象素的第i个值(对于彩色图像,i确定R,G,或者B)的对应的块;如果为0,则ranges[i]是包含dims[i]+1个元素的范围数组,包括lower0,upper0,lower1,upper1==lower2,...,upperdims[i]-1,其中lowerj和upperj分别是直方图第i维上第j个方块的上下界(针对输入象素的第i个值)。任何情况下,输入值如果超出了一个直方块所指定的范围外,都不会被cvCalcHist计数,而且会被函数cvCalcBackProject置零。3、 cvCalcHist函数的使用函数功能:用来计算一张或多张单通道图像的直方图voidcvCalcHist(IplImage**image,CvHistogram*hist,intaccumulate=0,constCvArr*mask=NULL);image输入图像(虽然也可以使用CvMat**).hist直方图指针,使用前可以先创建一个空的直方图accumulate累计标识。如果设置,则直方图在开始时不被清零。这个特征保证可以为多个图像计算一个单独的直方图,或者在线更新直方图。mask操作mask,确定输入图像的哪个象素被计数(mask相应位置为0的不计数)4、 cvConvertScale函数的使用voidcvConvertScale(constCvArr*src,CvArr*dst,doublescale=1,doubleshift=0);src输入数组.dst输出数组scale比例因子.shift该加数被加到输入数组元素按比例缩放后得到的元素上该函数首先对输入数组的元素进行比例缩放,然后将shift加到比例缩放后得到的各元素上,即:dst(i)=src(i)*scale+shift,最后将结果拷贝到输出数组。5、 cvCalcBackProject函数的使用函数:计算反向投影voidcvCalcBackProjec(IplImage**image,CvArr*back_project,constCvHistogram*hist);image输入图像(也可以传递CvMat**).back_project反向投影图像(输出),与输入图像具有同样类型.hist直方图函数原理cvCalcBackProject计算直方图的反向投影.对于所有输入的单通道图像同一位置的象素数组,该函数根据相应的象素数组(RGB),放置其对应的直方块的值到输出图像中。用统计学术语,输出图像象素点的值是观测数组在某个分布(直方图)下的概率。6、 cvAnd、cvXors和cvOr函数逻辑运算的函数,具体可以参照:/guzhou_diaoke/item/1e93e48ad073be5ce63d19f57、 cvCamShift函数CamShift算法描述整个算法的具体步骤分5步:Step1:将整个图像设为搜寻区域。Step2:初始话SearchWindow的大小和位置。Step3:计算SearchWindow内的彩色概率分布,此区域的大小比SearchWindow要稍微大一点。Step4:运行MeanShift。获得SearchWindow新的位置和大小。Step5:在下一帧视频图像中,用Step3获得的值初始化SearchWindow的位置和大小。跳转到Step3继续运行。OpenCV实现CamShift算法的函数,函数的原型是:cvCamShift(IplImage*imgprob,CvRectwindowIn,CvTermCriteriacriteria,CvConnectedComp*out,CvBox2D*box=0);其中:imgprob:色彩概率分布图像。windowIn:SearchWindow的初始值。Criteria:用来判断搜寻是否停止的一个标准。out:保存运算结果,包括新的SearchWindow的位置和面积。box:包含被跟踪物体的最小矩形算法描述:解题算法的设计思路介绍;CamShift算法的全称是"ContinuouslyApaptiveMean-SHIFT",它的基本思想是视频图像的所有帧作MeanShift运算,并将上一帧的结果(即SearchWindow的中心和大小)作为下一帧MeanShift算法的SearchWindow的初始值,如此迭代下去,就可以实现对目标的跟踪。整个算法的具体步骤分5IR步:Step1:将整个图像设为搜寻区域。Step2:初始话SearchWindow的大小和位置。Step3:计算SearchWindow内的彩色概率分布,此区域的大小比SearchWindow要稍微大一点。Step4:运行MeanShift。获得SearchWindow新的位置和大小。Step5:在下一帧视频图像中,用Step3获得的值初始化SearchWindow的位置和大小。跳转到Step3继续运行。CamShift算法流程如图1所示=图ICamShjQ算液流程主要程序代码,加上详细的注释#ifdef_CH_#pragmapackage<opencv>#endif#ifndef_EiC#include"cv.h"#include"highgui.h"#include<stdio.h>#include<ctype.h>#endifIplImage*image=0,*hsv=0,*hue=0,*mask=0,*backproject=0,*histimg=0;//用HSV中的Hue分量进行跟踪CvHistogram*hist=0;//直方图类intbackproject_mode=0;intselect_object=0;inttrack_object=0;intshow_hist=1;CvPointorigin;CvRectselection;CvRecttrack_window;CvBox2Dtrack_box;//Meanshift跟踪算法返回的Box类//typedefstructCvBox2D(//CvPoint2D32fcenter;//CvSize2D32fsize;//floatangle;//}CvBox2D;CvConnectedComptrack_comp;〃连接部件//typedefstructCvConnectedComp(//doublearea;//floatvalue;//CvRectrect;//}CvConnectedComp;inthdims=16;〃划分直方图bins的个数,越多越精确floathranges_arr[]=(0,180};//像素值的范围float*hranges=hranges_arr;//用于初始化CvHistogram类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)//select_object为1,表示在用鼠标进行目标选择//此时对矩形类selection用当前的鼠标位置进行设置(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)//用于将Hue量转换成RGB量{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));pA=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==1II(argc==2&&strlen(argv[1])==1&&isdigit(argv[1][0])))〃打开摄像头capture=cvCaptureFromCAM(argc==2?argv[1][0]-'0':0);elseif(argc==2) 〃打开avicapture=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)//image为0,表明刚开始还未对image操作过,先建立一些缓冲区{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);//把图像从RGB表色系转为HSV表色系if(track_object)//track_object非零,表示有需要跟踪的物体{int_vmin=vmin,_vmax=vmax;cvInRangeS(hsv,cvScalar(0,smin,MIN(_vmin,_vmax),0),cvScalar(180,256,MAX(_vmin,_vmax),0),mask);//制作掩膜板,只处理像素值为H:0〜180,S:smin〜256,V:vmin~vmax之间的部分cvSplit(hsv,hue,0,0,0);//分离H分量if(track_object<0)〃如果需要跟踪的物体还没有进行属性提取,则进行选取框类的图像属性提取{floatmax_val=0.f;cvSetImageROI(hue,selection);〃设置原选择框为ROIcvSetImageROI(mask,selection);〃设置掩膜板选择框为ROIcvCalcHist(&hue,hist,0,mask);//得到选择框内且满足掩膜板内的直方图cvGetMinMaxHistValue(hist,0,&max_val,0,0);cvConvertScale(hist->bins,hist->bins,max_val?255./max_val:0.,0);//对直方图的数值转为0~255cvResetImageROI(hue);〃去除ROIcvResetImageROI(mask);〃去除ROItrack_window=selection;track_object=1;〃置track_object为1,表明属性提取完成cvZero(histimg);bin_w=histimg->width/hdims;for(i=0;i<hdims;i++)〃画直方图到图像空间{int val =cvRound(cvGetReal1D(hist->bins,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);〃计算hue的反向投影图cvAnd(backproject,mask,backproject,0);//得到掩膜内的反向投影cvCamShift(backproject,track_window,cvTermCriteria( CV_TERMCRIT_EPS |CV_TERMCRIT_ITER,10,1),&track_comp,&track_box);//使用MeanShift算法对backproject中的内容进行搜索,返回跟踪结果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);cvXor

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论