Java “是什么意思?”;历史";里面的背景是什么?
我使用的是OpenCV for java(但我想这与此无关)。我使用的是Java “是什么意思?”;历史";里面的背景是什么?,java,c++,opencv,image-segmentation,Java,C++,Opencv,Image Segmentation,我使用的是OpenCV for java(但我想这与此无关)。我使用的是BackgroundSubtractorMOG2类,该类被(糟糕地)引用。我已经阅读并理解了Zivkovic关于算法的论文,你可以找到 BackgroundSubtractorMOG2在其构造函数中接受一个名为history的参数。它是什么?它如何影响结果?你能给我指一下报纸里面的参考资料吗 从第106行,可以看出alpha=1/历史。这意味着历史就是论文中的T参数,即(或多或少)构成训练集的帧数 然而,情况似乎并非如此。将
BackgroundSubtractorMOG2
类,该类被(糟糕地)引用。我已经阅读并理解了Zivkovic关于算法的论文,你可以找到
BackgroundSubtractorMOG2
在其构造函数中接受一个名为history
的参数。它是什么?它如何影响结果?你能给我指一下报纸里面的参考资料吗
从第106行,可以看出alpha=1/历史
。这意味着历史就是论文中的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
值(学习率),我可以看到它的真正影响:
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包装中存在一个bug,使得您在构造函数中设置的history
值无效(标记C++也是因为这主要是关于OpenCV类的问题,整个OpenCV java框架只是C++的包装器)。
很明显,<代码> alpha=1/历史< /C> >(除了一些暂时的瞬间)。在void
BackgroundSubtractorMOG2Impl::apply中
方法:
learningRate = learningRate >= 0 && nframes > 1 ? learningRate : 1./std::min( 2*nframes, history );
您可以测试
BackgroundSubtractorMOG2
对象是否使用您使用getHistory()
方法传入构造函数的历史值。这就是我所理解的,但我的测试是反对的,正如我所示-更改历史不会改变结果。看到你的台词,可能是因为2*n帧
?我去看看。我可以用getHistory()
进行一些调试,但是java中没有这样的方法。min
意味着在第一个帧中它使用alpha=0.5
,然后慢慢转到alpha=1/history
。有趣。