【OpenCV】高斯混合背景建模

OpenCV中实现了两个版本的高斯混合背景/前景分割方法(Gaussian Mixture-based Background/Foreground Segmentation Algorithm)[1-2],调用接口很明朗,效果也很好。

BackgroundSubtractorMOG 使用示例

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int main(){  
  2.     VideoCapture video("1.avi");  
  3.     Mat frame,mask,thresholdImage, output;  
  4.     video>>frame;  
  5.     BackgroundSubtractorMOG bgSubtractor(20,10,0.5,false);  
  6.     while(true){  
  7.         video>>frame;  
  8.         ++frameNum;  
  9.         bgSubtractor(frame,mask,0.001);  
  10.         imshow("mask",mask);  
  11.         waitKey(10);  
  12.     }  
  13.     return 0;  
  14. }  

构造函数可以使用默认构造函数或带形参的构造函数:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. BackgroundSubtractorMOG::BackgroundSubtractorMOG()  
  2. BackgroundSubtractorMOG::BackgroundSubtractorMOG(int history, int nmixtures,   
  3. double backgroundRatio, double noiseSigma=0)  

其中history为使用历史帧的数目,nmixtures为混合高斯数量,backgroundRatio为背景比例,noiseSigma为噪声权重。

而调用的接口只有重载操作符():

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void BackgroundSubtractorMOG::operator()(InputArray image, OutputArray fgmask, double learningRate=0)  
其中image为当前帧图像,fgmask为输出的前景mask,learningRate为背景学习速率。

以下是使用BackgroundSubtractorMOG进行前景/背景检测的一个截图。


BackgroundSubtractorMOG2 使用示例

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int main(){  
  2.     VideoCapture video("1.avi");  
  3.     Mat frame,mask,thresholdImage, output;  
  4.     //video>>frame;  
  5.     BackgroundSubtractorMOG2 bgSubtractor(20,16,true);  
  6.       
  7.     while(true){  
  8.         video>>frame;  
  9.         ++frameNum;  
  10.         bgSubtractor(frame,mask,0.001);  
  11.         cout<<frameNum<<endl;  
  12.         //imshow("mask",mask);  
  13.         //waitKey(10);  
  14.     }  
  15.     return 0;  
  16. }  

同样的,构造函数可以使用默认构造函数和带形参的构造函数

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2()  
  2. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2(int history,   
  3. float varThreshold, bool bShadowDetection=true )  

history同上,varThreshold表示马氏平方距离上使用的来判断是否为背景的阈值(此值不影响背景更新速率),bShadowDetection表示是否使用阴影检测(如果开启阴影检测,则mask中使用127表示阴影)。

使用重载操作符()调用每帧检测函数:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)  
参数意义同BackgroundSubtractorMOG中的operator()函数。

同时BackgroundSubtractorMOG2提供了getBackgroundImage()函数用以返回背景图像:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. void BackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage)  

另外OpenCV的refman中说新建对象以后还有其他和模型油有关的参数可以修改,不过比较坑的是opencv把这个这些函数参数声明为protected,同时没有提供访问接口,所以要修改的话还是要自己修改源文件提供访问接口。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. protected:  
  2.     Size frameSize;  
  3.     int frameType;  
  4.     Mat bgmodel;  
  5.     Mat bgmodelUsedModes;//keep track of number of modes per pixel  
  6.     int nframes;  
  7.     int history;  
  8.     int nmixtures;  
  9.     //! here it is the maximum allowed number of mixture components.  
  10.     //! Actual number is determined dynamically per pixel  
  11.     double varThreshold;  
  12.     // threshold on the squared Mahalanobis distance to decide if it is well described  
  13.     // by the background model or not. Related to Cthr from the paper.  
  14.     // This does not influence the update of the background. A typical value could be 4 sigma  
  15.     // and that is varThreshold=4*4=16; Corresponds to Tb in the paper.  
  16.     /  
  17.     // less important parameters - things you might change but be carefull  
  18.       
  19.     float backgroundRatio;  
  20.     // corresponds to fTB=1-cf from the paper  
  21.     // TB - threshold when the component becomes significant enough to be included into  
  22.     // the background model. It is the TB=1-cf from the paper. So I use cf=0.1 => TB=0.  
  23.     // For alpha=0.001 it means that the mode should exist for approximately 105 frames before  
  24.     // it is considered foreground  
  25.     // float noiseSigma;  
  26.     float varThresholdGen;  
  27.     //correspondts to Tg - threshold on the squared Mahalan. dist. to decide  
  28.     //when a sample is close to the existing components. If it is not close  
  29.     //to any a new component will be generated. I use 3 sigma => Tg=3*3=9.  
  30.     //Smaller Tg leads to more generated components and higher Tg might make  
  31.     //lead to small number of components but they can grow too large  
  32.     float fVarInit;  
  33.     float fVarMin;  
  34.     float fVarMax;  
  35.     //initial variance  for the newly generated components.  
  36.     //It will will influence the speed of adaptation. A good guess should be made.  
  37.     //A simple way is to estimate the typical standard deviation from the images.  
  38.     //I used here 10 as a reasonable value  
  39.     // min and max can be used to further control the variance  
  40.     float fCT;//CT - complexity reduction prior  
  41.     //this is related to the number of samples needed to accept that a component  
  42.     //actually exists. We use CT=0.05 of all the samples. By setting CT=0 you get  
  43.     //the standard Stauffer&Grimson algorithm (maybe not exact but very similar)  
  44.     //shadow detection parameters  
  45.     bool bShadowDetection;//default 1 - do shadow detection  
  46.     unsigned char nShadowDetection;//do shadow detection - insert this value as the detection result - 127 default value  
  47.     float fTau;  
  48.     // Tau - shadow threshold. The shadow is detected if the pixel is darker  
  49.     //version of the background. Tau is a threshold on how much darker the shadow can be.  
  50.     //Tau= 0.5 means that if pixel is more than 2 times darker then it is not shadow  
  51.     //See: Prati,Mikic,Trivedi,Cucchiarra,"Detecting Moving Shadows...",IEEE PAMI,2003.  

以下是使用BackgroundSubtractorMOG2检测的前景和背景:

参考文献:

[1] KaewTraKulPong, Pakorn, and Richard Bowden. "An improved adaptive background mixture model for real-time tracking with shadow detection." Video-Based Surveillance Systems. Springer US, 2002. 135-144.
[2] Zivkovic, Zoran. "Improved adaptive Gaussian mixture model for background subtraction." Pattern Recognition, 2004. ICPR 2004. Proceedings of the 17th International Conference on. Vol. 2. IEEE, 2004.



(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值