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

Я использую OpenCV2.2 для реализации обнаружения движущихся объектов с помощью метода вычитания фона. И я использую метод Gaussian Mixture Model(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 выполняет удаление теней на пикселях переднего плана?

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

4 ответа

Решение

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

Эта функция не выполняет удаление теней, но у вас есть эта другая функция, которая делает. Удачи!

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

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

Ответ FX в этой теме дает пример параметров

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

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

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

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

Другие вопросы по тегам