Перейти к содержимому
Compvision.ru
privetvision

Вычитание фона

Recommended Posts

Не могли бы показать простой пример (без лишнего мусора) на 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);

Но я всеравно не понимаю как оно работает. Со временем новые объекты пропадают (видимо заносятся в историю). Мне же надо, чтобы они не пропадали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Со временем новые объекты пропадают (видимо заносятся в историю). Мне же надо, чтобы они не пропадали.

Это фундаментальная проблема всех адаптивных алгоритмов вычетания фона. 

Можете посмотреть в мою имплементацию другого BS-алгоритма: https://github.com/BelBES/VIBE. Он тоже адаптивный, но, как минимум, работает быстрее, чем MOG

Там кода всего строк сотня, т.ч. думаю разобарться будет не сложно с ним.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это как раз и проблема: если не адаптировать модель фона к изменениям, то со временем она будет вся замусорена шумами. Если адаптировать, то будут пропадать объекты переднего плана. Это во-первых.

Во-вторых, не ясно, что делать, например, с автомобилем, который остановился в поле зрения камеры. Понятно, что поначалу его надо выделять. А через 5 минут? А через час? А через день? А через неделю?

А если не автомобиль, а ставни магазина, который закрылся на ночь?

Эта проблема в англоязычной литературе называется как ghost objects detection. Решается по всякому, зависит от требований к системе.

 

1. Посмотри ещё на bgs library (промотай вниз).

2. Один из самых известных и качественных алгоритмов - это Vibe.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можете посмотреть в мою имплементацию другого BS-алгоритма: https://github.com/BelBES/VIBE. Он тоже адаптивный, но, как минимум, работает быстрее, чем MOG

Там кода всего строк сотня, т.ч. думаю разобарться будет не сложно с ним.

Не сравнивал свою реализацию с оригинальной? Автор-профессор по просьбе высылает sdk на месяц для пробы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Здесь тоже есть неплохая по отзывам реализация Vibe. Ну и много чего еще.

 

https://github.com/berak/opencv_smallfry

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не сравнивал свою реализацию с оригинальной? Автор-профессор по просьбе высылает sdk на месяц для пробы.

Когда я имплементировал этот алгоритм (года 2 назад), была доступна только статья и бинарник под Windows. На глаз вроде бы результаты были похожи с моей версией, разве что у меня чутка помедленней работает (хотя, подозреваю что оригинальная реализация исопльзует векторизацию вычислений), а строгого бенчмаркинга я не проводил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Smorodov, судя по коду, там реализован VIBE только для частного случая, когда берется окрестность еденичного радиуса для каждого пикселя. Хотя, конечно, практика показывает, что большие окрестности брать особого смысла нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, тестирую Vibe. Один момент, поясните пожалуйста аргументы конструктора:

(int channels, int samples, int pixel_neighbor, int distance_threshold, int matching_threshold, int update_factor):

channels - кол-во каналов, это понятно, а вот далее что идет? (перевод на русский не помогло понять)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, тестирую 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 - вносит элемент случайности в процесс обновления модели фона

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×