- Configurazione di Raspberry Pi con Buster e OpenCV
- Aggiunta di buzzer al display Raspberry Pi da 5 pollici
- Programmazione di Raspberry Pi per il rilevamento del movimento CCTV
- Rilevamento del movimento su OpenCV utilizzando Raspberry Pi
- Impostazione dell'allarme per il rilevamento del movimento
- Monitoraggio della temperatura e dell'utilizzo della CPU
- Avvio del tuo rilevatore di movimento CCTV Pi
OpenCV è uno strumento potente e che combinato con Raspberry Pi può aprire le porte a molti dispositivi intelligenti portatili. Nel nostro precedente articolo sul monitoraggio CCTV Raspberry Pi, abbiamo imparato come ottenere video CCTV dal vivo da un DVR utilizzando RTSP e visualizzarli su un Raspberry Pi, controlla prima di procedere. In questo articolo impareremo come sfruttare la potenza di OpenCV e costruire un sistema di rilevamento del movimento Raspberry Pi sui nostri filmati CCTV live. Se non hai una CCTV installata, puoi comunque costruire un sistema di sorveglianza Raspberry Pi collegando le telecamere USB direttamente al tuo Pi. E se non sei un grande fan di Pi e Python, puoi creare qualcosa di simile con ESP32, fai riferimento a ESP32 Wi-Fi Door Bell per maggiori dettagli.
Scriveremo uno script python in grado di monitorare simultaneamente tutte e quattro le telecamere CCTV per qualsiasi attività (movimento). Se viene rilevata un'attività su una qualsiasi fotocamera, il nostro Raspberry Pi passerà automaticamente a quella particolare schermata della fotocamera ed evidenzierà quale attività si è svolta, il tutto in tempo reale con un ritardo di soli 1,5 secondi. Ho anche aggiunto una funzione di allarme, come un cicalino a cui può avvisare l'utente emettendo un segnale acustico se viene rilevata un'attività. Ma puoi facilmente ridimensionarlo per inviare un messaggio o un'e-mail o cosa no! Emozionante vero !! Iniziamo
Configurazione di Raspberry Pi con Buster e OpenCV
Sto usando Raspberry Pi 3 B + con il sistema operativo Buster in esecuzione e la versione di OpenCV è 4.1. Se sei completamente nuovo, segui i tutorial di seguito prima di poter iniziare.
L'obiettivo è avere il tuo Pi pronto per lo sviluppo. Va bene avere qualsiasi versione del sistema operativo Raspbian sul tuo Pi, ma assicurati che la versione di OpenCV sia 4.1 o successiva. Puoi seguire il tutorial sopra per compilare il tuo OpenCV che richiederà ore ma è più affidabile per progetti pesanti o semplicemente installarlo direttamente da pip usando i seguenti comandi.
$ pip install opencv-contrib-python == 4.1.0.25
Se stai installando OpenCV con pip per la prima volta, devi installare anche le altre dipendenze. Usa i seguenti comandi per questo.
$ 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
Abbiamo già realizzato molti progetti Raspberry Pi OpenCV, puoi anche verificarlo per ulteriori ispirazioni.
Aggiunta di buzzer al display Raspberry Pi da 5 pollici
Dal punto di vista hardware, non abbiamo molto altro che un display da 5 pollici e un cicalino. Dopo aver interfacciato il display da 5 pollici con Raspberry Pi, possiamo montare direttamente il cicalino sul retro del display che ha esteso alcuni pin GPIO per noi. Ho collegato il mio Buzzer come mostrato di seguito-
Se sei interessato a utilizzare più pin I / O, la descrizione dei pin di seguito sarà utile. Come puoi vedere tra i pin estesi, la maggior parte dei pin viene utilizzata dal display stesso per un'interfaccia touchscreen. Tuttavia, abbiamo i pin 3,5,7,8,10,11,12,13,15,16 e 24 che non hanno connessione e possiamo usarli per la nostra applicazione. In questo tutorial, ho collegato un buzzer a GPIO 3.
Programmazione di Raspberry Pi per il rilevamento del movimento CCTV
Lo script Python completo per questo progetto può essere trovato in fondo a questa pagina, ma discutiamo ogni segmento del codice per capire come funziona.
Monitoraggio di più telecamere senza ritardi su Raspberry Pi utilizzando RTSP
La parte impegnativa nel realizzare questo lavoro è stata ridurre il carico su Raspberry pi per evitare un ritardo nello streaming. Inizialmente, ho provato a passare da una telecamera all'altra per cercare il movimento, ma è stato molto lento (circa 10 secondi). Quindi ho combinato tutte e quattro le telecamere in una singola immagine e ho svolto tutte le attività di rilevamento del movimento su quell'immagine. Ho scritto due funzioni, ovvero creare una fotocamera e leggere la fotocamera.
La funzione di creazione della telecamera viene utilizzata per aprire la cam con il rispettivo numero di canale. Si noti che l'URL RTSP termina con "02", il che significa che sto utilizzando il feed video del flusso secondario che sarà a bassa risoluzione e quindi più veloce da leggere. Inoltre, anche il tipo di codec video che usi contribuisce alla velocità, ho sperimentato codici diversi e ho scoperto che FFMPEG è il più veloce di tutti.
def create_camera (channel): rtsp = "rtsp: //" + rtsp_username + ":" + rtsp_password + "@" + rtsp_IP + ": 554 / Streaming / channels /" + channel + "02" #cambia l'IP per adattarlo yours cap = cv2.VideoCapture (rtsp, cv2.CAP_FFMPEG) cap.set (3, cam_width) # Il numero ID per la larghezza è 3 cap.set (4, cam_height) # Il numero ID per l'altezza è 480 cap.set (10, 100) # Il numero ID per la luminosità è 10 limite di ritorno
Nella funzione di lettura della telecamera , leggeremo tutte e quattro le cam, ovvero cam1, cam2, cam3 e cam4 per combinarle tutte in un'unica immagine chiamata Main_screen . Una volta che questa schermata principale è pronta, faremo tutto il nostro lavoro OpenCV su questa immagine.
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)
L'immagine della schermata principale con tutte e quattro le cam combinate apparirà come l'immagine mostrata di seguito.
Rilevamento del movimento su OpenCV utilizzando Raspberry Pi
Ora che abbiamo l'immagine pronta, possiamo iniziare con il rilevamento del movimento. All'interno del ciclo while , iniziamo leggendo due diversi fotogrammi, ovvero frame1 e frame2, quindi li convertiamo in scala di grigi
frame1 = read_camera () #Leggi il primo frame grayImage_F1 = cv2.cvtColor (frame1, cv2.COLOR_BGR2GRAY) # Converti in grigio frame2 = read_camera () #Leggi il 2 ° frame grayImage_F2 = cv2.cvtColor (frame2, cv2.COLOR_BGR2GRAY)
Quindi prendiamo una differenza tra queste due immagini per vedere cosa è cambiato e con una soglia, raggruppiamo tutti i luoghi che hanno subito un cambiamento, una specie di blob. È anche comune sfocare e dilatare l'immagine per evitare bordi taglienti.
diffImage = cv2.absdiff (grayImage_F1, grayImage_F2) #get the differance - this is cool blurImage = cv2.GaussianBlur (diffImage, (5,5), 0) _, thresholdImage = cv2.threshold (blurImage, 20,255, cv2.THRESH_BINARY) dilatedImage = cv2.dilate (thresholdImage, kernal, iterations = 5)
Il prossimo passo è trovare i contatori e controllare l'area di ogni contatore, trovando l'area, possiamo capire quanto è grande il movimento. Se l'area è più grande di un valore specificato nella variabile motion_detected , la consideriamo come un'attività e disegniamo un riquadro attorno alla modifica per evidenziarla all'utente.
contours, _ = cv2.findContours (dilatedImage, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #find contour è una funzione magica per il contorno nei contorni: #per ogni modifica rilevata (x, y, w, h) = cv2.boundingRect (contour) # ottiene la posizione in cui è stata trovata la modifica se cv2.contourArea (contour)> motion_threshold: cv2.rectangle (frame1, (x, y), (x + w, y + h), (255, 255, 0), 1) display_screen = find_screen ()
La funzione find_screen () viene utilizzata per trovare dove si è svolta l'attività tra le quattro telecamere. Possiamo trovarlo poiché conosciamo i valori xey del movimento. Confrontiamo questi valori xey con la posizione di ogni schermata per trovare quale schermata ha dato attività e ritagliamo di nuovo quella particolare schermata, in modo da poterla visualizzare sul touch screen 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 ("Activity in cam screen 3") else: screen = frame1 print ("Activity in cam screen 4") return (screen)
Impostazione dell'allarme per il rilevamento del movimento
Una volta che sappiamo in quale schermata viene rilevato il movimento, è facile aggiungere qualsiasi tipo di allarme di cui abbiamo bisogno. Qui ci sarà un segnale acustico viene emesso un segnale collegato al GPIO 3. Il se controlli istruzione se è stato rilevato il movimento a schermo 3 e incrementi una variabile chiamata trig_alarm . Puoi rilevare qualsiasi schermo di tua scelta o anche su più schermi.
if ((x> cam_width) e (y
Se il valore di trig_alarm raggiunge più di 3, emetteremo un segnale acustico una volta. Il motivo di questo conteggio è che a volte ho notato che ombre o uccelli creavano un falso allarme. Quindi in questo modo solo se c'è un'attività continua per 3 frame, avremo un allarme.
if (trig_alarm> = 3): # aspetta per 3 movimenti continui #Beep the Buzzer GPIO.output (BUZZER, 1) time.sleep (0.02) GPIO.output (BUZZER, 0) trig_alarm = 0
Monitoraggio della temperatura e dell'utilizzo della CPU
Il sistema è rientrato per funzionare 24x7 e quindi il Pi può diventare molto caldo, quindi decido di monitorare la temperatura e l'utilizzo della CPU visualizzando quei valori sullo schermo. Abbiamo ottenuto queste informazioni utilizzando la libreria 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)
Avvio del tuo rilevatore di movimento CCTV Pi
L'ho testato per giorni e giorni e funziona ogni singola volta ed è stata davvero una costruzione divertente finché non ho danneggiato una fotocamera,