Что означает "история" внутри 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-->

  1. history не очень 1/alpha как говорится в исходном коде. Но что же это такое? как это влияет на алгоритм?

  2. 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() метод.