- Configurarea Raspberry Pi cu Buster și OpenCV
- Adăugarea buzzerului la afișajul Raspberry Pi 5 inch
- Programarea Raspberry Pi pentru detectarea mișcării CCTV
- Detectarea mișcării pe OpenCV folosind Raspberry Pi
- Setarea alarmei pentru detectarea mișcării
- Monitorizarea temperaturii și utilizării CPU
- Lansarea detectorului de mișcare Pi CCTV
OpenCV este un instrument puternic și, combinat cu Raspberry Pi, poate deschide ușile multor dispozitive inteligente portabile. În articolul nostru anterior de monitorizare CCTV Raspberry Pi, am învățat cum să obținem videoclipuri CCTV live de pe un DVR utilizând RTSP și să le afișăm pe un Raspberry Pi, verificați acest lucru înainte de a continua. În acest articol, vom învăța cum să valorificăm puterea OpenCV și să construim un sistem de detectare a mișcării Raspberry Pi pe filmările noastre live CCTV. Dacă nu aveți un CCTV instalat, puteți construi un sistem de supraveghere Raspberry Pi conectând camerele USB direct la Pi. Și dacă nu sunteți un mare fan al Pi și Python, puteți construi ceva similar cu ESP32, consultați ESP32 Wi-Fi Door Clopot pentru mai multe detalii.
Vom scrie un script python care poate monitoriza simultan toate cele patru camere CCTV pentru orice activitate (mișcare). Dacă este detectată o activitate pe orice cameră, Raspberry Pi-ul nostru se va schimba automat pe ecranul camerei respective și va evidenția ce activitate a avut loc, toate acestea în timp real, cu doar 1,5 secunde întârziere. Am adăugat, de asemenea, o caracteristică de alarmă, cum ar fi un buzzer la care poate alerta utilizatorul semnal sonor dacă este detectată o activitate. Dar poți să le amplifici cu ușurință pentru a trimite un mesaj sau un e-mail sau ce nu! Incitant drept !! Să începem
Configurarea Raspberry Pi cu Buster și OpenCV
Folosesc Raspberry Pi 3 B + cu sistemul de operare Buster care rulează pe acesta și versiunea OpenCV este 4.1. Dacă sunteți complet nou, urmați tutorialele de mai jos înainte de a începe.
Scopul este să aveți dispozitivul dvs. Pi up și pregătit pentru dezvoltare. Este în regulă să aveți orice versiune a sistemului de operare Raspbian pe Pi, dar asigurați-vă că versiunea OpenCV este 4.1 sau mai mare. Puteți urmări tutorialul de mai sus pentru a compila OpenCV care va dura ore, dar este mai fiabil pentru proiecte grele sau pur și simplu instalați-l direct din pip folosind următoarele comenzi.
$ pip instala opencv-contrib-python == 4.1.0.25
Dacă instalați OpenCV cu pip pentru prima dată, trebuie să instalați și celelalte dependențe. Folosiți comenzile de mai jos pentru asta.
$ 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
Am construit deja multe proiecte OpenCV Raspberry Pi, puteți verifica și asta pentru mai multe inspirații.
Adăugarea buzzerului la afișajul Raspberry Pi 5 inch
Pe partea hardware, nu avem altceva decât un afișaj de 5 inci și un buzzer. După interfațarea afișajului de 5 inci cu Raspberry Pi, putem monta direct buzzerul pe partea din spate a afișajului, care a extins niște pini GPIO pentru noi. Mi-am conectat buzzerul așa cum se arată mai jos-
Dacă sunteți interesat să utilizați mai mulți pini I / O, atunci descrierea pini de mai jos va fi utilă. După cum puteți vedea printre pinii extinși, majoritatea pinilor sunt utilizați de afișajul în sine pentru o interfață cu ecran tactil. Dar totuși, avem pinii 3,5,7,8,10,11,12,13,15,16 și 24 care nu au conexiune și îl putem folosi pentru propria noastră aplicație. În acest tutorial, am conectat un buzzer la GPIO 3.
Programarea Raspberry Pi pentru detectarea mișcării CCTV
Scriptul complet Python pentru acest proiect poate fi găsit în partea de jos a acestei pagini, dar să discutăm fiecare segment al codului pentru a înțelege cum funcționează.
Monitorizarea mai multor camere fără întârziere pe Raspberry Pi utilizând RTSP
Partea dificilă în realizarea acestui lucru a fost reducerea încărcării pe Raspberry pi pentru a evita un decalaj în streaming. Inițial, am încercat să comut între toate cele patru camere pentru a căuta mișcare, dar a fost foarte lent (aproximativ 10 secunde). Așa că am combinat toate cele patru camere cu o singură imagine și am făcut toate activitățile de detectare a mișcării pe acea imagine. Am scris două funcții, și anume, crearea unei camere și citirea camerei.
Funcția de creare a camerei este utilizată pentru a deschide camera cu numărul de canal respectiv. Rețineți că adresa URL RTSP se termină cu „02”, ceea ce înseamnă că folosesc fluxul video sub-stream, care va avea o rezoluție redusă și, prin urmare, mai rapid de citit. De asemenea, tipul de codec video pe care îl folosiți contribuie și la viteză, am experimentat cu diferite coduri și am găsit FFMPEG ca fiind postul tuturor.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #change the IP to suit capul tău = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Numărul ID pentru lățime este 3 cap.set (4, cam_height) # Numărul ID pentru înălțime este 480 cap.set (10, 100) # Numărul de identificare pentru luminozitate este de 10 limită de întoarcere
În funcția de citire a camerei , vom citi toate cele patru came și anume cam1, cam2, cam3 și cam4 pentru a le combina pe toate într-o singură imagine numită Main_screen . Odată ce acest ecran principal este gata, vom face toate lucrările noastre OpenCV pe această imagine.
read 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)
Imaginea ecranului principal cu toate cele patru came combinate va arăta ca imaginea prezentată mai jos.
Detectarea mișcării pe OpenCV folosind Raspberry Pi
Acum că avem imaginea pregătită, putem începe cu detectarea mișcării. În interiorul buclei while , începem prin citirea a două cadre diferite și anume, frame1 și frame2, apoi le convertim în tonuri de gri
frame1 = read_camera () #Read the first frame grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Convert to gray frame2 = read_camera () #Read the 2nd frame grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2
Apoi luăm o diferență între ambele imagini pentru a vedea ce s-a schimbat și, cu un prag, grupăm toate locurile care au avut o schimbare, cam ca un blob. De asemenea, este obișnuit să estompați și să dilatați imaginea pentru a evita marginile ascuțite.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) #obține diferența - acest lucru este cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20.255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (pragImagine, kernal, iterații = 5)
Următorul pas este de a găsi contoare și de a verifica aria fiecărui contor, găsind zona, putem afla cât de mare este mișcarea. Dacă zona este mai mare decât o valoare specificată în variabila motion_detected , atunci considerăm că este o activitate și desenăm o casetă în jurul modificării pentru a o evidenția utilizatorului.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour este o funcție magică pentru contur în contururi: #pentru fiecare modificare detectată (x, y, w, h) = cv2.boundingRect (contur) # obțineți locația în care s-a găsit schimbarea dacă cv2.contourArea (contur)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
Funcția find_screen () este utilizată pentru a găsi unde s-a desfășurat activitatea printre cele patru camere. Putem constata acest lucru, deoarece cunoaștem valorile x și y ale mișcării. Comparăm aceste valori x și y cu locația fiecărui ecran pentru a găsi ce ecran a dat activitate și decupăm din nou acel ecran, astfel încât să îl putem afișa pe ecranul tactil pi.
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): ecran = frame1 print ("Activitate în camera cam 3") else: ecran = frame1 print ("Activitate în camera cam 4") return (ecran)
Setarea alarmei pentru detectarea mișcării
Odată ce știm, în ce ecran este detectată mișcarea, este ușor să adăugăm orice tip de alarmă de care avem nevoie. Aici vom emite un buzzer conectat la GPIO 3. Instrucțiunea if verifică dacă mișcarea a fost detectată în ecranul 3 și crește o variabilă numită trig_alarm . Puteți detecta orice ecran la alegere sau chiar pe mai multe ecrane.
if ((x> cam_width) și (y
Dacă valoarea trig_alarm atinge mai mult de 3, vom emite un semnal sonor o singură dată. Motivul pentru acest număr este că uneori am observat că umbrele sau păsările au creat alarma falsă. Deci, astfel doar dacă există o activitate continuă pentru 3 cadre, vom primi o alarmă.
if (trig_alarm> = 3): # așteptați conts 3 mișcări # Beep Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Monitorizarea temperaturii și utilizării CPU
Sistemul este indentat să funcționeze 24x7 și, prin urmare, Pi poate deveni foarte fierbinte, așa că decid să monitorizez temperatura și utilizarea procesorului afișând aceste valori pe ecran. Am obținut aceste informații folosind biblioteca 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)
Lansarea detectorului de mișcare Pi CCTV
Am testat asta timp de zile pentru a aduna și funcționează de fiecare dată și a fost într-adevăr o construcție distractivă până când am deteriorat o cameră,