织梦CMS - 轻松建站从此开始!

罗索

OpenCV编程案例:读视频文件和运动物体检测

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

来自于仕琪的讲稿《使用OpenCV进行图像处理》中的例程

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

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

refered to: 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

(于仕琪)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9155.html]
本文出处:OpenCV China 作者:于仕琪
顶一下
(6)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容