连续3帧法与背景更新.doc_第1页
连续3帧法与背景更新.doc_第2页
连续3帧法与背景更新.doc_第3页
连续3帧法与背景更新.doc_第4页
连续3帧法与背景更新.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

连续3帧法与背景更新相结合的方法的程序一 关键字: opencv 运动检测 更新背. #include #include #include #include #include / 显示矩阵void PrintMat(CvMat* A) int i,j; /printf(nMatrix = :); for(i=0;irows;i+) printf(n); switch( CV_MAT_DEPTH(A-type) ) case CV_32F: case CV_64F: for(j=0;jcols;j+) printf(%9.3f , (float) cvGetReal2D( A, i, j ); break; case CV_8U: case CV_16U: for(j=0;jcols;j+) printf(%6d,(int)cvGetReal2D( A, i, j ); break; default: break; printf(n);int main( int argc, char* argv )/声明IplImage指针IplImage* pFrame = NULL; /pFrame为视频截取的一帧IplImage* pFrame1 = NULL;IplImage* pFrame2 = NULL;IplImage* pFrame3 = NULL;IplImage* pFrImg = NULL; /pFrImg为当前帧的灰度图IplImage* pBkImg = NULL; /pBkImg为当前背景灰度图IplImage* pBkImgTran = NULL; /IplImage* pFrImgTran = NULL;CvMat* pFrameMat = NULL; /pFrameMat为当前灰度矩阵CvMat* pFrMat = NULL; /pFrMat为当前前景图矩阵,当前帧减去背景图CvMat* bg1 = NULL;CvMat* bg2 = NULL;CvMat* bg3 = NULL;CvMat* pFrMatB = NULL; /pFrMatB为二值化(0,1)的前景图CvMat* pBkMat = NULL;CvMat* pZeroMat = NULL; /用于计算bg1 - bg2 的值CvMat* pZeroMatB = NULL; CvMat* pBkMatTran = NULL;CvMat* pFrMatTran = NULL;CvCapture* pCapture = NULL;int warningNum = 0; /检测到有异物入侵的像数点个数int nFrmNum = 0;int status = 0; /状态标志位,/创建窗口cvNamedWindow(video, 1);cvNamedWindow(background,1);cvNamedWindow(foreground,1);/使窗口有序排列cvMoveWindow(video, 30, 0);cvMoveWindow(background, 360, 0);cvMoveWindow(foreground, 690, 0);if( argc 2 ) fprintf(stderr, Usage: bkgrd video_file_namen); return -1; /打开摄像头if (argc =1) if( !(pCapture = cvCaptureFromCAM(-1) fprintf(stderr, Can not open camera.n);return -2; /打开视频文件if(argc = 2) if( !(pCapture = cvCaptureFromFile(argv1) fprintf(stderr, Can not open video file %sn, argv1);return -2; /开始计时time_t start,end;time(&start); /time() 返回从1970年1月1号00:00:00开始以来到现在的秒数(有10为数字)。printf(%dn,start);/逐帧读取视频while(pFrame = cvQueryFrame( pCapture ) nFrmNum+; /如果是第一帧,需要申请内存,并初始化 if(nFrmNum = 1) pBkImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); pFrImg = cvCreateImage(cvSize(pFrame-width, pFrame-height), IPL_DEPTH_8U,1); pBkImgTran = cvCreateImage(cvSize(pFrame-width,pFrame-height), IPL_DEPTH_8U,1); pFrImgTran = cvCreateImage(cvSize(pFrame-width,pFrame-height), IPL_DEPTH_8U,1); pBkMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pZeroMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pFrMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pFrMatB = cvCreateMat(pFrame-height, pFrame-width, CV_8UC1); pZeroMatB = cvCreateMat(pFrame-height, pFrame-width, CV_8UC1); pBkMatTran = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pFrMatTran = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); pFrameMat = cvCreateMat(pFrame-height, pFrame-width, CV_32FC1); cvZero(pZeroMat); /转化成单通道图像再处理 cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY); cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); cvConvert(pFrImg, pFrameMat); cvConvert(pFrImg, pFrMat); cvConvert(pFrImg, pBkMat); cvFlip(pBkMat, pBkMatTran,0); cvFlip(pFrMat, pFrMatTran,0); else /pFrImg为当前帧的灰度图 cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); /pFrameMat为当前灰度矩阵 cvConvert(pFrImg, pFrameMat); /pFrMat为前景图矩阵,当前帧减去背景图 cvAbsDiff(pFrameMat, pBkMat, pFrMat); /pFrMatB为二值化(0,1)的前景图 cvThreshold(pFrMat,pFrMatB, 60, 1, CV_THRESH_BINARY);if( nFrmNum = 200) printf(NO.%d frame:n,nFrmNum); printf(pFrMatB-rows: %dn,pFrMatB-rows); /600行 printf(pFrMatB-cols: %dn,pFrMatB-cols); /800列 printf(pFrMatB-nonzero: %dn,cvCountNonZero(pFrMatB); /printf(pFrMatB-Sum: %dn,cvSum(pFrMatB); time(&end); printf(%dn,end); /动态更新背景的方法 /cvRunningAvg(pFrameMat, pBkMat, 0.1, 0); /将背景转化为图像格式,用以显示 cvConvert(pBkMat, pBkImg); /显示图像 cvShowImage(video, pFrame); cvFlip(pBkMat, pBkMatTran,0); /将背景矩阵颠倒,解决opencv一个bug, 用于正确显示 cvFlip(pFrMat, pFrMatTran,0); /将前景矩阵颠倒,解决opencv一个bug, 用于正确显示 cvConvert(pBkMatTran, pBkImgTran); /将颠倒后的背景矩阵转化为背景灰度图 cvThreshold(pFrMatTran, pFrImgTran, 60, 255.0, CV_THRESH_BINARY); /将前景矩阵中相数点 10000 & status = 0) /表示是第一帧的异物大于1W个像数点 cvReleaseImage(&pFrame1); pFrame1 = cvCloneImage(pFrame); cvReleaseMat(&bg1); bg1 = cvCloneMat(pFrMat); status = 1; /继续采集第2帧 else if(cvCountNonZero(pFrMatB) 10000 & status = 1)/ 表示第一帧和第二帧的异物都大于1W个像数点 cvReleaseImage(&pFrame2); pFrame2 = cvCloneImage(pFrame); cvReleaseMat(&bg2); bg2 = cvCloneMat(pFrMat); cvAbsDiff(bg1, bg2, pZeroMat); cvThreshold(pZeroMat,pZeroMatB, 20, 1, CV_THRESH_BINARY); if(cvCountNonZero(pZeroMatB) 3000 ) /表示他们不连续,这样的话要报警 printf(NO.%d warning!nn,warningNum+); status = 0; else status = 2; /继续采集第3帧 else if(cvCountNonZero(pFrMatB) 10000 & status = 2)/表示连续3帧的异物都大于1W个像数点 cvReleaseImage(&pFrame3); pFrame3 = cvCloneImage(pFrame); cvReleaseMat(&bg3); bg3 = cvCloneMat(pFrMat); cvAbsDiff(bg2, bg3, pZeroMat); cvThreshold(pZeroMat,pZeroMatB, 20, 1, CV_THRESH_BINARY); if(cvCountNonZero(pZeroMatB) 3000 ) /表示他们不连续,这样的话要报警 printf(NO.%d warning!nn,warningNum+); status = 0; else /表示bg2,bg3连续 cvReleaseMat(&pBkMat); pBkMat = cvCloneMat(pFrameMat); /更新背景 status = 0; /进入下一次采集过程 /如果有按键事件,则跳出循环 /此等待也为cvShowImage函数提供时间完成显示 /等待时间可以根据CPU速度调整 if( cvWaitKey(2) = 0 )

温馨提示

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

最新文档

评论

0/150

提交评论