Обнаружение движения в реальном времени с использованием OpenCV

У меня есть проект, в котором мне нужно обнаружить движение в видеопотоке. При обнаружении движения выполняется дальнейшая обработка. Нет необходимости в обнаружении области, где было зафиксировано движение, или более подробной информации. Мне нужно только измерить процент измененных пикселей между двумя изображениями или что-то подобное в качестве триггера для дальнейшей обработки.

Моя идея заключалась в том, чтобы взять абсолютную разницу двух изображений, установить порог и посчитать пиксели. Я использую cv::absdiff, cv::threshold и cv::countNonZero. Этот расчет занимает около 10 мс для изображения в формате Full HD. При 30 кадрах в секунду это составляет 10 * 30 = 300 мс на одном ядре.

Это еще не включает преобразование в оттенки серого для изображения, которое занимает примерно 2-3 раза по сравнению с вычислением разностного изображения. Таким образом, я могу обрабатывать около 10 кадров в секунду в формате Full HD на одном ядре.

Сейчас я ищу способ значительно ускорить преобразование оттенков серого/обнаружение движения. Каким будет самый быстрый способ обнаружения движения в видеопотоке RGB с точки зрения вычислительной мощности?


person user3639812    schedule 30.06.2014    source источник


Ответы (2)


Если вы полностью ограничены одним ядром, это не применимо. Однако, если у вас хорошая видеокарта, вы можете использовать функции gpu:: или ocl::. Используя их, вы можете ускорить работу в 3-30 раз! Я точно знаю, что gpu::threshold намного быстрее, чем версия cpu. Я могу обработать изображение 1080p за 0,001 секунды на GeForce GTX660. Дополнительные примеры времени моего графического процессора на изображении того же размера: маскирование — 0,002, классификация LBP — 0,053, морфологическая 0,002.

person Jash McCunn    schedule 30.06.2014
comment
Я не ограничен одним ядром. Расчет относительно одного ЦП служит для меня показателем того, сколько экземпляров я могу запускать параллельно. gpu:: поддерживает только устройства nvidia. Я застрял с некоторыми графическими процессорами Intel, поэтому мне доступен только ocl::. Сколько времени займет копирование данных моего изображения в память графического процессора? - person user3639812; 30.06.2014

  1. Уменьшите размер изображения перед обработкой
  2. Примените размытие перед тестированием, так как это уменьшает шум.

opencv имеет методы для сравнения матов вместе, например. cv::compare, который перегрузил относительные операторы.

Кроме того, существует огромная разница с точки зрения скорости между библиотеками отладки opencv и библиотеками выпуска, до того, как вы будете беспокоиться о скоростях, выполните компиляцию выпуска, используя библиотеки выпуска opencv.

person user3791372    schedule 30.06.2014