光流法实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1计算方法实验报告实验名称光流法实验时间2015.1.12小组舵手不剁手班级12电科成员谢静韦飞燕靳婷婷张一帆陈泽宇一、实验目的,内容[目的]1.了解光流法的背景知识;2.掌握光流法的基本原理和方法,并用用MATLAB或vc6.0下实现光流法;3.掌握课外知识并提高小组成员之间的合作能力;4.通过实验将理论和实践联系起来,提升对于理论知识的认识。[内容]1.用MATLAB或vc6.0下实现光流法,并实现视频或者摄像头的监控2.编程实现对进入视觉范围内的运动物体实施监测与跟。;二、相关背景知识介绍1.光流的概念(Opticalfloworopticflow)1950年,Gibuson首先提出了光流的概念,所谓光流就是指图像表现运动的速度。物体在运动的时候之所以能被人眼发现,就是因为当物理运动时,会在人的视网膜上形成一系列的连续变化的图像,这些变化信息在不同时间,不断的流过眼睛视网膜,就好像一种光流过一样,故称之为光流。2.光流法的原理光流法用于目标检测的原理:给图像中的每个像素点赋予了一个速度矢量,这样就形成了一个运动矢量场。在某一特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可以通过投影来计算得到。根据各个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和背景存在着相对运动。运动物体所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以计算出运动物体的位置。需要提醒的是,利用光流法进行物体检测时,计算量较大,无法保证实时性和实用性。光流法用于目标跟踪的原理:(1)对一个连续的视频帧序列进行处理;(2)针对每一个视频序列,利用一定的目标检测方法,检测可能出现的前景目标;(3)如果某一帧出现了前景目标,找到其具有代表性的关键特征点;(4)对之后的任意两个相邻视频帧而言,寻找上一帧中出现的关键特征点在当前帧中的最佳位置,从而得到前景目标在当前帧中的位置坐标。3.光流的计算方法从不同的分析角度引入不同的约束条件,就会导致产生不同的光流计算方法。目前应用较为普遍的光流计算方法主要有以下四种:(1)基于梯度的方法(2)基于匹配的方法(3)基于相位的方法(4)基于能量的方法基于时空梯度的光流算法也称为微分法,是一种最常用的计算方法,根据时变图像灰度的梯度函数,梯度算法得到图像中每个像素点的运动矢量。基于匹配的方法就是在图像序列的顺序图像之间,搜索与相对像素点最拟合的位移,这个位移就是最终需要的速度矢量。基于相位的方法在光流的计算中引入了相位信息,在带通调谐滤波器的输出中,利用与等相位轮廓垂直的瞬时运动可以确定分速度。三、代码CppExp.cpp#includestdio.h#includecv.h#includehighgui.h#includemath.hstaticconstdoublepi=3.14159265358979323846;inlinestaticdoublesquare(inta){2returna*a;}/*Thisisjustaninlinethatallocatesimages.Ididthistoreduceclutterinthe*actualcomputervisionalgorithmiccode.Basicallyitallocatestherequestedimage*unlessthatimageisalreadynon-NULL.Italwaysleavesanon-NULLimageas-iseven*ifthatimage'ssize,depth,and/orchannelsaredifferentthantherequest.*//*这仅仅是一个行内分配图像。我这样做是在实际的计算机视觉算法的代码,以减少混乱。基本上它分配请求的图像,除非该图像已经非NULL。为正的,即使该图像的大小,深度和/或信道比的要求是不同的,它总是会留下一个非NULL图像。*/inlinestaticvoidallocateOnDemand(IplImage**img,CvSizesize,intdepth,intchannels){if(*img!=NULL)return;*img=cvCreateImage(size,depth,channels);if(*img==NULL){fprintf(stderr,Error:Couldn'tallocateimage.Outofmemory?\n);exit(-1);}}intmain(void){/*Createanobjectthatdecodestheinputvideostream.*//*创建一个对象,解码输入的视频数据流。*/CvCapture*input_video=cvCaptureFromFile(video1.avi);//CvCapture*input_video=cvCaptureFromCAM(-1);if(input_video==NULL){/*Eitherthevideodidn'texistORitusesacodecOpenCVdoesn'tsupport.*/fprintf(stderr,Error:Can'topenvideo.\n);return-1;}/*Thisisahack.Ifwedon'tcallthisfirstthengettingcapture*properties(below)won'tworkright.ThisisanOpenCVbug.We*ignorethereturnvaluehere.Butit'sactuallyavideoframe.*/cvQueryFrame(input_video);/*Readthevideo'sframesizeoutoftheAVI.*/CvSizeframe_size;frame_size.height=(int)cvGetCaptureProperty(input_video,CV_CAP_PROP_FRAME_HEIGHT);frame_size.width=(int)cvGetCaptureProperty(input_video,CV_CAP_PROP_FRAME_WIDTH);/*DeterminethenumberofframesintheAVI.*/longnumber_of_frames;/*GototheendoftheAVI(ie(即):thefractionis1)*/cvSetCaptureProperty(input_video,CV_CAP_PROP_POS_AVI_RATIO,1.);/*Nowthatwe'reattheend,readtheAVIpositioninframes*/number_of_frames=(int)cvGetCaptureProperty(input_video,CV_CAP_PROP_POS_FRAMES);/*Returntothebeginning*/3cvSetCaptureProperty(input_video,CV_CAP_PROP_POS_FRAMES,0.);/*CreatethreewindowscalledFrameN,FrameN+1,andOpticalFlow*forvisualizingtheoutput.Havethosewindowsautomaticallychangetheir*sizetomatchtheoutput.*/cvNamedWindow(OpticalFlow,CV_WINDOW_AUTOSIZE);longcurrent_frame=0;while(true){staticIplImage*frame=NULL,*frame1=NULL,*frame1_1C=NULL,*frame2_1C=NULL,*eig_image=NULL,*temp_image=NULL,*pyramid1=NULL,*pyramid2=NULL;/*Gototheframewewant.Importantifmultipleframesarequeriedin*theloopwhichtheyofcourseareforopticalflow.Notethatthevery*firstcalltothisisactuallynotneeded.(Becausethecorrectposition*issetoutsitethefor()loop.)*/cvSetCaptureProperty(input_video,CV_CAP_PROP_POS_FRAMES,current_frame);/*Getthenextframeofthevideo.*IMPORTANT!cvQueryFrame()alwaysreturnsapointertothe_same_*memorylocation.Sosuccessivecalls:*frame1=cvQueryFrame();*frame2=cvQueryFrame();*frame3=cvQueryFrame();*willresultin(frame1==frame2&&frame2==frame3)beingtrue.*ThesolutionistomakeacopyofthecvQueryFrame()output.*/frame=cvQueryFrame(input_video);if(frame==NULL){/*WhydidwegetaNULLframe?Weshouldn'tbeattheend.*/fprintf(stderr,Error:Hmm.Theendcamesoonerthanwethought.\n);return-1;}/*Allocateanotherimageifnotalreadyallocated.*ImagehasONEchallengeofcolor(ie:monochrome)with8-bitcolordepth.*ThisistheimageformatOpenCValgorithmsactuallyoperateon(mostly).*/allocateOnDemand(&frame1_1C,frame_size,IPL_DEPTH_8U,1);/*ConvertwhatevertheAVIimageformatisintoOpenCV'spreferredformat.*ANDfliptheimagevertically.Flipisashamelesshack.OpenCVreads*inAVIsupside-downbydefault.(Nocomment:-))*/cvConvertImage(frame,frame1_1C,CV_CVTIMG_FLIP);/*We'llmakeafullcolorbackupofthisframesothatwecandrawonit.*(It'snotthebestideatodrawonthestaticmemoryspaceofcvQueryFrame().)*/allocateOnDemand(&frame1,frame_size,IPL_DEPTH_8U,3);cvConvertImage(frame,frame1,CV_CVTIMG_FLIP);/*Getthesecondframeofvideo.Sampleprinciplesasthefirst.*/frame=cvQueryFrame(input_video);if(frame==NULL)4{fprintf(stderr,Error:Hmm.Theendcamesoonerthanwethought.\n);return-1;}allocateOnDemand(&frame2_1C,frame_size,IPL_DEPTH_8U,1);cvConv

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功