privetvision 4 Жалоба Опубликовано April 28, 2015 Не могли бы показать простой пример (без лишнего мусора) на c++ вычитания фона. Как вижу работу алгоритма: есть первый кадр frameBackground без объекта. Далее на сцене появляется новый объект, необходимо показать кадр только с ним. Пример: Пробовал делать так: Mat mMaskMOG; Ptr< BackgroundSubtractor> mpMOG = createBackgroundSubtractorMOG2(); // Получаем первый кадр mCapture >> frameBackground; // Тут мне не очень понятно что происходит mpMOG->apply(frameBackground, mMaskMOG); Цикл получения кадров() { // Получаем кадр mCapture >> frame; // Копируем кадр в vFrameLab с маской, по идеи тут должен отсеяться фон frame.copyTo(vFrameLab, mMaskMOG); // преобразование в CIELAB cvtColor( vFrameLab, vFrameLab, CV_BGR2Lab ); ... } Пока писал пост, нагуглил похожую проблему http://overcram.com/questions/?qid=167068 что надо добавлять 3-ий параметр в mpMOG->apply(vFrame, fgMaskMOG, 0.001); Но я всеравно не понимаю как оно работает. Со временем новые объекты пропадают (видимо заносятся в историю). Мне же надо, чтобы они не пропадали. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано April 28, 2015 Со временем новые объекты пропадают (видимо заносятся в историю). Мне же надо, чтобы они не пропадали. Это фундаментальная проблема всех адаптивных алгоритмов вычетания фона. Можете посмотреть в мою имплементацию другого BS-алгоритма: https://github.com/BelBES/VIBE. Он тоже адаптивный, но, как минимум, работает быстрее, чем MOG Там кода всего строк сотня, т.ч. думаю разобарться будет не сложно с ним. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 28, 2015 Это как раз и проблема: если не адаптировать модель фона к изменениям, то со временем она будет вся замусорена шумами. Если адаптировать, то будут пропадать объекты переднего плана. Это во-первых. Во-вторых, не ясно, что делать, например, с автомобилем, который остановился в поле зрения камеры. Понятно, что поначалу его надо выделять. А через 5 минут? А через час? А через день? А через неделю? А если не автомобиль, а ставни магазина, который закрылся на ночь? Эта проблема в англоязычной литературе называется как ghost objects detection. Решается по всякому, зависит от требований к системе. 1. Посмотри ещё на bgs library (промотай вниз). 2. Один из самых известных и качественных алгоритмов - это Vibe. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано April 28, 2015 Можете посмотреть в мою имплементацию другого BS-алгоритма: https://github.com/BelBES/VIBE. Он тоже адаптивный, но, как минимум, работает быстрее, чем MOG Там кода всего строк сотня, т.ч. думаю разобарться будет не сложно с ним. Не сравнивал свою реализацию с оригинальной? Автор-профессор по просьбе высылает sdk на месяц для пробы. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 28, 2015 Здесь тоже есть неплохая по отзывам реализация Vibe. Ну и много чего еще. https://github.com/berak/opencv_smallfry Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано April 28, 2015 Не сравнивал свою реализацию с оригинальной? Автор-профессор по просьбе высылает sdk на месяц для пробы. Когда я имплементировал этот алгоритм (года 2 назад), была доступна только статья и бинарник под Windows. На глаз вроде бы результаты были похожи с моей версией, разве что у меня чутка помедленней работает (хотя, подозреваю что оригинальная реализация исопльзует векторизацию вычислений), а строгого бенчмаркинга я не проводил. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано April 28, 2015 Smorodov, судя по коду, там реализован VIBE только для частного случая, когда берется окрестность еденичного радиуса для каждого пикселя. Хотя, конечно, практика показывает, что большие окрестности брать особого смысла нет. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
privetvision 4 Жалоба Опубликовано April 28, 2015 Спасибо, тестирую Vibe. Один момент, поясните пожалуйста аргументы конструктора: (int channels, int samples, int pixel_neighbor, int distance_threshold, int matching_threshold, int update_factor): channels - кол-во каналов, это понятно, а вот далее что идет? (перевод на русский не помогло понять) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано April 29, 2015 Спасибо, тестирую Vibe. Один момент, поясните пожалуйста аргументы конструктора: (int channels, int samples, int pixel_neighbor, int distance_threshold, int matching_threshold, int update_factor): channels - кол-во каналов, это понятно, а вот далее что идет? (перевод на русский не помогло понять) samples - число сэмплов из окрестности, по которым строится распределение. pixel_neighbor - радиус окрестности, из которой берутся сэмплы и с которыми происходит сравнение. distance_threshold - пороговое значение, определяющее степень сходства пикселей matching_threshold - определяет, сколько мнимально нужно совпадений с сэмплами, чтобы отнести пиксель к фону. update_factor - вносит элемент случайности в процесс обновления модели фона Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах