- Konfigurera Raspberry Pi med Buster och OpenCV
- Lägga till summer till Raspberry Pi 5-tums skärm
- Programmering Raspberry Pi för CCTV rörelsedetektering
- Rörelsedetektering på OpenCV med Raspberry Pi
- Ställer in larm för rörelsedetektering
- Övervakning av CPU-temperatur och användning
- Startar din Pi CCTV rörelsedetektor
OpenCV är ett kraftfullt verktyg och som i kombination med Raspberry Pi kan öppna dörrar till många bärbara smarta enheter. I vår tidigare Raspberry Pi CCTV-övervakningsartikel lärde vi oss hur man får live CCTV-video från en DVR med RTSP och visas på en Raspberry Pi, kolla in det innan du fortsätter. I den här artikeln lär vi oss att utnyttja kraften i OpenCV och bygga ett Raspberry Pi rörelsedetekteringssystem på våra live-CCTV-bilder. Om du inte har en CCTV installerad kan du fortfarande bygga ett Raspberry Pi-övervakningssystem genom att ansluta USB-kameror direkt till din Pi. Och om du inte är ett stort fan av Pi och Python kan du bygga något liknande med ESP32, se ESP32 Wi-Fi Door Bell för mer information.
Vi kommer att skriva ett python-skript som kan övervaka alla fyra CCTV-kameror samtidigt för alla aktiviteter (rörelse). Om en aktivitet upptäcks på någon kamera ändras vår Raspberry Pi automatiskt till den specifika kameraskärmen och markerar vilken aktivitet som ägde rum, allt detta i realtid med bara 1,5 sekunders fördröjning. Jag har också lagt till en larmfunktion, som en summer som kan varna användaren genom att pipa om en aktivitet upptäcks. Men du kan enkelt skala upp detta för att skicka ett meddelande eller e-post eller vad inte! Spännande rätt !! Låt oss börja
Konfigurera Raspberry Pi med Buster och OpenCV
Jag använder Raspberry Pi 3 B + med Buster OS som körs på den och versionen av OpenCV är 4.1. Om du är helt ny, följ instruktionerna nedan innan du kan komma igång.
Målet är att ha din Pi upp och redo för utveckling. Det är okej att ha någon version av Raspbian OS på din Pi men se till att versionen av OpenCV är 4.1 eller högre. Du kan antingen följa ovanstående handledning för att kompilera din OpenCV som tar timmar men är mer tillförlitlig för tunga projekt eller bara installera den direkt från pip med följande kommandon.
$ pip installera opencv-contrib-python == 4.1.0.25
Om du installerar OpenCV med pip för första gången måste du också installera andra beroenden. Använd kommandona nedan för det.
$ 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
Vi har redan byggt många Raspberry Pi OpenCV-projekt, du kan också kolla in det för mer inspiration.
Lägga till summer till Raspberry Pi 5-tums skärm
På hårdvarusidan har vi inte mycket annat än en 5-tums skärm och en summer. Efter interfacering av 5-tums skärm med Raspberry Pi kan vi montera summern direkt på baksidan av skärmen som har utökat några GPIO-stift för oss. Jag har anslutit min summer som visas nedan-
Om du är intresserad av att använda fler I / O-stift kommer beskrivningen nedan att vara användbar. Som du kan se bland de utökade stiften används de flesta stiften av skärmen själv för ett pekskärmsgränssnitt. Men ändå har vi stiften 3,5,7,8,10,11,12,13,15,16 och 24 som inte har någon anslutning och vi kan använda den för vår egen applikation. I den här guiden har jag anslutit en summer till GPIO 3.
Programmering Raspberry Pi för CCTV rörelsedetektering
Det fullständiga pythonscriptet för detta projekt finns längst ner på den här sidan, men låt oss diskutera varje kodsegment för att förstå hur det fungerar.
Övervakning av flera kameror utan fördröjning på Raspberry Pi med RTSP
Den utmanande delen i detta arbete var att minska belastningen på Raspberry pi för att undvika en fördröjning i streaming. Inledningsvis försökte jag växla mellan alla fyra kamerorna för att leta efter rörelse men det var väldigt slö (cirka 10 sekunder). Så jag kombinerade alla fyra kamerorna till en enda bild och gjorde alla rörelsedetekterande aktiviteter på den bilden. Jag skrev två funktioner, nämligen att skapa en kamera och läsa kameran.
Den skapar kamerafunktionen används för att öppna kammen med sin respektive kanalnummer. Observera att RTSP URL slutar med "02", vilket innebär att jag använder videoströmmen för underström som har låg upplösning och därmed snabbare att läsa. Den typ av videokodek du använder bidrar också till hastighet, jag experimenterade med olika koder och fann att FFMPEG var fasta för alla.
def create_camera (kanal): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanaler /" + kanal + "02" # ändra IP så att den passar din cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID-nummer för bredd är 3 cap.set (4, cam_height) # ID-nummer för höjd är 480 cap.set (10, 100) # ID-nummer för ljusstyrka är 10 returlock
I read kamerafunktionen, kommer vi att läsa alla fyra kameror nämligen CAM1, CAM2, cam3 och cam4 att kombinera dem alla i en enda bild som kallas Main_screen . När den här huvudskärmen är klar kommer vi att göra allt vårt OpenCV-arbete med den här bilden.
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 success, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
Huvudskärmsbilden med alla fyra kammarna kombinerade kommer att se ut som bilden nedan.
Rörelsedetektering på OpenCV med Raspberry Pi
Nu när vi har bilden klar kan vi börja med vår rörelsedetektering. Inuti stundslingan börjar vi med att läsa två olika ramar, nämligen ram1 och ram2, och konverterar dem sedan till gråskala
frame1 = read_camera () #Read the first frame greyImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convert to grey frame2 = read_camera () #Read the 2nd frame grayImage_F2 = cv2.cvtColor (frame2, cv2GR
Sedan tar vi en skillnad mellan båda dessa bilder för att se vad som har förändrats och med en tröskel grupperar vi alla platser som hade förändrats, ungefär som en blob. Det är också vanligt att suddiga och vidga bilden för att undvika skarpa kanter.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # få skillnaden - det här är cool oskärpaImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255ES, cv2) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
Nästa steg är att hitta räknare och kontrollera varje räknas område, genom att hitta området kan vi räkna ut hur stor rörelsen är. Om området är större än ett angivet värde i variabeln motion_detected , betraktar vi det som en aktivitet och ritar en ruta runt ändringen för att markera den för användaren.
konturer, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour är en magisk funktion för konturer i konturer: # för varje förändring som detekteras (x, y, w, h) = cv2.boundingRect (kontur) # få platsen där ändring hittades om cv2.contourArea (kontur)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Funktionen find_screen () används för att hitta var aktiviteten ägde rum bland de fyra kamerorna. Vi kan hitta det eftersom vi känner till x- och y-värdena för rörelsen. Vi jämför dessa x- och y-värden med platsen för varje skärm för att hitta vilken skärm som gav aktivitet och vi beskär igen den skärmen, så att vi kan visa den på pi-pekskärmen.
def find_screen (): if (x <cam_width): 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)
Ställer in larm för rörelsedetektering
När vi vet, på vilken skärm, rörelse detekteras, är det enkelt att lägga till alla typer av larm vi behöver. Här piper vi en summer som är ansluten till GPIO 3. If- uttalandet kontrollerar om rörelsen upptäcktes i skärm 3 och ökar en variabel som heter trig_alarm . Du kan upptäcka valfri skärm eller till och med på flera skärmar.
om ((x> cam_width) och (y
Om värdet för trig_alarm når mer än 3, kommer vi att pipa en summer en gång. Anledningen till denna räkning är att jag ibland märkte att skuggor eller fåglar skapade falska larm. Så det här bara om det finns en kontinuerlig aktivitet för 3 bilder, får vi ett larm.
if (trig_alarm> = 3): # vänta på konter 3 rörelser # Beep Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Övervakning av CPU-temperatur och användning
Systemet är indraget för att fungera 24x7 och därmed kan Pi bli mycket varmt, så jag bestämmer mig för att övervaka temperaturen och CPU-användningen genom att visa dessa värden på skärmen. Vi har fått denna information med hjälp av gpiozero-biblioteket.
cpu = CPUTemperature () load = LoadAverage () cpu_temperature = str ((cpu.temperature) // 1) load_average = str (load.load_average) #print (cpu.temperature) #print (load.load_average) cv2., 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)
Startar din Pi CCTV rörelsedetektor
Jag har testat detta i flera dagar för att samlas och det fungerar varje gång och det var verkligen en rolig byggnad tills jag skadade en kamera,