Как использовать 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 гауссовыми смесями. Я также включил обнаружение теней.