背景减法OpenCV中这两个参数的区别是什么

Bah*_*dil 2 opencv background-subtraction

我使用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中使用OpenCV

MD.*_*ria 5

两者都不相同.

学习率:

0到1之间的值,表示学习背景模型的速度.负参数值使算法使用一些自动选择的学习速率.0表示背景模型根本不更新,1表示背景模型完全从最后一帧重新初始化.

比:

BackgroundSubtractorMOG2并且BackgroundSubtractorKNN是两种不同背景减法算法的两种不同实现方式.因此,算法setBackgroundRatio不需要BackgroundSubtractorKNN.没有找到太多关于这个参数,看到这个算法的代码后,它似乎是一个总重量上限参数.不允许总重量超过此阈值.从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);
}
Run Code Online (Sandbox Code Playgroud)

在c ++实现中,backgroundRatio用于限制其下的权重.默认值为0.8.我认为通过此默认设置,您将获得预期的结果

在opencv background_segm.hpp文件中找到有趣的评论,这似乎不那么重要,标准做法是使用默认值:

/////////////////////////
    // less important parameters - things you might change but be carefull
    ////////////////////////
    float backgroundRatio;
Run Code Online (Sandbox Code Playgroud)