计算机视觉
图像处理

【OpenCV】高斯混合背景建模

文章目录

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

BackgroundSubtractorMOG 使用示例

  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. }

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

  1. BackgroundSubtractorMOG::BackgroundSubtractorMOG()
  2. BackgroundSubtractorMOG::BackgroundSubtractorMOG(int history, int nmixtures,
  3. double backgroundRatio, double noiseSigma=0)

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

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

  1. void BackgroundSubtractorMOG::operator()(InputArray image, OutputArray fgmask, double learningRate=0)

其中image为当前帧图像,fgmask为输出的前景mask,learningRate为背景学习速率。

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

BackgroundSubtractorMOG2 使用示例

  1. int main(){
  2.     VideoCapture video(“1.avi”);
  3.     Mat frame,mask,thresholdImage, output;
  4.     //video>>frame;
  5.     BackgroundSubtractorMOG2 bgSubtractor(20,16,true);
  6.     while(true){
  7.         video>>frame;
  8.         ++frameNum;
  9.         bgSubtractor(frame,mask,0.001);
  10.         cout<<frameNum<<endl;
  11.         //imshow(“mask”,mask);
  12.         //waitKey(10);
  13.     }
  14.     return 0;
  15. }

 

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

  1. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2()
  2. BackgroundSubtractorMOG2::BackgroundSubtractorMOG2(int history,
  3. float varThreshold, bool bShadowDetection=true )

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

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

  1. void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)

参数意义同BackgroundSubtractorMOG中的operator()函数。

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

  1. void BackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage)

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

  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.

转载注明来源:CV视觉网 » 【OpenCV】高斯混合背景建模

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 6

评论前必须登录!