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

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

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

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

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

2 ответа

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

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

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

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

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