




已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年河北邯郸成安县事业单位招聘工作人员255名笔试备考题库及完整答案详解1套
- 山东省五莲县2024-2025学年高二下学期3月月考物理试题(解析版)
- 湖北省2024-2025学年高一下学期4月期中联考物理试题(解析版)
- 江苏省盐城市联盟校2024-2025学年高二下学期第二次阶段性考试语文试题(含答案)
- 浙江省桐浦富兴教研联盟2024-2025学年高二下学期5月月考物理试题(扫描版含答案)
- 笑声与色彩元旦的故事会
- 核动力船舶乏燃料尾气的氙氪吸附分离研究
- 数学 2024-2025学年人教版七年级数学下册解答题及压轴题练习
- (完整版)小学教育心理学试题及答案
- 2019-2025年试验检测师之道路工程过关检测试卷B卷附答案
- 用户侧储能电站项目可行性研究报告(范文)
- 2024-2025学年沪教版(五四学制)(2024)初中英语六年级下册(全册)知识点归纳
- 2025年绵阳富乐中学小升初数学、语文入学考试题
- 知识图谱与大语言模型在教育领域的应用综述
- 2025广西桂盛金融信息科技服务有限公司专业技术人员常态化招聘笔试参考题库附带答案详解
- 红色经典图书出版行业深度调研及发展战略咨询报告
- 2017年辽宁省鞍山市中考化学试卷(解析)
- 河南省五年中考(2020-2024)化学真题试卷含答案
- 音乐教学培训创业计划
- (一模)2025年广东省高三高考模拟测试一模化学试卷(含官方答案)
- 2024年河南省开封市小学五年级上学期期末英语试卷及答案指导
评论
0/150
提交评论