[Tutorial OpenCV] Rilevazione di oggetti in movimento su sfondo fisso

Questo tutorial implementa e analizza l’algoritmo alla base di tutti i software di videosorveglianza: la “Background Subtraction”, la capacità di distinguere (mantenendo fissa la posizione della telecamera) cosa fa parte dell’ambiente statico e cosa invece si sta muovendo. Questa tecnica può essere utilizzata per monitorare aree di parcheggio, contare le automobili che passano in una strada, analizzare i percorsi delle persone e in moltissimi altri casi in cui una telecamera fissa preleva immagini di un’area. I risultati sono visibili nel seguente video dove l’immagine in alto a sinistra è il flusso video originale in tempo reale, in basso a sinistra è visibile il modello che l’applicazione si fa dello sfondo, in basso a destra l’area del flusso video valutata “diversa” dal modello dello sfondo.

All’immagine in basso a destra è possibile applicare quella che è nota come “Blob Analysis”, cioè è possibile estrarre le zone che corrispondono ad un oggetto in movimento e applicarle come maschera all’immagine originale per poter estrarre le informazioni RGB per un’eventuale riconoscimento tramite tecniche di Machine Learning. Ma lasciamo tutta questa “analisi avanzata” a futuri tutorial e dedichiamoci alla “Background Subtraction”. Come vedrete il codice di questo tutorial sarà veramente semplice, la cosa complicata è invece impostare i parametri dell’algoritmo di “Background Subtraction”. OpenCV mette a disposizione 2 algoritmi: BackgroundSubtractorMOG, che implementa un articolo del 2001 e BackgroundSubtractorMOG2, una versione migliorata del primo secondo un articolo del 2004. Nel tutorial ho scelto di utilizzare BackgroundSubtractorMOG2 che mette a disposizione molti parametri di taratura, come descritto nella documentazione ufficiale. La scelta dei valori dei parametri dipende molto dal tipo di ambiente analizzato e dalle proprie scelte. Come è ben visibile nel video ad esempio, cambiando il valore del “numero di frame dello storico” (History Size) cambia la velocità con cui un nuovo oggetto che compare nella scena viene “assorbito” dal modello dello sfondo. Inserendo un valore pari a 10 ad esempio basteranno 10 frame (1/3 di secondo se il frame rate è pari a 33hz, un valore standard per molte telecamere) perché un oggetto entrato nella scena diventi parte del modello dello sfondo. Per un sistema di video sorveglianza ad esempio il modello dello sfondo dovrebbe cambiare solo se un oggetto si ferma per qualche minuto, sorvegliando un parcheggio ad esempio un’automobile può essere considerata parcheggiata se sta ferma più di 5 minuti. L’algoritmo “BackgroundSubtractorMOG2” permette anche di identificare quali zone dell’immagine appartengono all’ombra dell’oggetto in movimento. Questo permette ad esempio di distinguere un’auto in movimento dalla sua ombra selezionando solo i pixel veramente utili e rendendo l’eventuale classificazione più robusta. Per il significato degli altri parametri vi consiglio una lettura della documentazione ufficiale e dell’articolo da cui il codice è strato estratto. L’interfaccia grafica si basa sulla struttura di base illustrata nei due tutorial sul Widget Qt OpenGL: parte 1, parte 2. Se non l’avete ancora fatto, vi consiglio di seguire i due tutorial prima di proseguire con questo. Il modulo OpenCV da includere nel file “pro” di progetto è “video”:

Le variabili private da aggiungere alla classe principale della GUI sono le seguenti:

La funzione per l’inizializzazione della Webcam deve essere modificata in modo che vengano inizializzate le variabili utili al reset dell’algoritmo quando l’utente modifica i parametri da interfaccia:

Acquisizione del nuovo frame dalla webcam e “Background Subtraction”:

Il “core” di tutto questo tutorial è riassunto nel comando

mBgSub( mOrigImage, mFgImage );

tale comando analizza l’immagine corrente, aggiorna il modello dello sfondo e calcola le differenze con il modello stesso riportandole nella variabile “mFgImage”, l’immagine di Foreground. E’ possibile anche estrarre il modello dello sfondo con il comando

mBgSub.getBackgroundImage( mBgImage );

Quando l’utente modifica uno dei parametri dell’algoritmo è necessario reinizializzare tutte le strutture dati, per questo è importante la seguente funzione di reset:

chiamata alla fine di ogni funzione di aggiornamento dei parametri:

Nei file del progetto completo troverete tutte le funzioni per la gestione della GUI, questo tutorial esula dalla loro descrizione in quanto operazioni standard Qt. Ancora una volta grazie a OpenCV è possibile realizzare con poche righe di codice un’operazione molto complessa come la “Background Subtraction”. Vi invito ancora ad approfondire la teoria che sta dietro l’algoritmo e a discuterne via email, su Facebook, Twitter o LinkedIn.

Lascia un Commento

This site uses cookies. Find out more about this site’s cookies.
%d bloggers like this: