bgextr.cpp
上传用户:chinafyp
上传日期:2008-11-02
资源大小:186k
文件大小:4k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <cv.h>
  3. #include <cxcore.h>
  4. #include <highgui.h>
  5. // 定义文字颜色
  6. CvScalar fcWhite = cvRealScalar(255);
  7. CvScalar fcBlack = cvRealScalar(0);
  8. int main(int argc, char *argv[])
  9. {
  10. // 声明字体
  11. CvFont fWarnning;
  12. // 声明IplImage指针
  13. IplImage *pFrameOri = NULL;
  14. IplImage *pFrame = NULL;
  15. IplImage *pFrImg = NULL;
  16. IplImage *pBkImg = NULL;
  17. CvMat* pFrameMat = NULL;
  18. CvMat* pFrMat = NULL;
  19. CvMat* pBkMat = NULL;
  20.   
  21. CvCapture *pCapture = NULL;
  22.   
  23. int nFrmNum = 0; // 桢记数器
  24. // 创建窗口
  25. cvNamedWindow("video", 1);
  26. cvNamedWindow("background", 1);
  27. cvNamedWindow("foreground", 1);
  28. // 排列窗口
  29. cvMoveWindow("video", 15, 80);
  30. cvMoveWindow("background", 345, 80);
  31. cvMoveWindow("foreground", 675, 80);
  32. // 初始化字体
  33. cvInitFont(&fWarnning, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.4, 0, 1, 8);
  34. if(argc > 2) {
  35. fprintf(stderr, "Usage: %s [video_file_name]n", argv[0]);
  36. return -1;
  37. }
  38. /* // 打开摄像头
  39. if (argc == 1)
  40. if( !(pCapture = cvCaptureFromCAM(-1)) ) {
  41. fprintf(stderr, "Can not open camera.n");
  42. return -2;
  43. }
  44. */
  45. // 打开视频文件
  46. if(argc == 2) {
  47. if(*argv[1] == '/') {
  48. fprintf(stdout, "Usage: %s [video_file_name]n", argv[0]);
  49. return -1;
  50. } else if( !(pCapture = cvCreateFileCapture(argv[1])) ) {
  51. fprintf(stderr, "Can not open video file %sn", argv[1]);
  52. return -2;
  53. }
  54. }
  55. // pCapture = cvCreateFileCapture("DV11_perfect_xvid.avi"); // For easier debug only :)
  56. // 逐帧读取视频
  57. while(pFrameOri = cvQueryFrame(pCapture)) {
  58. nFrmNum++;
  59. // 缩放图象
  60. pFrame = cvCreateImage(cvSize(360, 288), IPL_DEPTH_8U, 3);
  61. pFrame->origin = 1; // 反转图象存储
  62. cvResize(pFrameOri, pFrame, CV_INTER_LINEAR);
  63. // 如果是第一帧,申请内存并初始化
  64. if(nFrmNum == 1) {
  65. pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1);
  66. pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U, 1);
  67. // 上下反转图象存储
  68. pBkImg->origin = 1;
  69. pFrImg->origin = 1;
  70. pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  71. pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  72. pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  73. // 原始图象转化成单通道图像再处理
  74. cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
  75. cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
  76. // 图象转换为象素矩阵
  77. cvConvert(pFrImg, pFrameMat);
  78. cvConvert(pFrImg, pFrMat);
  79. cvConvert(pFrImg, pBkMat);
  80. } else {
  81. // 单通道转换
  82. cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
  83. cvConvert(pFrImg, pFrameMat);
  84. // 高斯滤波,以平滑图像
  85. //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);
  86. if(nFrmNum >= 400) {
  87. // 当前帧跟背景图相减
  88. cvAbsDiff(pFrameMat, pBkMat, pFrMat);
  89. // 二值化前景图
  90. cvThreshold(pFrMat, pFrImg, 35, 255.0, CV_THRESH_BINARY);
  91. // 进行形态学滤波,闭运算,突出车体
  92. //cvDilate(pFrImg, pFrImg, 0, 2); // 膨胀
  93. //cvErode(pFrImg, pFrImg, 0, 2); // 腐蚀
  94. } else if(nFrmNum % 30 <= 20)
  95. cvPutText(pFrImg, "PLEASE WAIT WHILE EXTRACTING ...", cvPoint(40, pFrame->height/2), &fWarnning, fcWhite);
  96. // 更新背景
  97. cvRunningAvg(pFrameMat, pBkMat, 0.004, 0);
  98. // 将背景转化为图像格式,用以显示
  99. cvConvert(pBkMat, pBkImg);
  100. // 显示图像
  101. cvShowImage("video", pFrame);
  102. cvShowImage("background", pBkImg);
  103. cvShowImage("foreground", pFrImg);
  104. // 如果有按键事件,则跳出循环
  105. // 此等待也为cvShowImage函数提供时间完成显示
  106. // 等待时间可以根据CPU速度调整
  107. if( cvWaitKey(2) >= 0 )
  108. break;
  109. }
  110. cvReleaseImage(&pFrame);
  111. }
  112. // 销毁窗口
  113. cvDestroyAllWindows();
  114. // 释放图像和矩阵
  115. cvReleaseImage(&pFrame);
  116. cvReleaseImage(&pFrImg);
  117. cvReleaseImage(&pBkImg);
  118. cvReleaseMat(&pFrameMat);
  119. cvReleaseMat(&pFrMat);
  120. cvReleaseMat(&pBkMat);
  121. cvReleaseCapture(&pCapture);
  122. return 0;
  123. }