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

OpenCV

开发平台:

Visual C++

  1. #include "myfgdetector.h"
  2. MyFGDetector::MyFGDetector()
  3. {
  4.   this->Create(0.003, 60.0);
  5. }
  6. MyFGDetector::MyFGDetector(double alpha, double threshold)
  7. {
  8.   this->Create(alpha, threshold);
  9. }
  10. MyFGDetector::~MyFGDetector()
  11. {
  12.   this->Release();
  13. }
  14. void MyFGDetector::Create(double alpha, double threshold)
  15. {
  16.   m_framecount = 0;
  17.   m_alpha = alpha;
  18.   m_threshold = threshold;
  19.   m_pFrame=0;
  20.   m_pFGMask=0;
  21.   m_pFrameMat=0;
  22.   m_pFGMat=0;
  23.   m_pBkMat=0;
  24. }
  25. IplImage* MyFGDetector::GetMask()
  26. {
  27.   return m_pFGMask;
  28. }
  29. void MyFGDetector::Release()
  30. {
  31.   m_framecount = 0;
  32.   if(m_pFrame) cvReleaseImage(&m_pFrame);
  33.   if(m_pFGMask) cvReleaseImage(&m_pFGMask);
  34.   if(m_pFrameMat) cvReleaseMat(&m_pFrameMat);
  35.   if(m_pFGMat) cvReleaseMat(&m_pFGMat);
  36.   if(m_pBkMat) cvReleaseMat(&m_pBkMat);
  37. }
  38. void MyFGDetector::Process(IplImage* pFrame)
  39. {
  40.   if(m_framecount==0)
  41.     {
  42.       m_pFGMask = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);
  43.       m_pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  44.       m_pFGMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  45.       m_pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
  46.       
  47.       if( !m_pFGMask || !m_pBkMat || !m_pFGMat || !m_pFrameMat)
  48. {
  49.   fprintf(stderr, "Can not alloc memeory.n");
  50.   return ;
  51. }
  52.       //convert to single channel
  53.       cvCvtColor(pFrame, m_pFGMask, CV_BGR2GRAY);
  54.       cvConvert(m_pFGMask, m_pFrameMat);
  55.       cvConvert(m_pFGMask, m_pFGMat);
  56.       cvConvert(m_pFGMask, m_pBkMat);
  57.     }
  58.   //转化成单信道图像再处理
  59.   cvCvtColor(pFrame, m_pFGMask, CV_BGR2GRAY);
  60.   cvConvert(m_pFGMask, m_pFrameMat);
  61.   //高斯滤波先,以平滑图像
  62.   cvSmooth(m_pFrameMat, m_pFrameMat, CV_GAUSSIAN, 3, 0, 0);
  63.   
  64.   //当前帧跟背景图相减
  65.   cvAbsDiff(m_pFrameMat, m_pBkMat, m_pFGMat);
  66.   //二值化前景图
  67.   cvThreshold(m_pFGMat, m_pFGMask, m_threshold, 255.0, CV_THRESH_BINARY);
  68.   //进行形态学滤波,去掉噪音  
  69.   cvErode(m_pFGMask, m_pFGMask, 0, 1);
  70.   cvDilate(m_pFGMask, m_pFGMask, 0, 1);
  71.   //更新背景
  72.   cvRunningAvg(m_pFrameMat, m_pBkMat, 0.003, 0);
  73.  
  74.   m_framecount++;
  75. }