【发布时间】: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,结果会发生很大变化,这是可以理解的。所以,两个猜想:
history并不是真正的1/alpha,如源代码所述。但后来:它是什么?它对算法有何影响?history确实是1/alpha,但是 java 包装器中存在一个错误,导致您在构造函数中设置的history值无效。
你能帮帮我吗?
(标记 c++ 也是因为这主要是关于 OpenCV 类的问题,整个 OpenCV java 框架只是 c++ 的包装)。
【问题讨论】:
标签: java c++ opencv image-segmentation