【问题标题】:What is the meaning of "history" inside BackgroundSubtractorMOG2?BackgroundSubtractorMOG2 中的“历史”是什么意思?
【发布时间】:2015-12-03 02:42:25
【问题描述】:

我正在使用 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 值无效。

你能帮帮我吗?

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

【问题讨论】:

    标签: java c++ opencv image-segmentation


    【解决方案1】:

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

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

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

    【讨论】:

    • 这就是我所理解的,但我的测试是反对的,正如我所展示的 - 改变历史不会改变结果。看到你的台词,可能是因为2*nframes < history?会检查出来。我可以用getHistory()做一些调试,但是java中没有这种方法。
    • min 表示在第一帧它使用alpha = 0.5,然后慢慢下降到alpha = 1/history。很有趣。
    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多