OpenCV开发——高斯背景建模

Home / C++ MrLee 2015-7-10 4535

37d12f2eb9389b50bc2845958435e5dde6116e26


高斯模型是一种图像处理背景提取的处理方法,适用于背景单一不变的场合,其他如混合高斯模型等方法都是对单高斯模型的扩展,单以单高斯模型最为简便,而且采取参数迭代方式,不用每次都进行建模处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#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 == 2)  
      if( !(pCapture = cvCaptureFromFile(argv[1])))    
      {  
         fprintf(stderr, "Can not open video file %sn", argv[1]);  
         return -2;    
      }
   //打开摄像头
   if (argc == 1)  
      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;
}
</cvaux.h></highgui.h></cxcore.h></cv.h></stdio.h>

本文链接:https://it72.com:4443/3681.htm

推荐阅读
最新回复 (0)
返回