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,结果会发生很大变化,这是可以理解的。 所以,有两个猜想:
-
history
不是源代码所说的1/alpha
。 但那么:它是什么? 它如何影响算法? -
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()
方法在构造函数中传递的历史值。