BackgroundSubtractorMOG2中“history”的含义是什么?

我正在使用OpenCV for java(但这与我猜不相关)。 我正在使用BackgroundSubtractorMOG2类, 这里引用的(很差)。 我已经阅读并理解了Zivkovic关于算法的论文,你可以在这里找到。

BackgroundSubtractorMOG2在其构造函数中引入一个名为history的参数。 它是什么,它如何影响结果? 例如,你能指点我在论文中的参考吗?

从类源代码 106行,据说alpha = 1/history 。 这意味着历史就是论文中的T参数,即(或多或少)构成训练集的帧数。

然而,它似乎并非如此。 将构造函数中的值从10更改为500或更高,对最终结果没有影响 。 这就是我所说的:

 Mat result = new Mat(); int history = 10; //or 50, or 500, or whatever BackgroundSubtractorMOG2 sub = new BackgroundSubtractorMOG2(history, 16, false); for (....) { sub.apply(frame[i], result); } imshow(result); //let's see last frame 

我设定的历史无关紧要,无论是5,10,500,1000 – 结果总是一样的。 然而,如果我通过apply()更改alpha值(学习率apply() ,我可以看到它的真正影响:

 Mat result = new Mat(); float alpha = 0.1; //learning rate, 1/T (1/history?) BackgroundSubtractorMOG2 sub = new BackgroundSubtractorMOG2(whatever, 16, false); for (...) { sub.apply(frame[i], result, alpha); } imshow(result); 

如果我在这里更改alpha,结果会发生很大变化,这是可以理解的。 所以,有两个猜想:

  1. history不是源代码所说的1/alpha 。 但那么:它是什么? 它如何影响算法?

  2. history实际上是1/alpha ,但是java包装器中存在一个错误,它使您在构造函数中设置的history值无用。

你可以帮帮我吗?

(标记c ++也因为这主要是关于OpenCV类的问题,整个OpenCV java框架只是c ++的包装)

似乎很清楚, alpha = 1 / history (除了一些短暂的瞬间)。 在void BackgroundSubtractorMOG2Impl::apply方法中:

 learningRate = learningRate >= 0 && nframes > 1 ? learningRate : 1./std::min( 2*nframes, history ); 

您可以测试BackgroundSubtractorMOG2对象是否正在使用您使用getHistory()方法在构造函数中传递的历史值。