- Postavljanje Raspberry Pi-a s Busterom i OpenCV-om
- Dodavanje zujalice na zaslon Raspberry Pi 5Inch
- Programiranje Raspberry Pi za CCTV otkrivanje pokreta
- Otkrivanje pokreta na OpenCV-u pomoću Raspberry Pi
- Postavljanje alarma za otkrivanje pokreta
- Nadgledanje temperature i upotrebe CPU-a
- Pokretanje vašeg Pi CCTV detektora pokreta
OpenCV je moćan alat koji u kombinaciji s Raspberry Pi može otvoriti vrata mnogim prijenosnim pametnim uređajima. U našem prethodnom članku o nadzoru za Raspberry Pi CCTV naučili smo kako uživo dobiti video nadzor s DVR-a pomoću RTSP-a i prikazati ga na Raspberry Pi, provjerite to prije nego što nastavite. U ovom ćemo članku naučiti kako iskoristiti snagu OpenCV-a i izgraditi sustav za otkrivanje pokreta Raspberry Pi na našim CCTV snimkama uživo. Ako nemate instaliran CCTV, i dalje možete izraditi nadzorni sustav Raspberry Pi spajanjem USB kamera izravno na svoj Pi. A ako niste veliki ljubitelj Pi-a i Pythona, možete slično izgraditi i s ESP32-om, za detalje pogledajte ESP32-ovo zvono za vrata.
Napisat ćemo python skriptu koja može istovremeno nadzirati sve četiri CCTV kamere za bilo kakve aktivnosti (pokrete). Ako se na bilo kojem fotoaparatu otkrije aktivnost, naš će se Raspberry Pi automatski promijeniti na taj zaslon kamere i istaknuti koja se aktivnost dogodila, a sve to u stvarnom vremenu sa samo 1,5 sekunde kašnjenja. Također sam dodao značajku alarma, poput zujalice koja može upozoriti korisnika zvučnim signalom ako se otkrije neka aktivnost. Ali to možete lako prilagoditi tako da pošaljete poruku ili e-mail ili što već ne! Uzbudljivo pravo !! Započnimo
Postavljanje Raspberry Pi-a s Busterom i OpenCV-om
Koristim Raspberry Pi 3 B + s operativnim sustavom Buster, a verzija OpenCV-a je 4.1. Ako ste potpuno novi, slijedite upute u nastavku prije nego što započnete.
Cilj je da vaš Pi bude spreman za razvoj. U redu je imati bilo koju verziju Raspbian OS-a na Pi, ali provjerite je li verzija OpenCV-a 4.1 ili novija. Možete slijediti gornji vodič za sastavljanje OpenCV-a koji će potrajati satima, ali je pouzdaniji za teške projekte ili ga jednostavno instalirati izravno iz pipa pomoću sljedećih naredbi.
$ pip instalirajte opencv-contrib-python == 4.1.0.25
Ako prvi put instalirate OpenCV s pipom, morate instalirati i ostale ovisnosti. Za to upotrijebite naredbe u nastavku.
$ 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
Već smo izgradili mnoge projekte Raspberry Pi OpenCV, možete to provjeriti i za još nadahnuća.
Dodavanje zujalice na zaslon Raspberry Pi 5Inch
S hardverske strane nemamo puno više od 5-inčnog zaslona i zujalice. Nakon povezivanja 5-inčnog zaslona s Raspberry Pi, zvučnik možemo izravno postaviti na stražnju stranu zaslona koji nam je proširio neke GPIO igle. Spojio sam zujalicu kako je prikazano dolje -

Ako ste zainteresirani za korištenje više I / O pinova, tada će vam biti koristan opis pin-a u nastavku. Kao što možete vidjeti među proširenim iglama, većinu pribadača sam zaslon koristi za sučelje zaslona osjetljivog na dodir. Ali ipak, imamo igle 3,5,7,8,10,11,12,13,15,16 i 24 koje nemaju vezu i možemo ih koristiti za vlastitu aplikaciju. U ovom uputstvu spojio sam zujalicu na GPIO 3.

Programiranje Raspberry Pi za CCTV otkrivanje pokreta
Kompletna python skripta za ovaj projekt nalazi se na dnu ove stranice, ali razgovarajmo o svakom segmentu koda da bismo razumjeli kako to funkcionira.
Praćenje više kamera bez zakašnjenja na Raspberry Pi pomoću RTSP-a
Izazovan dio u izradi ovog posla bio je smanjiti opterećenje Raspberry pi kako bi se izbjeglo zaostajanje u streamingu. U početku sam pokušao prebaciti između sve četiri kamere kako bih potražio pokret, ali bilo je vrlo zaostalo (oko 10 sekundi). Tako sam kombinirao sve četiri kamere u jednu sliku i obavio sve aktivnosti detekcije pokreta na toj slici. Napisao sam dvije funkcije, naime, stvaranje kamere i čitanje kamere.
Funkcija create camera koristi se za otvaranje kamere s odgovarajućim brojem kanala. Imajte na umu da se URL RTSP-a završava s "02", što znači da se koristim video feedom sub-stream koji će biti niske razlučivosti, a time i brži za čitanje. Također, vrsta video kodeka koji također doprinosi brzini, eksperimentirao sam s različitim kodovima i otkrio da je FFMPEG postili.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / kanala /" + channel + "02" #promijenite IP kako odgovara tvoj cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # ID broj za širinu je 3 cap.set (4, cam_height) # ID broj za visinu je 480 cap.set (10, 100) # ID broj za svjetlinu je 10 povratnih slova
U čitanje kamera funkcije, mi ćemo čitati sve četiri kamere naime CAM1, cam2, cam3, a Cam4 ih sve kombinirati u jednu fotografiju pod nazivom Main_screen . Jednom kada je ovaj glavni zaslon spreman, obavit ćemo sve svoje OpenCV radove na ovoj slici.
def read_camera (): uspjeh, current_screen = cam1.read () Main_screen = current_screen uspjeh, current_screen = cam2.read () Main_screen = current_screen uspjeh, current_screen = cam3.read () Main_screen = current_screen uspjeh, current_screen = cam4.read Main_screen = povratak trenutnog_ekrana (Main_screen)
Slika glavnog zaslona sa sve četiri komore u kombinaciji izgledat će poput slike prikazane u nastavku.

Otkrivanje pokreta na OpenCV-u pomoću Raspberry Pi
Sad kad imamo sliku spremnu, možemo započeti s otkrivanjem pokreta. Unutar while petlje započinjemo čitanjem dva različita okvira, naime frame1 i frame2, a zatim ih pretvaramo u sive sjene
frame1 = read_camera () # Pročitajte prvi kadar grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Pretvori u sivi frame2 = read_camera () #Pročitajte drugi kadar GrayImage_F2 = cv2.cvtColor (frame2, cv2.CORY)
Zatim napravimo razliku između obje ove slike kako bismo vidjeli što se promijenilo i s pragom grupiramo sva mjesta koja su se promijenila, nekako poput mrlje. Također je uobičajeno zamućivanje i širenje slike kako bi se izbjegli oštri rubovi.
diffImage = cv2) dilatedImage = cv2.dilate (pragImage, kernal, iteracije = 5)
Sljedeći je korak pronaći brojače i provjeriti površinu svakog brojača, pronalaskom područja možemo shvatiti koliki je pokret. Ako je područje veće od određene vrijednosti u varijabli motion_detected , tada to smatramo aktivnošću i oko promjene nacrtamo okvir kako bismo ga istaknuli korisniku.
konture, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour je čarobna funkcija za konture u konturama: #za svaku otkrivenu promjenu (x, y, w, h) = cv2.boundingRect (kontura) # dobivanje mjesta na kojem je pronađena promjena ako je cv2.contourArea (kontura)> prag_kretanja: cv2.rectangle (okvir1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Funkcija find_screen () koristi se za pronalaženje mjesta odvijanja aktivnosti između četiri kamere. To možemo pronaći budući da znamo vrijednosti x i y kretanja. Uspoređujemo ove x i y vrijednosti s mjestom svakog zaslona kako bismo pronašli koji je zaslon dao aktivnost i ponovno obrezujemo taj određeni zaslon, tako da ga možemo prikazati na pi dodirnom zaslonu.
def find_screen (): if (x <širina_camere): if (y <visina_camere): screen = frame1 print ("Activity in cam screen 1") else: screen = frame1 print ("Activity in cam screen 2") else: if (y <visina_kambe): screen = frame1 print ("Activity in cam screen 3") else: screen = frame1 print ("Activity in cam screen 4") povratak (zaslon)
Postavljanje alarma za otkrivanje pokreta
Jednom kada znamo na kojem se zaslonu detektira kretanje, lako je dodati bilo koju vrstu alarma koja nam je potrebna. Ovdje ćemo oglasiti zvučni signal spojen na GPIO 3. Izraz if provjerava je li pokret otkriven na zaslonu 3 i povećava varijablu koja se naziva trig_alarm . Možete otkriti bilo koji zaslon po vašem izboru ili čak na više zaslona.
ako ((x> širina_kamba) i (y
Ako vrijednost trig_alarm dosegne više od 3, jednom ćemo oglasiti zvučni signal. Razlog ovog brojanja je taj što sam ponekad primijetio kako sjene ili ptice stvaraju lažni alarm. Dakle, na taj način samo ako postoji kontinuirana aktivnost za 3 okvira, dobit ćemo alarm.
if (trig_alarm> = 3): # pričekajte nastavak 3 pokreta #Pusti zvučni signal GPIO.izlaz (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Nadgledanje temperature i upotrebe CPU-a
Sustav je uvučen da radi 24x7, pa se Pi može jako zagrijati, pa odlučujem pratiti temperaturu i upotrebu procesora prikazivanjem tih vrijednosti na zaslonu. Do ovih smo podataka došli pomoću biblioteke 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)
Pokretanje vašeg Pi CCTV detektora pokreta
Testirao sam ovo danima kako bih skupio i to radi svaki put i bilo je stvarno zabavno dok nisam oštetio jednu kameru,
