• Open Source Computer Vision Library

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

Wikipedia,自由的百科全书

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

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