高斯背景建模

高斯背景建模

代码:

#include <stdio.h>

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

#include <cvaux.h>//必须引此头文件

int main( int argc, char** argv )

{ 

 

   IplImage* pFrame = NULL;   

   IplImage* pFrImg = NULL; 

   IplImage* pBkImg = NULL;   

   CvCapture* pCapture = NULL;   

   int nFrmNum = 0;



   cvNamedWindow("video", 1); 

   cvNamedWindow("background",1); 

   cvNamedWindow("foreground",1);   

   cvMoveWindow("video", 30, 0); 

   cvMoveWindow("background", 360, 0); 

   cvMoveWindow("foreground", 690, 0);

   if( argc > 2 )   

   {     

      fprintf(stderr, "Usage: bkgrd [video_file_name]\n");     

      return -1;   

   }



   

   //打开视频文件 

   if(argc == 1)   

      if( !(pCapture = cvCaptureFromFile(argv[1])))     

      {   

         fprintf(stderr, "Can not open video file %s\n", argv[1]);   

         return -2;     

      }

   //打开摄像头 

   if (argc == 2)   

      if( !(pCapture = cvCaptureFromCAM(-1)))     

      {   

         fprintf(stderr, "Can not open camera.\n");   

         return -2;     

      }   

 

                //初始化高斯混合模型参数

   CvGaussBGModel* bg_model=NULL;



   while(pFrame = cvQueryFrame( pCapture ))   

   {     

      nFrmNum++;           

      if(nFrmNum == 1)   

      {    

         pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,3);   

         pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);     

    



         //高斯背景建模,pFrame可以是多通道图像也可以是单通道图像

          //cvCreateGaussianBGModel函数返回值为CvBGStatModel*,

          //需要强制转换成CvGaussBGModel*

         bg_model = (CvGaussBGModel*)cvCreateGaussianBGModel(pFrame, 0);

      }     

      else

      {    

                 //更新高斯模型

        cvUpdateBGStatModel(pFrame, (CvBGStatModel *)bg_model );



         //pFrImg为前景图像,只能为单通道

          //pBkImg为背景图像,可以为单通道或与pFrame通道数相同

         cvCopy(bg_model->foreground,pFrImg,0);

            cvCopy(bg_model->background,pBkImg,0);



         //把图像正过来

         pBkImg->origin=1;

         pFrImg->origin=1;

 

         cvShowImage("video", pFrame);    

         cvShowImage("background", pBkImg);    

         cvShowImage("foreground", pFrImg);       

         if( cvWaitKey(2) >= 0 )      

            break;     

      }     

   

   }



   //释放高斯模型参数占用内存   

   cvReleaseBGStatModel((CvBGStatModel**)&bg_model);

   cvDestroyWindow("video"); 

   cvDestroyWindow("background"); 

   cvDestroyWindow("foreground");   

   cvReleaseImage(&pFrImg); 

   cvReleaseImage(&pBkImg);   

   cvReleaseCapture(&pCapture);   

   return 0;

} 



你可能感兴趣的:(背景)