BackgroundSubtractorMOG2中"history"的含义是什么?

nat*_*rio 7 c++ java opencv image-segmentation

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我设定的历史无关紧要,无论是5,10,500,1000 - 结果总是一样的.然而,如果我改变了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);
Run Code Online (Sandbox Code Playgroud)

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

  1. history并不是1/alpha源代码状态.但那么:它是什么?它如何影响算法?

  2. history确实如此1/alpha,但java包装器中存在一个错误,它使history您在构造函数中设置的值无效.

你可以帮帮我吗?

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

小智 4

看起来很清楚alpha = 1 / history(除了一些短暂的瞬间)。无效BackgroundSubtractorMOG2Impl::apply方法:

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

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