• I






      
           

Научно-популярный образовательный ресурс для юных и начинающих радиолюбителей - Popular science educational resource for young and novice hams

Основы электричества, учебные материалы и опыт профессионалов - Basics of electricity, educational materials and professional experience

КОНКУРС
language
 
Поиск junradio

Радиодетали
ОК
Сервисы

Stock Images
Покупка - продажа
Фото и изображений


 
Выгодный обмен
электронных валют

Друзья JR



JUNIOR RADIO

 

Мониторинг движения с веб
камеры на Raspberry Pi

 

MotionDetection отслеживает движение с веб-камеры USB на Raspberry Pi 3 с использованием API OpenCV. Как только система обнаруживает движение, она делает снимок того, что отключило программное обеспечение для обнаружения движения, и отправляет это изображение вам по электронной почте. Это также дает вам возможность удаленно просматривать веб-камеру из приложения Android из любой точки мира в любое время. Получив уведомление по электронной почте, вы можете открыть приложение Android на своем телефоне и проверить, что происходит у вас дома (или в любом другом месте, которое вы выберете). Давайте посмотрим, как работает эта настраиваемая и стабильная система. Как упоминалось ранее, в основе этого проекта лежит удивительный одноплатный компьютер Raspberry Pi 3 (SBC; рис. 1 ) и USB-камера PlayStation 2 под названием EyeToy ( рис. 2 ).

РИСУНОК 1. Модель Raspberry Pi 3 B+.

РИСУНОК 2. USB-камера PlayStation 2 EyeToy.

Этот маленький SBC — это то, что запускает систему, которую я настроил и построил. Что «управляет» системой, так это мультиклассовая программа из 700+ строк, которую я написал на языке программирования Python. Программное обеспечение Android написано на языке программирования Java с использованием устаревшей системы сборки Ant из командной строки. Если я могу сделать это в команде Linux, я это сделаю! Я ничего не имею против GUI (графических пользовательских интерфейсов); просто я чувствую, что у меня больше контроля из командной строки, чем иметь дело с ненужными слоями абстракции. Эта система отслеживает движение выше и ниже указанных пороговых значений, которые вы устанавливаете в командной строке при запуске программы. Я делаю это через crontab . Кронтаб запускает демон, который отслеживает количество запущенных процессов обнаружения движения. Если запущено слишком много, это может привести к зависанию фреймворка. Для отслеживания таких событий существует система сердцебиения, но я расскажу об этом позже. Демон запускается раз в минуту, потому что это наименьшее количество времени, которое cron позволяет запускать записи. Он также отслеживает, нет ли запущенных процессов или только правильное количество. Существует два пороговых значения, которые можно указать при обнаружении движения: минимальное и максимальное пороговое значение. Причина, по которой установлен минимальный порог, заключается в том, что камера будет вызывать всплески дифференциального счета изображения. Эти пики почти никогда не превышают 500, поэтому значения по умолчанию для этой настраиваемой переменной установлены именно на это значение. Есть много ложных срабатываний в зависимости от того, куда направлена ​​камера и где она расположена. Я живу у главной дороги в моем городе, а мой дом на углу. Так, свет от машин довольно часто будет вызывать ложные срабатывания. Я пытаюсь решить эту проблему с помощью максимального значения дифференциала изображения, которое имеет значение по умолчанию 1500. Кто-то, кто переезжает в ваш дом, будет генерировать значения, значительно превышающие 1500, поэтому значения по умолчанию более чем подходят для тех, кто не хочет перенастраивать система. Система MotionDetection может определить, есть ли движение, сравнивая два изображения в градациях серого внутри бесконечного цикла while . Он делает снимок перед входом в петлю, а затем делает еще один снимок, когда входит в петлю. Оба изображения проходят процедуру обработки изображений, которую я написал. Если на самой новой фотографии есть пиксель, отличающийся от исходного, пороговая переменная увеличивается. Если различающихся пикселей достаточно, то активируется фреймворк вторжения, и изображение отправляется по электронной почте вместе с уведомлением. Если разница в пикселях меньше заданного порогового значения max, то первая сделанная фотография заменяет вторую сделанную фотографию, и на следующей итерации делается новая фотография для замены старой новой фотографии (первой сделанной фотографии). Процедуры обработки и преобразования изображений очень сложны, и я не собираюсь описывать их в этой статье. В Ресурсах есть ссылка на код моего репозитория GitHub, в котором показаны эти процедуры обработки и преобразования. Я также готов ответить на любые ваши вопросы, касающиеся этой статьи, или если вы хотите получить более подробное объяснение процедур. Система не только отслеживает движение и дает возможность удаленного просмотра прямой трансляции, но также управляет данными, которые создает система MotionDetection. Снимки, которые делает MotionDetection, называются CaptureX.png (где X — числовое значение). Именование изображения выполняется с помощью функции приращения ( рис. 3 ), которая находит изображение с наибольшим номером в каталоге, увеличивает это число на единицу и затем возвращает это значение.

РИСУНОК 3. Метод  добавочного именования.

Затем это значение передается функции, отвечающей за создание снимков, и сохраняет самую новую фотографию с новым номером, добавленным в конце имени перед расширением, т. е. capture39.png, capture40.png, capture41.png и т. д/ Эти изображения никогда не перезаписываются и не удаляются автоматически. Они останутся в каталоге MotionDetection до тех пор, пока вы не удалите их вручную или система DataManager автоматически не сожмет их, не отправит по электронной почте, а затем не удалит связанные данные. Эта функция необязательна, но она присутствует, потому что, если данные накапливаются, пространство системы со временем будет заполняться, что потенциально может вызвать отставание и/или блокировку системы. Это то, что в конечном итоге произошло со мной, поэтому я написал программное обеспечение DataManager, чтобы предотвратить это снова. Система DataManager также позволяет указать размер файла, в котором будут выполняться процедуры управления данными. Давайте обсудим вторую часть этой системы, а именно возможность удаленного просмотра прямой трансляции с камеры из приложения Android. Внедрение возможности удаленного просмотра бесконечно усложнило проект, в основном из-за конфликта в физическом управлении, обращении и блокировке камеры. Функции обнаружения движения и потоковой передачи требуют управления камерой. К сожалению, я не мог одновременно дать доступ к обоим процессам. Итак, я разработал метод, позволяющий каждому процессу независимо блокировать камеру и управлять ею. Основой этой концепции и дизайна ( рис. 4 ) является наличие главного процесса, который владеет системой блокировки, в то время как другой процесс является подчиненным, который запрашивает разрешение системы блокировки. Затем он возвращает управление главному процессу после его завершения.

РИСУНОК 4. Блок-схема обработчика управления системой.

 Интеграция этого обработчика системного управления была достигнута путем написания и использования сервера на RaspPi вместе (в том же файле) с инфраструктурой MotionDetection, которая обрабатывает удаленные команды, поступающие из приложения Android. Все входящие команды одновременно распределяются между параллельными процессами через общие очереди, которые позволяют процессам проверять команду в канале и действовать соответствующим образом. Это позволяет процессу обнаружения движения снять блокировку с камеры, если он увидит, что был сделан запрос на управление блокировкой. Процесс потоковой передачи также увидит эту команду в конвейере и теперь может заблокировать камеру. Эту функцию было немного сложно разработать и успешно реализовать, потому что мне нужно было убедиться, что все процессы выполняются последовательно, чтобы она работала правильно. Это было сделано путем блокировки процессов и их освобождения в строго определенное время, потому что только один процесс в каждый момент времени мог получить блокировку. Если этого не сделать должным образом, то процессы, скорее всего, выйдут из строя и могут привести к полному беспорядку — что и произошло на ранних стадиях разработки! Программное обеспечение пульса работает как совершенно отдельная сущность и отслеживает состояние как серверов обработки команд, так и серверов потоковой передачи. Если за короткий промежуток времени будет установлено достаточное количество подключений, это может помешать любым новым подключениям. Программа пульса запускается каждые две минуты по умолчанию, но это настраиваемый параметр. Каждый раз, когда сервер пульса проверяет связь с инфраструктурой MotionDetection, он получает копию PID MotionDetection. Затем программное обеспечение пульса сохраняет PID на случай, если оно больше не сможет связаться с серверами. Если это когда-либо произойдет, программа Heartbeat уничтожит инфраструктуру MotionDetection, и MotionDetection будет автоматически перезапущен демоном crontab. Коснемся обработчика управления системой еще немного. Когда вы хотите просмотреть прямую трансляцию с камеры, вы открываете APK и нажимаете кнопку запуска. Это отправляет сигнал (строку) на командный сервер, работающий на RaspPi, который останавливает процесс обнаружения движения. Сначала он снимает блокировку с камеры, а затем снимает блокировку процесса, позволяя потоковому серверу получить блокировку процесса. Вы можете просматривать ленту до тех пор, пока не нажмете кнопку «Стоп» в APK или пока приложение не будет закрыто. Когда происходит любое из этих событий, приложение Android отправляет другую строку, сообщая серверу обработки команд, что он закончил с блокировкой камеры и процесса. Если кто-то из вас знаком с жизненным циклом активности Android, возможно, вы знаете, что такое onStop() , onPause() и onDestroy() ( рис. 5 ).

РИСУНОК 5. Жизненный цикл активности Android.

 Когда вы закрываете приложение, телефон или когда телефон засыпает, эти действия вызывают одну из трех функций жизненного цикла, которые я только что упомянул. Я написал некоторый код для переопределения этих методов, который «автоматически» отправляет сигнал (строку) на командный сервер на RaspPi, сообщая ему, что теперь он может освободить управление камерой. Разработанный мной фреймворк был (и остается) гораздо большим, чем просто программное обеспечение, и требовал большой настройки на системном уровне. Пакет OpenCV требует гораздо большего, чем просто ввод нескольких команд для установки OpenCV через диспетчер пакетов. Мне пришлось скомпилировать несколько пакетов только для того, чтобы OpenCV скомпилировался. Мне нужна была определенная версия OpenCV, а для этой версии требовались более новые версии нескольких пакетов, таких как GCC, MPFR, MPC, CMAKE, FFMPEG и многих других. Их нужно было построить в определенном порядке и скомпилировать с определенными флагами. Это было далеко не гладко, но мне всегда нравилось что-то компилировать, так что это было очень весело, несмотря на то, что это было очень утомительно и много работы. Обеденные перерывы я тратил на компиляцию ( рис. 6 ). Я провел много ночей на своем диване после компиляции работы. Я даже компилировал в перерывах между работой назначенные программные проекты в течение рабочего дня.

РИСУНОК 6. Я компилирую во время работы. (Фото предоставлено моим коллегой Адиэлем Корчадо.)

Я также установил брандмауэр, чтобы убедиться, что моя система не будет скомпрометирована, и максимально ограничить атаки. Брандмауэр, который я использую, называется iptables, и его настройка и совершенствование могут быть трудными, но он очень надежный и легко настраиваемый. Единственным недостатком является то, что у него может быть очень крутая кривая обучения! Брандмауэр еще не завершен, и я все еще работаю над несколькими вещами, но сама система очень стабильна и легко настраивается. Мне было очень весело создавать эту систему, но это было очень сложно и отнимало много времени. На создание стабильного фреймворка ушло почти 18 месяцев. Я бы хотел, чтобы читатели попытались воспроизвести мою систему. Разница здесь в том, что у вас будет код, которого у меня не было, когда я только начинал, так что вы в основном будете создавать и настраивать, а не программировать.

ЗАГРУЗКИ

скачать




Необходимо добавить материалы...
Результат опроса Результаты Все опросы нашего сайта Архив опросов
Всего голосовало: 373



          

Радио для всех© 2024