"历史"是什么意思?在BackgroundSubtractorMOG2里面?

时间:2015-09-07 13:56:51

标签: java c++ opencv image-segmentation

我在使用OpenCV for java(但我觉得这不相关)。我使用的是BackgroundSubtractorMOG2类(很差)引用here。我已阅读并理解Zivkovic关于算法的论文,您可以找到here

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

class source code第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 - 结果总是一样的。然而,如果我通过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值无效。

  3. 你能帮帮我吗?

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

1 个答案:

答案 0 :(得分:3)

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

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

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

相关问题