Порывшись в сети и не найдя ничего по-русски, я набрел на эту англоязычную статью. В ней автор сетует, что кто-то ворует его пиво, и решает изобличить вора с помошью мини-ПК Raspberry Pi, веб-камеры и собственной программы motion_detector.py, написанной на питоне. Весь код, разбитый по частям, подробно разъясняется автором в статье. Повторять все здесь я не буду, скажу лишь, что там, помимо прочего, использована библиотека OpenCV и метод простого вычитания фона. Программа может обрабатывать как непосредственно видео с камеры, так и записанное в файл. Вот пример ее работы:
Алгоритм здесь предельно прост -- записывается первый кадр (фон), который вычитается из всех последующих. При наличии движения (изменений, превышающих заданный порог по интенсивности и минимальный размер по площади), кадру присваивается статус "Оccupied" (в комнате кто-то есть), что отображается на экране. Это все, что умеет программа.
Для своих целей я написал скрипт на bash, который разбивает всю видеозапись на короткие фрагменты (например, по десять секунд), запускает motion_detector.py, сортирует фрагменты по папкам "fish" и "nomotion"), а затем склеивает фрагменты с рыбой. Исходный код на питоне при этом пришлось немного модифицировать. Так так с этим языком (и вообще с программированием) я знаком лишь поверхостно, то не придумал ничего лучше, чем передавать статус фрагмента в скрипт через файл fstatus, после чего код приобрел тот вид, который приводиться в прикрепленном файле. (Расширение .txt после скачивания удалить. В выделенной звездочками строке два числа означают уровень шума и порог, при котором фиксируется движение. Их можно настраивать. Минимальная площадь задается опцией --min-area при запуске или в 12-й строке кода по умолчанию).
Поскольку эту программу можно запускать как на линуксе, так и на винде, приведу здесь лишь универсальные команды ffmpeg, которые я использовал для разбивки видео на фрагменты:
ffmpeg -i input.mp4 -c copy -segment_time 10 -f segment -reset_timestamps frag%03d.aviи склейки отсортированных фрагментов:
ffmpeg -f concat -safe 0 -i flist -c copy output.mp4где flist -- список склеиваемых файлов.
В заключении стоит добавить, что приведенный простейший алгоритм не учитывает изменения фона с учетом условий освещенности. Существуют более мощные адаптивные модели обработки кадров, вроде функций cv2.BackgroundSubtractorMOG или cv2.BackgroundSubtractorMOG2, но они требуют куда больше вычислительных ресурсов, чем может обеспечить Raspberry Pi. Я пробовал реализовать их на своем компьютере, но ощутимой выгоды не получил. Напротив, задать универсальные настройки, срабатывающие на любое движение, оказалось проблематично. Поэтому и остановился на первоначальном варианте.
motion_detector.py.txt 3,25К 223 Количество загрузок:
Сообщение отредактировал Al71: 12 Сентябрь 2018 - 12:04