Поиск кадров mpeg/avi в linux

У меня может быть необычная проблема для этого сайта; среди прочих обязанностей я управляю беспроводной сетью в большом корпоративном кампусе. В рамках обновления наших беспроводных точек доступа я использовал металлический кронштейн для установки точки доступа на рельсе на высоте около 10 футов от земли. При установке нижняя часть точки доступа была параллельна полу.

Неделю спустя наши специалисты по кабелям заметили, что кто-то погнул точку доступа примерно на 70 градусов вверх; учитывая прочность кронштейна, для этого потребовалось много сил. У нас есть камера слежения примерно в 90 футах от этой точки доступа, но интересующая меня область составляет около 3% площади изображения камеры.

Наша служба безопасности сообщила, что из-за нечеткости и небольшой области видео на поиск видео уйдет около 30 человеко-часов (один человек просматривает его в течение 3,5 дней... учитывая ограничения в воспроизведении, они не могут увеличивать масштаб во время перемотка вперед); как таковые, они не были заинтересованы в том, чтобы идти дальше.

ВОПРОС :

Кажется, что может быть какой-то способ создать список временных интервалов-кандидатов в видео, где эта 3%-я область резко изменилась от нормы для заданного периода времени... скажем, по крайней мере, 20 секунд.

TBH, кронштейн всего 30 долларов; однако, так как наш старый закаленный охранник клялся, что это невозможно автоматизировать, я воспринял это как любопытство, чтобы проверить, правда ли это. Очевидно, есть коммерческие решения... Я ищу "бесплатное" в Linux.

Файл будет около 6 ГБ. Есть ли решение этой проблемы в linux CLI? Мне просто нужно сократить время, на которое мы смотрим, до чего-то управляемого. Даже если бы мне пришлось использовать библиотеку аналитики изображений Python, такую ​​​​как OpenCV-python , это возможно, но я надеюсь (ab) использовать что-то подобное ffmpegдля этой цели. Если такого инструмента нет, какая функция Open-CV лучше всего подойдет для этой работы?

Ответы (1)

FFMPEG на самом деле не имеет готовых инструментов для обнаружения движения. Вы, конечно, можете сделать обрезку с помощью фильтра обрезки : -vf crop=w:h:x:yгде w:hразмер вашей области обрезки и x:yее координаты на исходном изображении. Таким образом, ваш скрипт ffmpeg может выглядеть так:

ffmpeg -i input.avi -c:v libx264 -crf 20 -vf crop=123:45:67:89 output.mp4

Затем вы можете найти кадр вывода, который не содержит движения, экспортировать его в неподвижное изображение, инвертировать его и добавить обратно к видео с помощью наложения , чтобы отображались только части кадров, которые отличаются. Затем используйте фильтр blackdetect , чтобы найти черные кадры. Затем вы можете использовать некоторые шелл-фу, чтобы удалить эти части видео и, наконец, объединить оставшуюся часть в один клип. Фух.

… или вы можете использовать openCV. Вот готовый скрипт для обнаружения движения: https://github.com/RobinDavid/Motion-detection-OpenCV .

когда вы говорите -vf crop=w:h:x:y, вы имеете в виду ffmpegкадрирование , верно? Когда вы говорите «пустой кадр», я не уверен, как бы я нашел это в видеофайле... Я думаю, что упомянутый вами проект github может быть подходящим вариантом.
«пустой кадр» означает кадр, в котором ничего не происходит. Да, используйте сценарий, если вы действительно не хотите обучающего упражнения.