- Настройване на Raspberry Pi с Buster и OpenCV
- Добавяне на зумер към дисплея на Raspberry Pi 5Inch
- Програмиране на Raspberry Pi за откриване на движение за видеонаблюдение
- Откриване на движение на OpenCV с помощта на Raspberry Pi
- Настройка на аларма за откриване на движение
- Мониторинг на температурата и използването на процесора
- Стартиране на вашия Pi CCTV детектор на движение
OpenCV е мощен инструмент и в комбинация с Raspberry Pi може да отвори врати за много преносими интелигентни устройства. В нашата предишна статия за наблюдение на Raspberry Pi CCTV научихме как да получаваме видео на живо за видеонаблюдение от DVR с помощта на RTSP и да го показваме на Raspberry Pi, проверете това, преди да продължите. В тази статия ще научим как да използваме силата на OpenCV и да изградим система за разпознаване на движение Raspberry Pi на нашите кадри от видеонаблюдение на живо. Ако нямате инсталирана система за видеонаблюдение, все още можете да изградите система за наблюдение на Raspberry Pi, като свържете USB камери директно към вашия Pi. И ако не сте голям фен на Pi и Python, можете да изградите нещо подобно с ESP32, вижте ESP32 Wi-Fi Bell Bell за повече подробности.
Ще напишем питон скрипт, който може да наблюдава всичките четири камери за видеонаблюдение едновременно за всякакви дейности (движение). Ако се открие активност на която и да е камера, нашият Raspberry Pi автоматично ще премине към конкретния екран на камерата и ще подчертае коя активност е била извършена, всичко това в реално време със само 1,5 секунди закъснение. Добавил съм и функция за аларма, като зумер, който може да предупреди потребителя, като издава звуков сигнал, ако се открие активност. Но можете лесно да го увеличите, за да изпратите съобщение или имейл или какво ли още не! Вълнуващо право !! Да започваме
Настройване на Raspberry Pi с Buster и OpenCV
Използвам Raspberry Pi 3 B + с работеща ОС Buster и версията на OpenCV е 4.1. Ако сте напълно нови, следвайте уроците по-долу, преди да започнете.
Целта е вашият Pi да е готов и готов за развитие. Добре е да имате всяка версия на Raspbian OS на вашия Pi, но се уверете, че версията на 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 install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5
Вече изградихме много проекти за Raspberry Pi OpenCV, можете също да проверите това за повече вдъхновения.
Добавяне на зумер към дисплея на Raspberry Pi 5Inch
От хардуерна страна нямаме много друго освен 5-инчов дисплей и зумер. След свързване на 5-инчов дисплей с Raspberry Pi, можем директно да монтираме зумера на задната страна на дисплея, който удължи някои GPIO пинове за нас. Свързах моя зумер, както е показано по-долу -
Ако се интересувате от използване на повече I / O щифтове, тогава описанието на щифта по-долу ще бъде полезно. Както можете да видите сред разширените щифтове, повечето от щифтовете се използват от самия дисплей за сензорен интерфейс. Но все пак имаме щифтове 3,5,7,8,10,11,12,13,15,16 и 24, които нямат връзка и можем да го използваме за нашето собствено приложение. В този урок съм свързал зумер към GPIO 3.
Програмиране на Raspberry Pi за откриване на движение за видеонаблюдение
Пълният скрипт на python за този проект може да бъде намерен в долната част на тази страница, но нека обсъдим всеки сегмент от кода, за да разберем как работи.
Наблюдение на множество камери без забавяне на Raspberry Pi с помощта на RTSP
Предизвикателната част при извършването на тази работа беше да се намали натоварването на Raspberry pi, за да се избегне забавяне на поточното предаване. Първоначално се опитах да превключвам между четирите камери, за да търся движение, но беше много забавено (около 10 секунди). Така че комбинирах и четирите камери в едно изображение и направих всички дейности по откриване на движение на това изображение. Написах две функции, а именно, създавам камера и чета камера.
Функцията за създаване на камера се използва за отваряне на камерата със съответния номер на канала. Обърнете внимание, че URL адресът на RTSP завършва с „02“, което означава, че използвам видеопотока за поток, който ще бъде с ниска резолюция и следователно по-бърз за четене. Също така, типът видео кодек, който използвате, също допринася за скоростта, експериментирах с различни кодове и установих, че FFMPEG е гладувал на всички.
def create_camera (канал): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / канали /" + канал + "02" # промяна на IP, за да отговаря your cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Идентификационен номер за ширина е 3 cap.set (4, cam_height) # Идентификационен номер за височина е 480 cap.set (10, 100) # Идентификационният номер за яркост е 10 return cap
Във функцията за четене на камерата ще прочетем всичките четири камери, а именно cam1, cam2, cam3 и cam4, за да ги комбинираме в едно изображение, наречено Main_screen . След като този основен екран е готов, ще направим цялата си работа с OpenCV върху това изображение.
def read_camera (): успех, current_screen = cam1.read () Main_screen = current_screen успех, current_screen = cam2.read () Main_screen = current_screen успех, current_screen = cam3.read () Main_screen = current_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 () # Прочетете втория кадър grayImage_F2 = cv2.cvtColor (frame2, cv2.CORY
След това правим разлика между двете изображения, за да видим какво се е променило и с праг, групираме всички места, които са се променили, нещо като петно. Също така е обичайно размазването и разширяването на изображението, за да се избегнат остри ръбове.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # получите разликата - това е хладно blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, pragImage = cv2.threshold (blurImage, 20,255, cv2.THRESH) dilatedImage = cv2.dilate (прагImage, ядро, итерации = 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 <ширина на камерата): if (y <cam_height): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <cam_height): screen = frame1 print ("Activity in cam screen 3") else: screen = frame1 print ("Activity in cam screen 4") return (screen)
Настройка на аларма за откриване на движение
След като разберем на кой екран се открива движение, е лесно да добавим всякакъв вид аларма, от която се нуждаем. Тук ще издаваме звуков сигнал, свързан към GPIO 3. Операторът if проверява дали движението е било открито на екран 3 и увеличава променлива, наречена trig_alarm . Можете да откриете всеки екран по ваш избор или дори на множество екрани.
if ((x> ширина на камерата) и (y
Ако стойността на trig_alarm достигне повече от 3, ще издаваме звуков сигнал веднъж. Причината за това броене е, че понякога забелязвах, че сенки или птици създават фалшива аларма. Така че по този начин, само ако има непрекъсната активност за 3 кадъра, ще получим аларма.
if (trig_alarm> = 3): # изчакайте conts 3 движения # Bee the Buzzer 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 детектор на движение
Изпробвах това с дни, за да се събера и работи всеки път и наистина беше забавно, докато не повредих една камера,