- Nastavitev Raspberry Pi z Busterjem in OpenCV
- Dodajanje zvočnega signala na zaslon Raspberry Pi 5Inch
- Programiranje Raspberry Pi za zaznavanje gibanja CCTV
- Zaznavanje gibanja na OpenCV z uporabo Raspberry Pi
- Nastavitev alarma za zaznavanje gibanja
- Spremljanje temperature in uporabe CPU
- Zagon vašega detektorja gibanja Pi CCTV
OpenCV je močno orodje, ki lahko skupaj z Raspberry Pi odpre vrata številnim prenosnim pametnim napravam. V prejšnjem članku o nadzoru za Raspberry Pi CCTV smo se naučili, kako pridobiti CCTV video v živo iz DVR-ja z uporabo RTSP-ja in ga prikazati na Raspberry Pi, preden to nadaljujete, preverite. V tem članku se bomo naučili, kako izkoristiti moč OpenCV in zgraditi sistem za zaznavanje gibanja Raspberry Pi na naših posnetkih CCTV v živo. Če CCTV ni nameščen, lahko še vedno zgradite nadzorni sistem Raspberry Pi, tako da neposredno povežete USB kamere s svojim Pi. Če niste navdušeni nad Pi in Pythonom, lahko z ESP32 sestavite nekaj podobnega, za več podrobnosti glejte ESP32 Wi-Fi Door Bell.
Napisali bomo skript python, ki lahko hkrati spremlja vse štiri kamere CCTV za kakršne koli dejavnosti (gibanje). Če na kateri koli kameri zaznamo dejavnost, se bo naš Raspberry Pi samodejno preklopil na ta zaslon fotoaparata in poudaril, katera aktivnost se je zgodila, vse to v realnem času z zaostankom v samo 1,5 sekunde. Dodal sem tudi funkcijo alarma, kot je zvočni signal, ki lahko uporabnika opozori s piskom, če je zaznana dejavnost. Lahko pa to enostavno prilagodite tako, da pošljete sporočilo ali e-pošto ali kaj drugega! Razburljivo prav !! Začnimo
Nastavitev Raspberry Pi z Busterjem in OpenCV
Uporabljam Raspberry Pi 3 B + z operacijskim sistemom Buster, različica OpenCV pa je 4.1. Če ste popolnoma novi, sledite spodnjim navodilom, preden lahko začnete.
Cilj je pripraviti svoj Pi in pripravljen za razvoj. V redu je, če imate na svojem Piju katero koli različico OS Raspbian, vendar se prepričajte, da je različica OpenCV 4.1 ali novejša. Zgoraj navedeni vadnici lahko sestavite svoj OpenCV, ki bo trajal ure, vendar je bolj zanesljiv za težke projekte ali pa ga preprosto namestite neposredno iz pipa z naslednjimi ukazi.
$ pip namestite opencv-contrib-python == 4.1.0.25
Če prvič nameščate OpenCV s pipom, morate namestiti tudi druge odvisnosti. Za to uporabite spodnje ukaze.
$ 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
Zgradili smo že veliko projektov Raspberry Pi OpenCV, to lahko preverite tudi za več navdihov.
Dodajanje zvočnega signala na zaslon Raspberry Pi 5Inch
Na strani strojne opreme nimamo drugega kot 5-palčni zaslon in brenčalo. Po povezovanju 5-palčnega zaslona z Raspberry Pi lahko zvočnik neposredno namestimo na zadnjo stran zaslona, ki nam je podaljšal nekaj GPIO nožic. Zvočni signal sem povezal, kot je prikazano spodaj -
Če vas zanima več I / O zatičev, bo spodnji opis zatiča koristen. Kot lahko vidite med podaljšanimi nožicami, večino nožic zaslon sam uporabi za vmesnik zaslona na dotik. A kljub temu imamo nožice 3,5,7,8,10,11,12,13,15,16 in 24, ki nimajo nobene povezave, in jih lahko uporabimo za lastno aplikacijo. V tej vadnici sem na GPIO 3 priključil brenčalo.
Programiranje Raspberry Pi za zaznavanje gibanja CCTV
Celoten skript python za ta projekt najdete na dnu te strani, vendar se pogovorimo o vsakem segmentu kode, da bomo razumeli, kako deluje.
Spremljanje več kamer brez zaostanka na Raspberry Pi z uporabo RTSP
Izziv pri tem delu je bil zmanjšati obremenitev Raspberry pi, da bi se izognili zaostanku v pretakanju. Sprva sem poskusil preklopiti med vsemi štirimi kamerami, da bi iskal gibanje, vendar je bilo zelo zaostalo (približno 10 sekund). Tako sem združil vse štiri kamere v eno sliko in na tej sliki opravil vse dejavnosti zaznavanja gibanja. Napisal sem dve funkciji, in sicer ustvarjanje kamere in branje kamere.
Funkcija create camera se uporablja za odpiranje kamere z ustrezno številko kanala. Upoštevajte, da se URL RTSP konča z »02«, kar pomeni, da uporabljam podtok videoposnetka, ki bo ločljiv in bo zato hitrejši za branje. Tudi vrsta video kodeka, ki ga uporabljate, prav tako prispeva k hitrosti, eksperimentiral sem z različnimi kodami in ugotovil, da je FFMPEG posten od vseh.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanali /" + channel + "02" # spremenite IP, da ustreza tvoj cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID številka za širino je 3 cap.set (4, cam_height) # ID številka za višino je 480 cap.set (10, 100) # ID-številka za svetlost je 10 povratnih omejitev
V funkciji branja kamere bomo prebrali vse štiri kamere, in sicer cam1, cam2, cam3 in cam4, da jih vse združimo v eno sliko, imenovano Main_screen . Ko bo ta glavni zaslon pripravljen, bomo na tej sliki opravili vse svoje OpenCV.
def read_camera (): success, current_screen = cam1.read () Main_screen = current_screen uspeh, current_screen = cam2.read () Main_screen = current_screen success, current_screen = cam3.read () Main_screen = current_screen uspeh, current_screen = cam4.read Main_screen = vrnitev trenutnega zaslona (Main_screen)
Slika glavnega zaslona z vsemi štirimi odmiki bo videti kot spodnja slika.
Zaznavanje gibanja na OpenCV z uporabo Raspberry Pi
Zdaj, ko imamo sliko pripravljeno, lahko začnemo z zaznavanjem gibanja. V zanki while začnemo z branjem dveh različnih okvirjev, in sicer frame1 in frame2, nato pa jih pretvorimo v sivine
frame1 = read_camera () # Preberite prvi okvir GrayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Pretvori v siv frame2 = read_camera () # Preberite 2. okvir GrayImage_F2 = cv2.cvtColor (frame2, cv2.CORY)
Nato vzamemo razliko med obema slikama, da vidimo, kaj se je spremenilo, in s pragom združimo vsa mesta, ki so se spremenila, nekako kot blob. Prav tako je običajno zamegliti in razširiti sliko, da se izognemo ostrim robovom.
diffImage = cv2.absdiff (greyImage_F1, grayImage_F2) # get the razlika - to je kul blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _,resholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH) dilatedImage = cv2.dilate (pragImage, jedro, ponovitve = 5)
Naslednji korak je poiskati števce in preveriti površino vsakega števca, tako da z iskanjem območja ugotovimo, kako veliko je gibanje. Če je območje večje od določene vrednosti v spremenljivki motion_detected , potem to upoštevamo kot dejavnost in okoli spremembe narišemo polje, da ga uporabniku poudarimo.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour je čarobna funkcija za konturo v konturah: #za vsako zaznano spremembo (x, y, w, h) = cv2.boundingRect (kontura) # dobite lokacijo, kjer je bila najdena sprememba, če je cv2.contourArea (kontura)> prag_ gibanja: cv2.rectangle (okvir1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Funkcija find_screen () se uporablja za iskanje, kje je potekala dejavnost med štirimi kamerami. To lahko ugotovimo, saj poznamo vrednosti x in y gibanja. Te vrednosti x in y primerjamo z lokacijo vsakega zaslona, da ugotovimo, kateri zaslon je dajal dejavnost, in spet obrežemo ta zaslon, da ga lahko prikažemo na zaslonu na dotik pi.
def find_screen (): if (x <širina_kamre): if (y <višina_kamre): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <višina_kam): zaslon = print frame1 ("Aktivnost na zaslonu cam 3") else: screen = print frame1 ("Activity na zaslonu cam 4") return (screen)
Nastavitev alarma za zaznavanje gibanja
Ko enkrat vemo, na katerem zaslonu je zaznano gibanje, lahko enostavno dodamo katero koli vrsto alarma, ki ga potrebujemo. Tukaj bomo oglasili zvočni signal, povezan z GPIO 3. Stavek if preveri, ali je bilo gibanje zaznano na zaslonu 3, in poveča spremenljivko, imenovano trig_alarm . Zaznate lahko kateri koli zaslon po vaši izbiri ali celo na več zaslonih.
če ((x> širina_kamre) in (y
Če vrednost trig_alarm doseže več kot 3, bomo enkrat oglasili zvočni signal. Razlog za to je, da sem včasih opazil, da so sence ali ptice ustvarile ponarejen alarm. Tako bomo le, če bomo neprekinjeno izvajali 3 sličice, dobili alarm.
if (trig_alarm> = 3): # počakajte na nadaljevanje 3 gibi # Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Spremljanje temperature in uporabe CPU
Sistem je razdeljen tako, da deluje 24x7, zato se Pi lahko zelo segreje, zato se odločim, da bom s prikazom teh vrednosti na zaslonu spremljal temperaturo in porabo procesorja. Te podatke smo dobili s pomočjo knjižnice 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)
Zagon vašega detektorja gibanja Pi CCTV
To sem preizkusil dneve, da sem ga zbral, in to deluje vsakič in bilo je res zabavno, dokler nisem poškodoval ene kamere,