- Настройка Raspberry Pi с помощью Buster и OpenCV
- Добавление зуммера на 5-дюймовый дисплей Raspberry Pi
- Программирование Raspberry Pi для обнаружения движения CCTV
- Обнаружение движения на OpenCV с использованием Raspberry Pi
- Настройка сигнализации для обнаружения движения
- Мониторинг температуры процессора и использования
- Запуск детектора движения Pi CCTV
OpenCV - мощный инструмент, который в сочетании с Raspberry Pi может открыть двери для многих портативных интеллектуальных устройств. В нашей предыдущей статье о мониторинге видеонаблюдения на Raspberry Pi мы узнали, как получать живое видео с видеонаблюдения с цифрового видеорегистратора с использованием RTSP и отображать его на Raspberry Pi, проверьте это, прежде чем продолжить. В этой статье мы узнаем, как использовать возможности OpenCV и создать систему обнаружения движения Raspberry Pi на наших видеозаписях с камер видеонаблюдения в реальном времени. Если у вас не установлена система видеонаблюдения, вы все равно можете создать систему видеонаблюдения Raspberry Pi, подключив USB-камеры непосредственно к вашему Pi. И если вы не большой поклонник Pi и Python, вы можете создать что-то подобное с ESP32, см. ESP32 Wi-Fi Door Bell для более подробной информации.
Мы напишем скрипт на Python, который сможет отслеживать все четыре камеры видеонаблюдения одновременно на предмет любых действий (движения). Если на какой-либо камере будет обнаружена активность, наш Raspberry Pi автоматически переключится на экран этой конкретной камеры и выделит, какое действие имело место, и все это в режиме реального времени с задержкой всего в 1,5 секунды. Я также добавил функцию сигнализации, например зуммер, который может предупреждать пользователя звуковым сигналом при обнаружении активности. Но вы можете легко масштабировать это, чтобы отправить сообщение или электронную почту или что-то еще! Замечательно !! Давайте начнем
Настройка Raspberry Pi с помощью Buster и OpenCV
Я использую Raspberry Pi 3 B + с запущенной на нем OS Buster, а версия OpenCV - 4.1. Если вы новичок, следуйте инструкциям ниже, прежде чем приступить к работе.
Цель состоит в том, чтобы ваш Pi был готов к разработке. Это нормально, если на вашем Pi установлена любая версия Raspbian OS, но убедитесь, что версия OpenCV - 4.1 или выше. Вы можете либо следовать приведенному выше руководству, чтобы скомпилировать OpenCV, что займет несколько часов, но более надежно для тяжелых проектов, либо просто установите его прямо из pip, используя следующие команды.
$ pip установить opencv-contrib-python == 4.1.0.25
Если вы устанавливаете OpenCV с помощью pip в первый раз, вам также необходимо установить другие зависимости. Используйте для этого следующие команды.
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev $ sudo apt-get install libatlas-base-dev gfortran $ sudo apt-get install libhdf5- dev libhdf5-serial-dev libhdf5-103 $ sudo apt-get установить libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Мы уже создали много проектов Raspberry Pi OpenCV, вы также можете проверить это, чтобы получить больше вдохновения.
Добавление зуммера на 5-дюймовый дисплей Raspberry Pi
Что касается оборудования, у нас нет ничего, кроме 5-дюймового дисплея и зуммера. После взаимодействия 5-дюймового дисплея с Raspberry Pi мы можем напрямую установить зуммер на заднюю часть дисплея, что расширило для нас несколько контактов GPIO. Я подключил зуммер, как показано ниже.
Если вы заинтересованы в использовании большего количества выводов ввода-вывода, вам будет полезно описание выводов ниже. Как вы можете видеть среди расширенных контактов, большинство контактов используется самим дисплеем для интерфейса сенсорного экрана. Но все же у нас есть контакты 3,5,7,8,10,11,12,13,15,16 и 24, которые не имеют связи, и мы можем использовать их для нашего собственного приложения. В этом руководстве я подключил зуммер к GPIO 3.
Программирование Raspberry Pi для обнаружения движения CCTV
Полный скрипт python для этого проекта можно найти внизу этой страницы, но давайте обсудим каждый сегмент кода, чтобы понять, как он работает.
Мониторинг нескольких камер без задержек на Raspberry Pi с использованием RTSP
Сложной частью этой работы было уменьшить нагрузку на Raspberry pi, чтобы избежать задержек в потоковой передаче. Изначально я пытался переключаться между всеми четырьмя камерами, чтобы искать движение, но это было очень медленно (около 10 секунд). Поэтому я объединил все четыре камеры в одно изображение и проделал все действия по обнаружению движения на этом изображении. Я написал две функции, а именно создание камеры и чтение камеры.
Функция создания камеры используется для открытия камеры с соответствующим номером канала. Обратите внимание, что URL-адрес RTSP заканчивается на «02», что означает, что я использую видеопоток дополнительного потока, который будет иметь низкое разрешение и, следовательно, быстрее читать. Кроме того, тип видеокодека, который вы используете, также влияет на скорость, я экспериментировал с разными кодами и обнаружил, что FFMPEG быстрее всех.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" # изменить IP по своему усмотрению yours cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID номер для ширины 3 cap.set (4, cam_height) # ID номер для высоты 480 cap.set (10, 100) # Идентификационный номер яркости 10, возврат крышки
В функции чтения камеры мы прочитаем все четыре камеры, а именно cam1, cam2, cam3 и cam4, чтобы объединить их все в одно изображение под названием Main_screen . Как только этот главный экран будет готов, мы выполним всю нашу работу с OpenCV над этим изображением.
def read_camera (): success, current_screen = cam1.read () Main_screen = current_screen success, current_screen = cam2.read () Main_screen = current_screen success, current_screen = cam3.read () Main_screen = Успех текущего_ экрана, current_screen = cam4.read () Main_screen = текущий_экран возврат (Main_screen)
Изображение на главном экране со всеми четырьмя объединенными камерами будет выглядеть так, как показано ниже.
Обнаружение движения на OpenCV с использованием Raspberry Pi
Теперь, когда у нас есть готовое изображение, мы можем начать с обнаружения движения. Внутри цикла while мы начинаем с чтения двух разных кадров, а именно, frame1 и frame2, а затем конвертируем их в оттенки серого.
frame1 = read_camera () # Прочитать первый кадр grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Преобразовать в серый frame2 = read_camera () # Прочитать 2-й кадр grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR)
Затем мы берем разницу между обоими этими изображениями, чтобы увидеть, что изменилось, и с помощью порога группируем все места, в которых произошли изменения, вроде капли. Также распространено размытие и расширение изображения, чтобы избежать резких краев.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) # получить разницу - это круто blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (thresholdImage, kernal, итераций = 5)
Следующий шаг - найти счетчики и проверить площадь каждого счетчика; найдя площадь, мы можем определить, насколько велико движение. Если область больше указанного значения в переменной motion_detected , мы рассматриваем это как действие и рисуем рамку вокруг изменения, чтобы выделить его для пользователя.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour - волшебная функция для контура в контурах: # для каждого обнаруженного изменения (x, y, w, h) = cv2.boundingRect (contour) # получить место, где было обнаружено изменение, если cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0)), 1) display_screen = find_screen ()
Функция find_screen () используется для определения того, где происходило действие среди четырех камер. Мы можем найти это, поскольку знаем значения x и y движения. Мы сравниваем эти значения x и y с расположением каждого экрана, чтобы определить, какой экран дал активность, и снова обрезаем этот конкретный экран, чтобы мы могли отобразить его на сенсорном экране pi.
def find_screen (): if (x <cam_width): if (y <cam_height): screen = frame1 print («Активность на экране камеры 1») else: screen = frame1 print («Активность на экране камеры 2») else: if (y <cam_height): screen = frame1 print («Активность на экране камеры 3») else: screen = frame1 print («Активность на экране камеры 4») return (screen)
Настройка сигнализации для обнаружения движения
Как только мы узнаем, на каком экране обнаружено движение, можно легко добавить любой тип сигнала тревоги, который нам нужен. Здесь мы подадим звуковой сигнал, подключенный к GPIO 3. Оператор if проверяет, было ли обнаружено движение на экране 3, и увеличивает переменную с именем trig_alarm . Вы можете обнаружить любой экран по вашему выбору или даже на нескольких экранах.
если ((x> cam_width) и (y
Если значение trig_alarm превышает 3, мы один раз подадим звуковой сигнал. Причина этого подсчета в том, что иногда я замечал, что тени или птицы создают ложную тревогу. Таким образом, только если есть непрерывная активность в течение 3 кадров, мы получим сигнал тревоги.
if (trig_alarm> = 3): # ждать conts 3 движения # Звуковой сигнал GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Мониторинг температуры процессора и использования
Система предназначена для работы 24x7, и поэтому Pi может сильно нагреваться, поэтому я решил контролировать температуру и использование процессора, отображая эти значения на экране. Мы получили эту информацию с помощью библиотеки gpiozero.
cpu = CPUTemperature () load = LoadAverage () cpu_temperature = str ((cpu.temperature) // 1) load_average = str (load.load_average) #print (cpu.temperature) #print (load.load_average) cv2.putText (display_screen, cpu_temperature, (250,250), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0,0,255), 1) cv2.putText (display_screen, load_average, (300,250), cv2.FONT_HERSHEY_SIMPLEX, 0,4, (0,255,0), 2)
Запуск детектора движения Pi CCTV
Я тестировал это несколько дней, чтобы собрать, и он работает каждый раз, и это была действительно забавная сборка, пока я не повредил одну камеру,