BackgroundSubtractorMOG2 中 "history" 的含义是什么?
What is the meaning of "history" inside BackgroundSubtractorMOG2?
我在 OpenCV 上 java(但我想这不相关)。我正在使用 BackgroundSubtractorMOG2
class ,它被(不良地)引用 here. I have read and understood the Zivkovic paper about the algorithm which you can find here.
BackgroundSubtractorMOG2
在其构造函数中接收一个名为 history
的参数。它是什么,它如何影响结果?例如,你能指出它在论文中的引用吗?
出自class source code,第106行,据说alpha = 1/history
。也就是说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 - 结果总是一样的。然而,如果我通过 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 包装器中存在一个错误,这使得您在构造函数中设置的 history
值无用.
你能帮帮我吗?
(也标记 c++,因为这主要是关于 OpenCV class 的问题,整个 OpenCV java 框架只是 c++ 的包装器) .
似乎很清楚 alpha = 1 / history
(除了一些短暂的瞬间)。在 void BackgroundSubtractorMOG2Impl::apply
方法中:
learningRate = learningRate >= 0 && nframes > 1 ? learningRate : 1./std::min( 2*nframes, history );
您可以测试 BackgroundSubtractorMOG2
对象是否正在使用您使用 getHistory()
方法在构造函数中传递的历史值。
我在 OpenCV 上 java(但我想这不相关)。我正在使用 BackgroundSubtractorMOG2
class ,它被(不良地)引用 here. I have read and understood the Zivkovic paper about the algorithm which you can find here.
BackgroundSubtractorMOG2
在其构造函数中接收一个名为 history
的参数。它是什么,它如何影响结果?例如,你能指出它在论文中的引用吗?
出自class source code,第106行,据说alpha = 1/history
。也就是说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 - 结果总是一样的。然而,如果我通过 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 包装器中存在一个错误,这使得您在构造函数中设置的history
值无用.
你能帮帮我吗?
(也标记 c++,因为这主要是关于 OpenCV class 的问题,整个 OpenCV java 框架只是 c++ 的包装器) .
似乎很清楚 alpha = 1 / history
(除了一些短暂的瞬间)。在 void BackgroundSubtractorMOG2Impl::apply
方法中:
learningRate = learningRate >= 0 && nframes > 1 ? learningRate : 1./std::min( 2*nframes, history );
您可以测试 BackgroundSubtractorMOG2
对象是否正在使用您使用 getHistory()
方法在构造函数中传递的历史值。