bkgrd.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:3k
源码类别:

OpenCV

开发平台:

Visual C++

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