Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “是什么意思?”;历史";里面的背景是什么?_Java_C++_Opencv_Image Segmentation - Fatal编程技术网

Java “是什么意思?”;历史";里面的背景是什么?

Java “是什么意思?”;历史";里面的背景是什么?,java,c++,opencv,image-segmentation,Java,C++,Opencv,Image Segmentation,我使用的是OpenCV for java(但我想这与此无关)。我使用的是BackgroundSubtractorMOG2类,该类被(糟糕地)引用。我已经阅读并理解了Zivkovic关于算法的论文,你可以找到 BackgroundSubtractorMOG2在其构造函数中接受一个名为history的参数。它是什么?它如何影响结果?你能给我指一下报纸里面的参考资料吗 从第106行,可以看出alpha=1/历史。这意味着历史就是论文中的T参数,即(或多或少)构成训练集的帧数 然而,情况似乎并非如此。将

我使用的是OpenCV for java(但我想这与此无关)。我使用的是
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
    。有趣。