- Configuració de Raspberry Pi amb Buster i OpenCV
- Addició de Buzzer a la pantalla Raspberry Pi de 5 polzades
- Programació de Raspberry Pi per a la detecció de moviment CCTV
- Detecció de moviment a OpenCV mitjançant Raspberry Pi
- Configuració de l'alarma per a la detecció de moviment
- Supervisió de la temperatura i l’ús de la CPU
- Llançament del vostre Pi CCTV Motion Detector
OpenCV és una eina potent que, combinada amb Raspberry Pi, pot obrir portes a molts dispositius intel·ligents portàtils. Al nostre anterior article sobre monitoratge de CCTV de Raspberry Pi, vam aprendre a obtenir vídeo CCTV en directe des d’un DVR mitjançant RTSP i visualitzar-lo en un Raspberry Pi. Comproveu-ho abans de continuar. En aquest article, aprendrem a aprofitar la potència d’OpenCV i a construir un sistema de detecció de moviment Raspberry Pi als nostres vídeos de CCTV en directe. Si no teniu instal·lat un circuit tancat de televisió, podeu crear un sistema de vigilància Raspberry Pi connectant càmeres USB directament al vostre Pi. I si no sou un gran fan de Pi i Python, podeu construir alguna cosa similar amb ESP32; consulteu ESP32 Wi-Fi Door Bell per obtenir més informació.
Escriurem un script python que pugui controlar totes les quatre càmeres de circuit tancat de televisió simultàniament per a qualsevol activitat (moviment). Si es detecta una activitat a qualsevol càmera, el nostre Raspberry Pi canviarà automàticament a la pantalla de la càmera en concret i ressaltarà quina activitat es va dur a terme, tot això en temps real amb només 1,5 segons de retard. També he afegit una funció d'alarma, com un brunzidor, que pot avisar a l'usuari pitant si es detecta una activitat. Però podeu escalar-ho fàcilment per enviar un missatge o un correu electrònic, o no. Emocionant dret !! Comencem
Configuració de Raspberry Pi amb Buster i OpenCV
Estic fent servir el Raspberry Pi 3 B + amb Buster OS que s’executa i la versió d’OpenCV és la 4.1. Si sou completament nou, seguiu els tutorials següents abans de començar.
L’objectiu és tenir el vostre Pi up i llest per al desenvolupament. Està bé tenir qualsevol versió de Raspbian OS al vostre Pi, però assegureu-vos que la versió d’OpenCV sigui 4.1 o superior. Podeu seguir el tutorial anterior per compilar el vostre OpenCV que trigarà hores, però és més fiable per a projectes pesats o simplement instal·leu-lo directament des de pip mitjançant les següents ordres.
$ pip install opencv-contrib-python == 4.1.0.25
Si instal·leu OpenCV amb pip per primera vegada, també heu d’instal·lar les altres dependències. Utilitzeu les ordres següents per a això.
$ 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
Ja hem creat molts projectes OpenCV de Raspberry Pi; també podeu comprovar-ho per obtenir més inspiracions.
Addició de Buzzer a la pantalla Raspberry Pi de 5 polzades
Pel que fa al maquinari, no tenim molt més que una pantalla de 5 polzades i un brunzidor. Després d’entrellaçar la pantalla de 5 polzades amb Raspberry Pi, podem muntar el brunzidor directament a la part posterior de la pantalla, que ens ha ampliat alguns pins GPIO. He connectat el meu buzzer com es mostra a continuació.

Si esteu interessats en utilitzar més pins d'E / S, us serà útil la descripció següent. Com podeu veure entre els pins ampliats, la majoria dels pins són utilitzats per la mateixa pantalla per a una interfície de pantalla tàctil. Tot i això, tenim pins 3,5,7,8,10,11,12,13,15,16 i 24 que no tenen connexió i el podem utilitzar per a la nostra pròpia aplicació. En aquest tutorial, he connectat un brunzidor a GPIO 3.

Programació de Raspberry Pi per a la detecció de moviment CCTV
L'escriptura completa de Python per a aquest projecte es troba a la part inferior d'aquesta pàgina, però analitzem cada segment del codi per entendre com funciona.
Supervisió de diverses càmeres sense retard a Raspberry Pi mitjançant RTSP
La part més difícil per fer que aquest treball fos reduir la càrrega a Raspberry pi per evitar un retard en la transmissió. Inicialment, vaig provar de canviar entre les quatre càmeres per buscar el moviment, però era molt lent (uns 10 segons). Així que vaig combinar les quatre càmeres amb una sola imatge i vaig fer totes les activitats de detecció de moviment en aquesta imatge. Vaig escriure dues funcions, a saber, crear una càmera i llegir una càmera.
La funció de creació de càmera s’utilitza per obrir la càmera amb el seu número de canal respectiu. Tingueu en compte que l'URL RTSP acaba amb "02", el que significa que estic fent servir el feed de vídeo de sub-flux, que tindrà una resolució baixa i, per tant, més ràpid de llegir. A més, el tipus de còdec de vídeo que utilitzeu també contribueix a la velocitat, he experimentat amb diferents codis i he trobat que FFMPEG és el dejuni de tots.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #change the IP to suit vostre cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # El número d'identificació per a l'amplada és de 3 cap.set (4, cam_height) # El número d'identificació de l'alçada és de 480 cap.set (10, 100) # El número d'identificació de la brillantor és de 10 límit de retorn
A la funció de càmera de lectura , llegirem les quatre càmeres, és a dir, cam1, cam2, cam3 i cam4 per combinar-les totes en una sola imatge anomenada pantalla principal . Un cop estigui llesta aquesta pantalla principal, farem tot el nostre treball OpenCV sobre aquesta imatge.
def read_camera (): exit, current_screen = cam1.read () Main_screen = current_screen éxito, current_screen = cam2.read () Main_screen = current_screen exit, current_screen = cam3.read () Main_screen = current_screen exit, current_screen = cam4.read () Pantalla principal = retorn de la pantalla actual (pantalla principal)
La imatge de la pantalla principal amb les quatre càmeres combinades serà semblant a la que es mostra a continuació.

Detecció de moviment a OpenCV mitjançant Raspberry Pi
Ara que tenim la imatge preparada, podem començar amb la detecció de moviment. Dins del bucle while , comencem llegint dos marcs diferents, és a dir, frame1 i frame2, per després convertir-los a escala de grisos
frame1 = read_camera () #Llegeix el primer marc grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Converteix en gris frame2 = read_camera () #Llegeix el segon frame grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2
A continuació, prenem una diferència entre ambdues imatges per veure què ha canviat i, amb un llindar, agrupem tots els llocs que han tingut un canvi, com una mica. També és freqüent difuminar i dilatar la imatge per evitar vores nítides.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) #obteniu la diferència - això és cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20.255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (llindarImatge, kernal, iteracions = 5)
El següent pas és trobar comptadors i comprovar l’àrea de cada comptador, en trobar l’àrea, podem esbrinar la mida del moviment. Si l'àrea és més gran que un valor especificat a la variable motion_detected , ho considerem com una activitat i dibuixem un quadre al voltant del canvi per ressaltar-lo a l'usuari.
contorns, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour és una funció màgica per al contorn als contorns: #per cada canvi que es detecti (x, y, w, h) = cv2.boundingRect (contorn) #obtingueu la ubicació on s'ha trobat el canvi si cv2.contourArea (contorn)> llindar_moviment: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
La funció find_screen () s’utilitza per trobar on es va dur a terme l’activitat entre les quatre càmeres. Ho podem trobar ja que coneixem els valors x i y del moviment. Comparem aquests valors xy amb la ubicació de cada pantalla per trobar quina pantalla va donar activitat i tornem a retallar la pantalla en concret, de manera que puguem mostrar-la a la pantalla tàctil 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): screen = frame1 print ("Activitat a la pantalla de càmera 3") else: screen = frame1 print ("Activitat a la pantalla de càmera 4") return (pantalla)
Configuració de l'alarma per a la detecció de moviment
Un cop sabem, en quina pantalla es detecta el moviment, és fàcil afegir qualsevol tipus d'alarma que necessitem. Aquí anem a xiular un brunzidor connectat a GPIO 3. El si els controls dels estats Si s'ha detectat el moviment en pantalla 3 i en increments d'una variable anomenada trig_alarm . Podeu detectar qualsevol pantalla que vulgueu o fins i tot en diverses pantalles.
if ((x> cam_width) i (y
Si el valor de trig_alarm arriba a més de 3, emetrem un so de veu una vegada. El motiu d’aquest recompte és que de vegades vaig notar que les ombres o els ocells creaven una falsa alarma. Així doncs, només si hi ha una activitat contínua durant 3 fotogrames, rebrem una alarma.
if (trig_alarm> = 3): # wait for conts 3 motion # Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Supervisió de la temperatura i l’ús de la CPU
El sistema té un sagnat perquè funcioni 24x7 i, per tant, el Pi pot passar molt calent, de manera que decideixo controlar la temperatura i l’ús de la CPU mostrant aquests valors a la pantalla. Hem obtingut aquesta informació mitjançant la 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)
Llançament del vostre Pi CCTV Motion Detector
Ho he provat durant dies per reunir-me i funciona cada vegada i va ser realment divertit fins que vaig fer malbé una càmera,
