您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > Opencv视频运动跟踪代码
#includecv.h#includehighgui.h#includetime.h#includemath.h#includectype.h#includestdio.h#includestring.h#includewindows.h#includemmsystem.h//跟踪参数constdoubleMHI_DURATION=0.5;//最大跟踪时间constdoubleMAX_TIME_DELTA=0.5;constdoubleMIN_TIME_DELTA=0.05;constintN=3;constintCONTOUR_MAX_AERA=100;//矩形面积IplImage**buf=0;intlast=0;intflag;IplImage*mhi=0;//MHI:motionhistoryimageCvConnectedComp*cur_comp,min_comp;CvConnectedCompcomp;CvMemStorage*storage;CvPointpt[4];//img–输入视频帧//dst–检测结果voidupdate_mhi(IplImage*img,IplImage*dst,intdiff_threshold){doubletimestamp=clock()/100.;//获取当前时间CvSizesize=cvSize(img-width,img-height);inti,idx1,idx2;IplImage*silh;IplImage*pyr=cvCreateImage(cvSize((size.width&-2)/2,(size.height&-2)/2),8,1);CvMemStorage*stor;CvSeq*cont;if(!mhi||mhi-width!=size.width||mhi-height!=size.height){if(buf==0){buf=(IplImage**)malloc(N*sizeof(buf[0]));//动态内存分配memset(buf,0,N*sizeof(buf[0]));}for(i=0;iN;i++){cvReleaseImage(&buf[i]);buf[i]=cvCreateImage(size,IPL_DEPTH_8U,1);cvZero(buf[i]);}cvReleaseImage(&mhi);mhi=cvCreateImage(size,IPL_DEPTH_32F,1);cvZero(mhi);}cvCvtColor(img,buf[last],CV_BGR2GRAY);//rgb-grayidx1=last;idx2=(last+1)%N;last=idx2;//做帧差silh=buf[idx2];cvAbsDiff(buf[idx1],buf[idx2],silh);//两帧差异//对差图像做二值化cvThreshold(silh,silh,30,255,CV_THRESH_BINARY);//src(x,y)threshold,dst(x,y)=max_value;否则,dst(x,y)=0;cvUpdateMotionHistory(silh,mhi,timestamp,MHI_DURATION);//更新像素点的运动历史cvCvtScale(mhi,dst,255./MHI_DURATION,(MHI_DURATION-timestamp)*255./MHI_DURATION);//timestamp是时间戳;MHI_DURATION,获得的是当前时间cvCvtScale(mhi,dst,255./MHI_DURATION,0);//中值滤波,消除小的噪声cvSmooth(dst,dst,CV_MEDIAN,3,0,0,0);//向下采样,去掉噪声cvPyrDown(dst,pyr,7);cvDilate(pyr,pyr,0,1);//做膨胀操作,消除目标的不连续空洞cvPyrUp(pyr,dst,7);////下面的程序段用来找到轮廓////Createdynamicstructureandsequence.stor=cvCreateMemStorage(0);cont=cvCreateSeq(CV_SEQ_ELTYPE_POINT,sizeof(CvSeq),sizeof(CvPoint),stor);//找到所有轮廓cvFindContours(dst,stor,&cont,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));//直接使用CONTOUR中的矩形来画轮廓for(;cont;cont=cont-h_next){flag=0;CvRectr=((CvContour*)cont)-rect;if(r.height*r.widthCONTOUR_MAX_AERA){cvRectangle(img,cvPoint(r.x,r.y),cvPoint(r.x+r.width,r.y+r.height),CV_RGB(255,0,0),1,CV_AA,0);flag=1;}else{flag=0;}}cvReleaseMemStorage(&stor);cvReleaseImage(&pyr);}intmain(intargc,char**argv){IplImage*motion=0;CvCapture*capture=0;//视频获取结构while(1){capture=cvCreateFileCapture(D:\\IR_Object\\IR3.avi);if(capture){cvNamedWindow(Motion,1);for(;;){SYSTEMTIMEsys;//获取当前系统时间GetLocalTime(&sys);char*t_y=newchar[128];sprintf(t_y,(%4.4d-%2.2d-%2.2d%2.2d:%2.2d:%2.2d),sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond);CvFontfont;cvInitFont(&font,CV_FONT_HERSHEY_COMPLEX,0.5,0.5,0,2,8);IplImage*image;if(!cvGrabFrame(capture))//从摄像头或者视频文件中抓取帧break;image=cvRetrieveFrame(capture);//取回由函数cvGrabFrame抓取的图像,返回由函数cvGrabFrame抓取的图像的指针if(image){if(!motion){motion=cvCreateImage(cvSize(image-width,image-height),8,1);cvZero(motion);motion-origin=image-origin;///*0-顶—左结构,1-底—左结构(Windowsbitmaps风格)*/}}update_mhi(image,motion,6);cvPutText(image,t_y,cvPoint(10,25),&font,CV_RGB(255,0,0));cvShowImage(Motion,image);if(cvWaitKey(10)=0)break;}cvReleaseCapture(&capture);cvDestroyWindow(Motion);}}return0;}
本文标题:Opencv视频运动跟踪代码
链接地址:https://www.777doc.com/doc-5994935 .html