OpenCV读视频文件和运动物体检测

简要说明:本程序 尝试打开本电脑上的摄像头作为视频输入设备,或者将命令行的输入参数作为文件名来打开的视频文件。不管是哪一种方法,最后都是不断的循环处理一帧一帧地处理,涉及到的图像处理有 背景擦除,平滑滤波,二值化等。

转自:

http://www.opencv.org.cn/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B

 

有微小调整。在VS2005+OpenCV下调试通过。

 


  1. #include <stdafx.h> 
  2. #include <stdio.h> 
  3. #include <cv.h> 
  4. #include <cxcore.h> 
  5. #include <highgui.h> 
  6.   
  7. int main( int argc, char** argv ) 
  8.     //声明IplImage指针 
  9.     IplImage* pFrame = NULL;  
  10.     IplImage* pFrImg = NULL; 
  11.     IplImage* pBkImg = NULL; 
  12.  
  13.     CvMat* pFrameMat = NULL; 
  14.     CvMat* pFrMat = NULL; 
  15.     CvMat* pBkMat = NULL; 
  16.  
  17.     CvCapture* pCapture = NULL; 
  18.  
  19.     int nFrmNum = 0; 
  20.  
  21.     //创建窗口 
  22.     cvNamedWindow("video", 1); 
  23.     cvNamedWindow("background",1); 
  24.     cvNamedWindow("foreground",1); 
  25.     //使窗口有序排列 
  26.     cvMoveWindow("video", 30, 0); 
  27.     cvMoveWindow("background", 360, 0); 
  28.     cvMoveWindow("foreground", 690, 0); 
  29.  
  30.  
  31.     if( argc > 2 ) 
  32.     { 
  33.         fprintf(stderr, "Usage: bkgrd [video_file_name]\n"); 
  34.         return -1; 
  35.     } 
  36.  
  37.     //打开摄像头 
  38.     if (argc ==1) 
  39.     { 
  40.         if( !(pCapture = cvCaptureFromCAM(0))) 
  41.         { 
  42.             fprintf(stderr, "Can not open camera.\n"); 
  43.             return -2; 
  44.         } 
  45.     } 
  46.     //打开视频文件 
  47.     if(argc == 2) 
  48.     { 
  49.         if( !(pCapture = cvCaptureFromFile(argv[1]))) 
  50.         { 
  51.             fprintf(stderr, "Can not open video file %s\n", argv[1]); 
  52.             return -2; 
  53.         } 
  54.     } 
  55.     //逐帧读取视频 
  56.     while(pFrame = cvQueryFrame( pCapture )) 
  57.     { 
  58.         nFrmNum++; 
  59.  
  60.         //如果是第一帧,需要申请内存,并初始化 
  61.         if(nFrmNum == 1) 
  62.         { 
  63.             pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1); 
  64.             pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1); 
  65.  
  66.             pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 
  67.             pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 
  68.             pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); 
  69.  
  70.             //转化成单通道图像再处理 
  71.             cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY); 
  72.             cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); 
  73.  
  74.             cvConvert(pFrImg, pFrameMat); 
  75.             cvConvert(pFrImg, pFrMat); 
  76.             cvConvert(pFrImg, pBkMat); 
  77.         } 
  78.         else 
  79.         { 
  80.             cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY); 
  81.             cvConvert(pFrImg, pFrameMat); 
  82.             //高斯滤波先,以平滑图像 
  83.             //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0); 
  84.  
  85.             //当前帧跟背景图相减 
  86.             cvAbsDiff(pFrameMat, pBkMat, pFrMat); 
  87.  
  88.             //二值化前景图 
  89.             cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY); 
  90.  
  91.             //进行形态学滤波,去掉噪音   
  92.             //cvErode(pFrImg, pFrImg, 0, 1); 
  93.             //cvDilate(pFrImg, pFrImg, 0, 1); 
  94.  
  95.             //更新背景 
  96.             cvRunningAvg(pFrameMat, pBkMat, 0.003, 0); 
  97.             //将背景转化为图像格式,用以显示 
  98.             cvConvert(pBkMat, pBkImg); 
  99.  
  100.             //显示图像 
  101.             cvShowImage("video", pFrame); 
  102.             cvShowImage("background", pBkImg); 
  103.             cvShowImage("foreground", pFrImg); 
  104.  
  105.             //如果有按键事件,则跳出循环 
  106.             //此等待也为cvShowImage函数提供时间完成显示 
  107.             //等待时间可以根据CPU速度调整 
  108.             if( cvWaitKey(2) >= 0 ) 
  109.                 break
  110.         } 
  111.     } 
  112.      
  113.     //销毁窗口 
  114.     cvDestroyWindow("video"); 
  115.     cvDestroyWindow("background"); 
  116.     cvDestroyWindow("foreground"); 
  117.  
  118.     //释放图像和矩阵 
  119.     cvReleaseImage(&pFrImg); 
  120.     cvReleaseImage(&pBkImg); 
  121.  
  122.     cvReleaseMat(&pFrameMat); 
  123.     cvReleaseMat(&pFrMat); 
  124.     cvReleaseMat(&pBkMat); 
  125.  
  126.     cvReleaseCapture(&pCapture); 
  127.  
  128.     return 0; 









本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/278918,如需转载请自行联系原作者
上一篇:浅谈多环境中的Kubernetes集群Prometheus+InfluxDB+Grafana监控方案


下一篇:前端的小玩意(9.3)——做一个仿360工具箱的web页面(我的工具里的模板和样式)