Что означает "история" внутри BackgroundSubtractorMOG2?
Я на OpenCV для java (но это не относится, я думаю). Я использую BackgroundSubtractorMOG2
класс, на который (плохо) ссылаются здесь. Я прочитал и понял статью Живковича об алгоритме, который вы можете найти здесь.
BackgroundSubtractorMOG2
принимает в своем конструкторе параметр history
. Что это такое и как это влияет на результат? Не могли бы вы указать мне на ссылку внутри документа, например?
от исходный код класса, строка 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);
если я изменю Альфа здесь, результат сильно изменится, что понятно. Итак, две гипотезы:--18-->
history
не очень1/alpha
как говорится в исходном коде. Но что же это такое? как это влияет на алгоритм?history
действительно1/alpha
, но есть ошибка в Java-оболочку, которая делаетhistory
значение, которое вы установили в конструкторе бесполезно.
не могли бы вы помочь мне?
(пометка c++ также, как это в основном вопрос о классе OpenCV, и вся платформа OpenCV java - это просто оболочка вокруг c++).
1 ответов
очевидно, что alpha = 1 / history
(за исключением некоторых переходных моментов). В пустоте BackgroundSubtractorMOG2Impl::apply
способ:
learningRate = learningRate >= 0 && nframes > 1 ? learningRate : 1./std::min( 2*nframes, history );
вы можете проверить, если BackgroundSubtractorMOG2
объект использует значение истории, которое вы передаете в конструкторе, используя getHistory()
метод.