- Sette opp Raspberry Pi med Buster og OpenCV
- Legge til summer til Raspberry Pi 5-tommers skjerm
- Programmering Raspberry Pi for CCTV bevegelsesdeteksjon
- Bevegelsesdeteksjon på OpenCV ved bruk av Raspberry Pi
- Stille inn alarm for bevegelsesdeteksjon
- Overvåke CPU-temperatur og bruk
- Starter Pi CCTV bevegelsesdetektor
OpenCV er et kraftig verktøy, og det kombinert med Raspberry Pi kan åpne dører til mange bærbare smarte enheter. I vår forrige Raspberry Pi CCTV-overvåkingsartikkel lærte vi hvordan du får live CCTV-video fra en DVR ved hjelp av RTSP og vises på en Raspberry Pi. Sjekk det før du fortsetter. I denne artikkelen vil vi lære hvordan du kan utnytte kraften til OpenCV og bygge et Raspberry Pi Motion Detection- system på våre live CCTV-opptak. Hvis du ikke har et CCTV installert, kan du fortsatt bygge et Raspberry Pi Surveillance-system ved å koble USB-kameraer direkte til din Pi. Og hvis du ikke er en stor fan av Pi og Python, kan du bygge noe lignende med ESP32, se ESP32 Wi-Fi Door Bell for mer informasjon.
Vi vil skrive et python-skript som kan overvåke alle de fire CCTV-kameraene samtidig for alle aktiviteter (bevegelse). Hvis en aktivitet oppdages på et hvilket som helst kamera, vil vår Raspberry Pi automatisk skifte til den aktuelle kameraskjermen og markere hvilken aktivitet som fant sted, alt dette i sanntid med bare 1,5 sekunders forsinkelse. Jeg har også lagt til en alarmfunksjon, som en summer som kan varsle brukeren ved å pippe hvis en aktivitet oppdages. Men du kan enkelt skalere dette opp for å sende en melding eller e-post eller hva ikke! Spennende riktig !! La oss komme i gang
Sette opp Raspberry Pi med Buster og OpenCV
Jeg bruker Raspberry Pi 3 B + med Buster OS som kjører på den, og versjonen av OpenCV er 4.1. Hvis du er helt ny, følg veiledningene nedenfor før du kan komme i gang.
Målet er å ha Pi-en din klar og klar for utvikling. Det er greit å ha noen versjoner av Raspbian OS på Pi-en din, men sørg for at versjonen av OpenCV er 4.1 eller nyere. Du kan enten følge opplæringen ovenfor for å kompilere OpenCV, som vil ta timer, men er mer pålitelig for tunge prosjekter, eller bare installere den direkte fra pip ved hjelp av følgende kommandoer.
$ pip installer opencv-contrib-python == 4.1.0.25
Hvis du installerer OpenCV med pip for første gang, må du også installere de andre avhengighetene. Bruk kommandoene nedenfor for 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 allerede bygget mange Raspberry Pi OpenCV-prosjekter, du kan også sjekke det ut for mer inspirasjon.
Legge til summer til Raspberry Pi 5-tommers skjerm
På maskinvaresiden har vi ikke mye annet enn en 5-tommers skjerm og en summer. Etter å ha koblet til 5-tommers skjerm med Raspberry Pi, kan vi montere summeren på baksiden av skjermen, som har utvidet noen GPIO-pinner for oss. Jeg har koblet til summeren min som vist nedenfor -
Hvis du er interessert i å bruke flere I / O-pinner, vil beskrivelsen nedenfor være nyttig. Som du kan se blant de utvidede pinnene, brukes de fleste pinnene av selve skjermen til et berøringsskjermgrensesnitt. Men likevel har vi pinner 3,5,7,8,10,11,12,13,15,16 og 24 som ikke har noen forbindelse, og vi kan bruke den til vår egen applikasjon. I denne opplæringen har jeg koblet en summer til GPIO 3.
Programmering Raspberry Pi for CCTV bevegelsesdeteksjon
Det komplette python-skriptet for dette prosjektet finner du nederst på denne siden, men la oss diskutere hvert segment av koden for å forstå hvordan det fungerer.
Overvåker flere kameraer uten lag på Raspberry Pi ved hjelp av RTSP
Den utfordrende delen med å gjøre dette arbeidet var å redusere belastningen på Raspberry pi for å unngå et forsinket streaming. Opprinnelig prøvde jeg å bytte mellom alle fire kameraene for å se etter bevegelse, men det var veldig tøft (ca. 10 sekunder). Så jeg kombinerte alle fire kameraene til et enkelt bilde og gjorde alle bevegelsesoppdagende aktiviteter på det bildet. Jeg skrev to funksjoner, nemlig å lage et kamera og lese kamera.
Den opprette kamerafunksjon blir brukt til å åpne kammen med sin respektive kanalnummer. Merk at RTSP URL slutter med "02", noe som betyr at jeg bruker videostrømmen for understrøm som har lav oppløsning og dermed raskere å lese. Også, den typen videokodek du bruker, bidrar også til hastighet, jeg eksperimenterte med forskjellige koder og fant FFMPEG å være fastet for alle.
def create_camera (kanal): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanaler /" + kanal + "02" # endre IP slik at den passer din cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID-nummer for bredde er 3 cap.set (4, cam_height) # ID-nummer for høyde er 480 cap.set (10, 100) # ID-nummer for lysstyrke er 10 returlokk
I lesekamerafunksjonen, vil vi leser alle fire cams nemlig cam1, CAM2, cam3, og cam4 å kombinere dem alle i ett enkelt bilde som heter Main_screen . Når denne hovedskjermen er klar, vil vi gjøre alt vårt OpenCV-arbeid med dette bildet.
def read_camera (): suksess, current_screen = cam1.read () Main_screen = current_screen suksess, current_screen = cam2.read () Main_screen = current_screen suksess, current_screen = cam3.read () Main_screen = current_screen suksess, current_screen = cam4.read () Main_screen = current_screen return (Main_screen)
Hovedskjermbildet med alle de fire kameraene kombinert vil se ut som bildet vist nedenfor.
Bevegelsesdeteksjon på OpenCV ved bruk av Raspberry Pi
Nå som vi har bildet klart, kan vi starte med bevegelsesdeteksjonen. Inne i mens sløyfen begynner vi med å lese to forskjellige rammer, nemlig ramme1 og ramme2, og konverterer dem til gråtoner
frame1 = read_camera () #Read the first frame grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convert to grey frame2 = read_camera () #Read the 2nd frame grayImage_F2 = cv2.cvtColor (frame2, cv2GR
Så tar vi en forskjell mellom begge disse bildene for å se hva som har endret seg, og med en terskel grupperer vi alle stedene som hadde en forandring, som en klatt. Det er også vanlig å uskarpe og utvide bildet for å unngå skarpe kanter.
diffImage = cv2.absdiff (greyImage_F1, grayImage_F2) #get differance - dette er kult uskarphetImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255ES, cv2) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
Neste trinn er å finne tellere og sjekke området til hver teller. Ved å finne området kan vi finne ut hvor stor bevegelsen er. Hvis området er større enn en spesifisert verdi i variabelen motion_detected , anser vi det som en aktivitet og tegner en rute rundt endringen for å markere den for brukeren.
konturer, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour er en magisk funksjon for kontur i konturer: #for hver endring som blir oppdaget (x, y, w, h) = cv2.boundingRect (kontur) # få stedet der endring ble funnet hvis cv2.contourArea (kontur)> bevegelsesterskel: cv2.rektangel (ramme1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Funksjonen find_screen () brukes til å finne hvor aktiviteten fant sted blant de fire kameraene. Vi kan finne det siden vi kjenner bevegelsene x og y. Vi sammenligner disse x- og y-verdiene med plasseringen av hver skjerm for å finne hvilken skjerm som ga aktivitet, og vi beskjærer igjen den aktuelle skjermen, slik at vi kan vise den på pi-berøringsskjermen.
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") ellers: screen = frame1 print ("Activity in cam screen 4") return (screen)
Stille inn alarm for bevegelsesdeteksjon
Når vi vet, på hvilken skjerm, bevegelse blir oppdaget, er det enkelt å legge til en hvilken som helst type alarm vi trenger. Her vil vi piper en buzzer koblet til GPIO 3. hvis setningen sjekker om bevegelsen ble oppdaget i skjermen 3 og trinn en variabel kalt trig_alarm . Du kan oppdage hvilket som helst skjermbilde du ønsker eller til og med på flere skjermer.
hvis ((x> kambredde) og (y
Hvis verdien av trig_alarm når mer enn 3, vil vi pippe en summer en gang. Årsaken til denne opptellingen er at jeg noen ganger la merke til at skygger eller fugler skapte falske alarmer. Så bare hvis det er en kontinuerlig aktivitet for 3 bilder, vil vi få en alarm.
hvis (trig_alarm> = 3): # vent på konter 3 bevegelser # Beep Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Overvåke CPU-temperatur og bruk
Systemet er innrykket for å fungere 24x7, og derfor kan Pi bli veldig varmt, så jeg bestemmer meg for å overvåke temperaturen og CPU-bruken ved å vise disse verdiene på skjermen. Vi har fått denne informasjonen ved hjelp 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.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)
Starter Pi CCTV bevegelsesdetektor
Jeg har testet dette i flere dager for å samles, og det fungerer hver eneste gang, og det var veldig morsomt å bygge til jeg skadet ett kamera,