#包括“简历。”#包括“highgui。”#包括<高>时间。#包括<数学的。”#包括< ctype小时>。#包括<工作室的。“#包括<字符串>的。一双mhi_duration =0.1;一双max_time_delta =0.5;一双min_time_delta =0.05;整型常量=3;整型常量contour_max_aera =10;iplimage * * BCN =0;最后=0;iplimage *三菱重工=0;cvfilter cv_gaussian_5x5滤波器;cvconnectedcomp * cur_comp,min_comp;cvconnectedcomp补偿;cvmemstorage*;cvpoint铂[ 4];无效update_mhi(iplimage * - *,iplimage夏令时,国际diff_threshold){双时间戳= clock() / 1。;cvsize大小= cvsize(- - - - > >宽度,高度);在我,idx1,idx2;iplimage * silh;iplimage *芘= cvcreateimage(cvsize((size.width及- 2)/ 2,(size.height及- 2)/2),8,1);cvmemstorage *站;cvseq *续;先进行数据的初始化/ * * /如果(!三菱重工| |三菱重工- >宽度!= size.width | |三菱重工- >高度!= size.height){如果(缓冲区= =0){但是=(iplimage * *(*)内存大小(字节[ 0]));memset(缓冲区,0,* size of(字节[ 0]));}为(=0;我的;我+ +){cvreleaseimage(&,[我]);但是[我] = cvcreateimage(大小,ipl_depth_8u,1);cvzero(字节[我]);}cvreleaseimage(与三菱重工);三菱重工= cvcreateimage(大小,ipl_depth_32f,1);cvzero(三菱重工);}cvcvtcolor(1mg,但是[上],cv_bgr2gray);最后idx1=;idx2=(上+1)%氮;最后idx2=;silh =但是[ idx2];cvabsdiff(缓冲区缓冲区idx2[ idx1],[ ],silh);cvthreshold(silh,silh,30,255,cv_thresh_binary);cvupdatemotionhistory(silh,三菱重工,时间戳,mhi_duration);cvcvtscale(三菱重工,测试,255/ mhi_duration,(mhi_duration -时间)* 255/ mhi_duration。);cvcvtscale(三菱重工,测试,255/ mhi_duration,0。);cvsmooth(夏令时间,日光节约时间,cv_median,3,0,0,0);cvpyrdown(夏令时,芘,7);cvdilate(吡啶酚,酚,0,1);cvpyrup(芘,测试,7);故事= cvcreatememstorage(0);续= cvcreateseq(cv_seq_eltype_point,size of(cvseq),大小(cvpoint),故事);cvfindcontours(夏令时,故事,和控制,尺寸(cvcontour),cv_retr_list,cv_chain_approx_simple,cvpoint(0 , 0));为(;控制;控制=续- > h_next){cvrect =((cvcontour *)续)- >矩形;如果(r.height * r.width > contour_max_aera){cvrectangle(1mg,cvpoint(支持,酵母),cvpoint(支持+ r.width,酵母+ r.height),cv_rgb(255,0,0),1,cv_aa,0);}}cvreleasememstorage(与故事);cvreleaseimage(与他们);}cvreleasememstorage(与故事);cvreleaseimage(与他们);诠释主体(国际argc,字符* * argv){iplimage *运动=0;cvcapture *捕捉=0;拍摄cvcapturefromfile(“:/ / capture1的。”);如果(捕获)cvnamedwindow(“视频分析”,1);{为(;;){iplimage *图像;如果(!cvgrabframe(捕获))打破;图像cvretrieveframe(捕获);如果(图像){如果(!运动){运动= cvcreateimage(cvsize(图像- >宽度,图像- >高度),8,1);cvzero(运动);运动- >起源=图像- >起源;}}update_mhi(图像,运动,60);cvshowimage(“视频分析”,形象);如果(cvwaitkey(10)> =0)打破;}cvreleasecapture(捕捉);cvdestroywindow(“视频分析”);}返回0;}希望采纳
纳闷,opencv书上不是有各个函数的功能吗,也可以上网查啊,我不具体看了,大概看一下吧如果你知道目标提取的一些方法,这个看懂不难,抱歉没啥时间给你看,自己努力下吧。大致的思路是:通过背景差或帧差的方法获取两者的差别,并通过设定阈值,将差别较大的认为是前景目标,然后通过一些腐蚀、膨胀、滤波(比如中值滤波)提取出前景目标,然后去除小目标减少干扰,并用矩形框将结果框出来,很简单,自己对照着这个思想好好看看代码吧,凡是要靠自己努力才能成长。祝学业有成~void update_mhi( IplImage* img, IplImage* dst, int diff_threshold ){ double timestamp = clock()/1.; CvSize size = cvSize(img->width,img->height); int i, 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; i < N; 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图像转为灰度图像,可能create一下单通道的图像,存放转换结果的。 idx1 = last; idx2 = (last + 1) % N; last = idx2; silh = buf[idx2]; cvAbsDiff( buf[idx1], buf[idx2], silh ); //做差,我想是通过差分的方法,提取前景目标的,也就是当前图像与背景图像作差,提取前景目标。 cvThreshold( silh, silh, 30, 255, CV_THRESH_BINARY );//这里阈值化,相差30像素以上为前景目标 cvUpdateMotionHistory( silh, mhi, timestamp, MHI_DURATION ); cvCvtScale( mhi, dst, 255./MHI_DURATION, (MHI_DURATION - timestamp)*255./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 ); 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));//找轮廓及个数 for(;cont;cont = cont->h_next) { CvRect r = ((CvContour*)cont)->rect;//加上矩形框,也就是将前景目标框出来 if(r.height * r.width > CONTOUR_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); } } cvReleaseMemStorage(&stor); cvReleaseImage( &pyr );} cvReleaseMemStorage(&stor); cvReleaseImage( &pyr );}
你可以到七七计算机毕业论文的毕业设计题目列表中找一份。有完整的论文和源码等,很详细
这种运动目标检测的方法还是很经典的,下面写了一些注释仅作参考,希望对你有所帮助。#include "stdafx.h"#include "cv.h"#include "highgui.h"#include
--------------------------------------------------------------------------% 基于中位数算法的运动目标检测% 第1种实现方法%--------------------------------------------------------------------------%*******************************读取视频数据********************************% 调用aviread函数读取视频文件vid = aviread('WalkingMan.avi')size(vid(1).cdata) % 查看第1帧的大小,也是每一帧的大小vid(1).colormap % 查看第1帧的colormap值%*****************************数据类型的转换********************************% 把vid的cdata字段的取值转换成一个240×360×3×80的四维数组IMIM = cat(4,vid.cdata);size(IM) % 查看IM的大小[m,n,k,h] = size(IM); % 把IM的大小赋给四个变量% 把IM转换成一个80行,240×360×3列的矩阵I = reshape(IM,[m*n*k,h])';%********************调用median函数求中位数,进行视频图像分割****************I = median(I); % 求I矩阵中各列元素的中位数I = reshape(I,[m,n,k]); % 将向量I转成240×360×3的三维数组,得到背景图像figure; % 新建一个图形窗口imshow(I); % 显示背景图像figure; % 新建一个图形窗口imshow(IM(:,:,:,1) - I); % 显示第1帧中的目标图像%--------------------------------------------------------------------------% 基于中位数算法的运动目标检测% 第1种实现方法%--------------------------------------------------------------------------% 调用mmreader函数创建读取视频文件的多媒体阅读对象WalkManObjWalkManObj = mmreader('WalkingMan.avi');% 根据多媒体阅读对象WalkManObj,读取视频的各帧图像数据IM = read(WalkManObj, [1, inf]);[m,n,k,h] = size(IM); % 把IM的大小赋给四个变量% 把IM转换成一个80行,240×360×3列的矩阵I = reshape(IM,[m*n*k,h])';I = median(I); % 求I矩阵中各列元素的中位数I = reshape(I,[m,n,k]); % 将向量I转成240×360×3的三维数组,得到背景图像figure; % 新建一个图形窗口imshow(I); % 显示背景图像figure; % 新建一个图形窗口imshow(IM(:,:,:,1) - I); % 显示第1帧中的目标图像
这只是一个静态背景的运动物体检测程序:至于计数,我建议你使用先提取contour 然后计算coutour的number。// 2012-5-8 21:05:30// Moving object recognision// By David Ding#include "stdafx.h"#include
309 浏览 8 回答
118 浏览 4 回答
184 浏览 4 回答
152 浏览 2 回答
138 浏览 5 回答
289 浏览 4 回答
135 浏览 3 回答
220 浏览 2 回答
350 浏览 2 回答
350 浏览 6 回答
172 浏览 3 回答
353 浏览 5 回答
298 浏览 3 回答
107 浏览 4 回答
146 浏览 2 回答