2016-09-26 37 views
2

我使用OpenCV進行前景檢測,但我有一個問題,如果有人可以幫忙。 的問題是在這兩個參數:這兩個參數在背景減法OpenCV中的區別是什麼

  • 在學習率bst.apply(currentFame, foregroungMask, learnRate); // -1 for auto, and the range is 0~1
  • bst.setBackgroundRatio(double ratio) // default is 0.8xxx

的問題是,是這兩個參數是相同的,如果答案是NO那麼第二個參數可以做什麼?

問題已經出現,當我看到setBackgroundRatio(double ratio)方法不存在於BackgroundSubtractorKNN類中,但它只在BackgroundSubtractorMOG2類中出現。但他們都有學習率參數apply()方法。

注:我在Java中

回答

4

使用OpenCV的不都是不盡相同。

學習率:

表示背景模型是如何快速學會0和1之間的值。負參數值使算法使用一些自動選擇的學習速率。 0意味着背景模型完全不更新,1意味着背景模型從最後一幀完全重新初始化。

比:

BackgroundSubtractorMOG2BackgroundSubtractorKNN是兩種不同的實現兩種不同的背景減除算法。因此,BackgroundSubtractorKNN算法不需要setBackgroundRatio。沒有發現太多關於這個參數,在看到這個算法的代碼後,它似乎是一個總重量上限參數。不允許總重量超過此閾值。從C++ impelentation中查看這段代碼:

void BackgroundSubtractorMOG2Impl::getBackgroundImage(OutputArray backgroundImage) const 
{ 
    if (opencl_ON) 
    { 
     CV_OCL_RUN(opencl_ON, ocl_getBackgroundImage(backgroundImage)) 

     opencl_ON = false; 
     return; 
    } 

    int nchannels = CV_MAT_CN(frameType); 
    CV_Assert(nchannels == 1 || nchannels == 3); 
    Mat meanBackground(frameSize, CV_MAKETYPE(CV_8U, nchannels), Scalar::all(0)); 
    int firstGaussianIdx = 0; 
    const GMM* gmm = bgmodel.ptr<GMM>(); 
    const float* mean = reinterpret_cast<const float*>(gmm + frameSize.width*frameSize.height*nmixtures); 
    std::vector<float> meanVal(nchannels, 0.f); 
    for(int row=0; row<meanBackground.rows; row++) 
    { 
     for(int col=0; col<meanBackground.cols; col++) 
     { 
      int nmodes = bgmodelUsedModes.at<uchar>(row, col); 
      float totalWeight = 0.f; 
      for(int gaussianIdx = firstGaussianIdx; gaussianIdx < firstGaussianIdx + nmodes; gaussianIdx++) 
      { 
       GMM gaussian = gmm[gaussianIdx]; 
       size_t meanPosition = gaussianIdx*nchannels; 
       for(int chn = 0; chn < nchannels; chn++) 
       { 
        meanVal[chn] += gaussian.weight * mean[meanPosition + chn]; 
       } 
       totalWeight += gaussian.weight; 

       if(totalWeight > backgroundRatio) 
        break; 
      } 
      float invWeight = 1.f/totalWeight; 
      switch(nchannels) 
      { 
      case 1: 
       meanBackground.at<uchar>(row, col) = (uchar)(meanVal[0] * invWeight); 
       meanVal[0] = 0.f; 
       break; 
      case 3: 
       Vec3f& meanVec = *reinterpret_cast<Vec3f*>(&meanVal[0]); 
       meanBackground.at<Vec3b>(row, col) = Vec3b(meanVec * invWeight); 
       meanVec = 0.f; 
       break; 
      } 
      firstGaussianIdx += nmixtures; 
     } 
    } 
    meanBackground.copyTo(backgroundImage); 
} 

在C++實現中,backgroundRatio用於在其下面加權。默認值爲0.8。我覺得這個默認,你會得到預期的結果

OpenCV中發現有趣的評論background_segm.hpp文件,這似乎是不太顯著和標準的做法是去與默認:

///////////////////////// 
    // less important parameters - things you might change but be carefull 
    //////////////////////// 
    float backgroundRatio; 
+0

謝謝先生,您回覆!你是說KNN不允許改變比例嗎?而且對於MOG2,雖然我們可以改變它的值,但是最好將它作爲默認值呢?但是學習速度有些不同,我們可以將值的形式從0〜1或-1?我對嗎?如果是,那麼你的答案已經解決了這個問題。 –

+0

如果你想學習它自動設置它-1和1從最後一幀更新背景和0不更新背景。所以,顯然這個參數是-1,1或者0 ... –

+0

之間沒有,但是參數是-1,0或者1 :) –