- Opsætning af Raspberry Pi med Buster og OpenCV
- Tilføjelse af summer til Raspberry Pi 5-tommers skærm
- Programmering Raspberry Pi til CCTV bevægelsesregistrering
- Bevægelsesregistrering på OpenCV ved hjælp af Raspberry Pi
- Indstilling af alarm til bevægelsesregistrering
- Overvågning af CPU-temperatur og -brug
- Lancering af din Pi CCTV bevægelsesdetektor
OpenCV er et kraftfuldt værktøj, og det kombineret med Raspberry Pi kan åbne døre til mange bærbare smarte enheder. I vores tidligere Raspberry Pi CCTV-overvågningsartikel lærte vi, hvordan man får live CCTV-video fra en DVR ved hjælp af RTSP og vises på en Raspberry Pi, skal du tjekke det ud, før du fortsætter. I denne artikel vil vi lære at udnytte kraften i OpenCV og opbygge et Raspberry Pi Motion Detection- system på vores live CCTV-optagelser. Hvis du ikke har et CCTV installeret, kan du stadig oprette et Raspberry Pi Surveillance-system ved at forbinde USB-kameraer direkte til din Pi. Og hvis du ikke er en stor fan af Pi og Python, kan du opbygge noget lignende med ESP32, se ESP32 Wi-Fi Door Bell for flere detaljer.
Vi skriver et python-script, der kan overvåge alle de fire CCTV-kameraer samtidigt for alle aktiviteter (bevægelse). Hvis der registreres en aktivitet på et hvilket som helst kamera, skifter vores Raspberry Pi automatisk til den pågældende kameraskærm og fremhæver, hvilken aktivitet der fandt sted, alt dette i realtid med kun 1,5 sekunders forsinkelse. Jeg har også tilføjet en alarmfunktion, som en summer, som kan advare brugeren ved at bippe, hvis der registreres en aktivitet. Men du kan nemt skalere dette op for at sende en besked eller e-mail eller hvad ikke! Spændende rigtigt !! Lad os komme igang
Opsætning af Raspberry Pi med Buster og OpenCV
Jeg bruger Raspberry Pi 3 B + med Buster OS, der kører på den, og versionen af OpenCV er 4.1. Hvis du er helt ny, skal du følge vejledningen nedenfor, før du kan komme i gang.
Målet er at have din Pi klar og klar til udvikling. Det er okay at have nogen version af Raspbian OS på din Pi, men sørg for, at versionen af OpenCV er 4.1 eller nyere. Du kan enten følge ovenstående tutorial for at kompilere din OpenCV, som vil tage timer, men er mere pålidelig til tunge projekter eller bare installere den direkte fra pip ved hjælp af følgende kommandoer.
$ pip installer opencv-contrib-python == 4.1.0.25
Hvis du installerer OpenCV med pip for første gang, skal du også installere de andre afhængigheder. Brug nedenstående kommandoer til 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-projekter, du kan også tjekke det ud for mere inspiration.
Tilføjelse af summer til Raspberry Pi 5-tommers skærm
På hardwaresiden har vi ikke meget andet end en 5-tommers skærm og en summer. Efter interfacering af 5-tommers skærm med Raspberry Pi kan vi montere summeren direkte på bagsiden af skærmen, som har udvidet nogle GPIO-ben til os. Jeg har tilsluttet min summer som vist nedenfor -
Hvis du er interesseret i at bruge flere I / O-ben, vil nedenstående pin-beskrivelse være nyttig. Som du kan se blandt de udvidede stifter, bruges de fleste stifter af selve skærmen til en berøringsskærmgrænseflade. Men stadig har vi pins 3,5,7,8,10,11,12,13,15,16 og 24, der ikke har nogen forbindelse, og vi kan bruge det til vores egen applikation. I denne vejledning har jeg tilsluttet en summer til GPIO 3.
Programmering Raspberry Pi til CCTV bevægelsesregistrering
Det komplette python-script til dette projekt findes nederst på denne side, men lad os diskutere hvert segment af koden for at forstå, hvordan det fungerer.
Overvågning af flere kameraer uden lag på Raspberry Pi ved hjælp af RTSP
Den udfordrende del i dette arbejde var at reducere belastningen på Raspberry pi for at undgå et forsinket streaming. Oprindeligt forsøgte jeg at skifte mellem alle fire kameraer for at se efter bevægelse, men det var meget lagget (ca. 10 sekunder). Så jeg kombinerede alle fire kameraer til et enkelt billede og udførte alle bevægelsesdetekterende aktiviteter på det billede. Jeg skrev to funktioner, nemlig at oprette et kamera og læse kamera.
Den skaber kamera funktionen bruges til at åbne cam med sin respektive kanal nummer. Bemærk, at RTSP URL slutter med "02", hvilket betyder, at jeg bruger understrøm-videofeed, som har lav opløsning og dermed hurtigere at læse. Også den type videokodec, du bruger, bidrager også til hastighed, jeg eksperimenterede med forskellige koder og fandt FFMPEG at være fastet for alle.
def create_camera (kanal): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanaler /" + kanal + "02" #ændrer IP'en, så 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_højde) # ID-nummer for højde er 480 cap.set (10, 100) # ID-nummer for lysstyrke er 10 returneringshætte
I funktionen læse kamera læser vi alle fire kameraer, nemlig cam1, cam2, cam3 og cam4 for at kombinere dem alle til et enkelt billede kaldet Main_screen . Når denne hovedskærm er klar, udfører vi alt vores OpenCV-arbejde med dette billede.
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)
Hovedskærmbilledet med alle de fire cams kombineret vil se ud som billedet vist nedenfor.
Bevægelsesregistrering på OpenCV ved hjælp af Raspberry Pi
Nu hvor vi har billedet klar, kan vi starte med vores bevægelsesdetektering. Inde i while-løkken starter vi med at læse to forskellige rammer, nemlig frame1 og frame2, og konverterer dem derefter til gråtoner
frame1 = read_camera () #Læs den første frame gråImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Konverter til grå frame2 = read_camera () #Læs 2. frame gråImage_F2 = cv2.cvtColor (frame2, cv2GR
Så tager vi en forskel mellem begge disse billeder for at se, hvad der er ændret, og med en tærskel grupperer vi alle de steder, der havde ændret sig, ligesom en klat. Det er også almindeligt at sløre og udvide billedet for at undgå skarpe kanter.
diffImage = cv2.absdiff (greyImage_F1, greyImage_F2) # få forskellen - dette er cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255ES, cv2.) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
Næste trin er at finde tællere og kontrollere området for hver tæller ved at finde området, kan vi finde ud af, hvor stor bevægelsen er. Hvis området er større end en specificeret værdi i variablen motion_detected , betragter vi det som en aktivitet og tegner et felt omkring ændringen for at fremhæve det for brugeren.
konturer, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find kontur er en magisk funktion til kontur i konturer: #for hver ændring, der registreres (x, y, w, h) = cv2.boundingRect (kontur) # få det sted, hvor ændringen blev fundet, hvis 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 () bruges til at finde, hvor aktiviteten fandt sted blandt de fire kameraer. Vi kan finde det, da vi kender x- og y-værdierne for bevægelsen. Vi sammenligner disse x- og y-værdier med placeringen af hver skærm for at finde ud af, hvilken skærm der gav aktivitet, og vi beskærer igen den bestemte skærm, så vi kan vise den på pi-berøringsskæ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") ellers: if (y <cam_height): screen = frame1 print ("Activity in cam screen 3") ellers: screen = frame1 print ("Activity in cam screen 4") return (screen)
Indstilling af alarm til bevægelsesregistrering
Når vi først ved, på hvilken skærm, bevægelse registreres, er det let at tilføje enhver type alarm, vi har brug for. Her vil vi bippe en buzzer tilsluttet GPIO 3. hvis erklæring tjekker, om bevægelsen blev påvist i skærmen 3 og trin en variabel kaldet trig_alarm . Du kan registrere enhver skærm efter eget valg eller endda på flere skærme.
hvis ((x> cam_width) og (y
Hvis værdien af trig_alarm når mere end 3, bipper vi en summer en gang. Årsagen til denne optælling er, at jeg nogle gange bemærkede, at skygger eller fugle skabte falsk alarm. Så kun denne måde, hvis der er en kontinuerlig aktivitet i 3 billeder, får vi en alarm.
hvis (trig_alarm> = 3): # vent på konter 3 bevægelser # Beep Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Overvågning af CPU-temperatur og -brug
Systemet er indrykket for at arbejde 24x7, og derfor kan Pi blive meget varm, så jeg beslutter at overvåge temperaturen og CPU-brugen ved at vise disse værdier på skærmen. Vi har fået disse oplysninger ved hjælp af 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)
Lancering af din Pi CCTV bevægelsesdetektor
Jeg har testet dette i flere dage for at samles, og det fungerer hver eneste gang, og det var virkelig en sjov bygning, indtil jeg beskadigede et kamera,