#include "cv.h"
#include "highgui.h"
#include <time.h>
#include <math.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
const double MHI_DURATION = 0.5;
const double MAX_TIME_DELTA = 0.5;
const double MIN_TIME_DELTA = 0.05;
const int N = 3;
const int CONTOUR_MAX_AERA = 16;
IplImage **buf = 0;
int last = 0;
IplImage *mhi = 0;
CvFilter filter = CV_GAUSSIAN_5x5;
CvConnectedComp *cur_comp,min_comp;
CvConnectedComp comp;
CvMemStorage *storage;
CvPoint pt[4];
//参数:img - 输入视频帧 dst - 检测结果
void update_mhi(IplImage* img, IplImage* dst, int diff_threshold)
{
double timestamp = clock()/100.; //get current time in seconds
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);
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);
cvUpdateMotionHistory(silh,mhi,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);
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)
{
if(cont->total<6)
continue;
cvDrawContours(img,cont,CV_RGB(255,0,0),CV_RGB(255,0,0),0,1,8,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);
}
int main(int argc,char** argv)
{
IplImage* motion = 0;
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);
else if(argc==2)
capture = cvCaptureFromAVI(argv[1]);
if(capture)
{
cvNamedWindow("Motion",1);
for(;;)
{
IplImage* image;
if(!cvGrabFrame(capture))
break;
image = cvRetrieveFrame(capture);
if(image)
{
if(!motion)
{
motion = cvCreateImage(cvSize(image->width,image->height),8,1);
cvZero(motion);
motion->origin = image->origin;
}
}
update_mhi(image,motion,60);
cvShowImage("Motion",image);
if(cvWaitKey(10)>=0)
break;
}
cvReleaseCapture(&capture);
cvDestroyWindow("Motion");
}
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Motiondetect.rar (6个子文件)
Motiondetect
Motiondetect.cpp 3KB
Motiondetect.dsp 4KB
Motiondetect.ncb 33KB
Motiondetect.opt 48KB
Motiondetect.dsw 549B
Motiondetect.plg 258B
共 6 条
- 1
Aurora_406
- 粉丝: 25
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页