Подтвердить что ты не робот

Как использовать cv:: BackgroundSubtractorMOG в OpenCV?

Я использую OpenCV2.2 для реализации обнаружения движущихся объектов с помощью метода вычитания фона. И я использую метод Gaussian смеси Модель (GMM) для моделирования фона эталонного изображения.

Я непосредственно получаю пиксели переднего плана (или маску переднего плана), используя класс cv:: BackgroundSubtractorMOG, предоставленный в OpenCV2.2. Это удобно, но маска переднего плана, возвращаемая cv:: BackgroundSubtractorMOG, не так хороша, как я ожидал. Кроме того, кажется, что cv:: BackgroundSubtractorMOG работает хуже, чем метод GMM, написанный на языке C, представленном в OpenCV1.0.

Ниже приведен мой код в OpenCV2.2:

cv::BackgroundSubtractorMOG mog;
mog(frame, fgMask, 0.01);

Итак, я использовал метод неправильно?

Кстати, cv:: BackgroundSubtractorMOG выполняет удаление тени на пикселях переднего плана?

Большое спасибо.

4b9b3361

Ответ 1

Когда вы создаете mog, вы не определяете никаких параметров, поэтому он создается с параметрами по умолчанию. Здесь у вас есть описание каждого параметра, возможно, это именно так. Попробуйте 3, 4 5 гауссианцев.

Эта функция не отменяет удаление тени, но у вас есть this > другая функция, которая делает. Удачи!

Ответ 2

Есть недавние алгоритмы, которые удаляют фоны (обнаружение переднего плана) намного лучше, чем стандартная реализация GMM в OpenCV.

Например, существует каскадный подход классификатора на основе блоков, описанный в этой статье в журнале, а также его исходный код.

Ответ 3

F.X. ответ на этот поток дает образцы параметров

backgroundSubtractor = new BackgroundSubtractorMOG(3, 4, 0.8);

Ответ 4

Для начала я порекомендую использовать следующие настройки. Затем вы можете начать настройку своих параметров:

cv::BackgroundSubtractorMOG2 mog;
mog(rawFrame,foregroundFrame,-1);
mog.set("nmixtures", 3);
mog.set("detectShadows",1);   

В этом примере я установил вычитатель MOG2 с тремя гауссовскими смесями. Я также включил обнаружение теней.