Sommario:

Conteggio oggetti Raspberry Pi: 5 passaggi
Conteggio oggetti Raspberry Pi: 5 passaggi

Video: Conteggio oggetti Raspberry Pi: 5 passaggi

Video: Conteggio oggetti Raspberry Pi: 5 passaggi
Video: Intelligenza artificiale e Raspberry Pi: cosa possiamo fare? 2024, Luglio
Anonim
Conteggio oggetti Raspberry Pi
Conteggio oggetti Raspberry Pi

La computer vision, senza dubbio, è una cosa fantastica! Usando questo, un computer acquisisce la capacità di "vedere" e percepire meglio l'ambiente circostante, ciò che consente lo sviluppo di applicazioni complesse, utili e interessanti. Applicazioni come il rilevamento e il riconoscimento facciale, il tracciamento di oggetti e il rilevamento di oggetti sono sempre più presenti nelle nostre attività quotidiane, grazie ai progressi della visione artificiale.

Considerando quanto siano avanzati e accessibili i framework e gli strumenti di visione artificiale, l'applicazione descritta in questo articolo si adatta bene: utilizzando un semplice Raspberry PI e un framework di visione artificiale gratuito e open source chiamato OpenCV per contare gli oggetti in movimento, più precisamente quanto gli oggetti entrano ed escono da una determinata zona monitorata.

Passaggio 1: approfondimenti: come viene rilevato il movimento di un oggetto in un flusso di immagini?

Approfondimento: come viene rilevato il movimento di un oggetto in un flusso di immagini?
Approfondimento: come viene rilevato il movimento di un oggetto in un flusso di immagini?

Ora è il momento di approfondire l'elaborazione delle immagini:

come ottenere alcune immagini in streaming della webcam e rilevare che qualcosa si è spostato lì

Consiste in cinque passaggi:

Passaggio 1: evidenziare l'oggetto in movimento

Come definito nella fisica classica, è necessario un riferimento per dedurre che qualcosa si sta muovendo o se è fermo. Qui, per determinare se qualcosa si è spostato, è più o meno lo stesso: ogni singolo frame catturato dal flusso della webcam verrà confrontato con un frame di riferimento. Se qualcosa è diverso, qualcosa è stato spostato. È semplice come sembra.

Questo quadro di riferimento deve essere catturato nelle condizioni più perfette (niente in movimento, per esempio). Nel mondo dell'elaborazione delle immagini, questo confronto tra un fotogramma catturato e un fotogramma di riferimento consiste in una tecnica chiamata sottrazione di sfondo. La sottrazione di sfondo consiste nel sottrarre letteralmente le informazioni sul colore da pixel a pixel dal fotogramma catturato e dal fotogramma di riferimento. Quindi, l'immagine risultante da questo processo evidenzierà / mostrerà con maggiori dettagli solo ciò che è diverso tra questi due fotogrammi (o, ciò che si è spostato / ha ottenuto movimento) e tutto il resto sarà nero nell'immagine (il colore del valore zero su un grigio pixel in scala). Importante: le condizioni di illuminazione e la qualità dell'immagine acquisita dalla webcam (a causa della qualità dei sensori di acquisizione) possono variare leggermente da un fotogramma all'altro. Implica che le "parti uguali" dal fotogramma di riferimento e da un altro fotogramma non saranno completamente nere dopo la sottrazione dello sfondo. Nonostante questo comportamento, non ci sono gravi conseguenze nei passaggi successivi dell'elaborazione delle immagini in questo progetto.

Per ridurre al minimo il tempo di elaborazione dell'immagine, prima di eseguire una sottrazione di sfondo, il fotogramma catturato e il fotogramma di riferimento vengono convertiti in un'immagine in scala di grigi. Ma perché? È un problema di efficienza informatica: un'immagine che presenta più colori (immagine a colori) ha tre informazioni per pixel: componenti di colore rosso, blu e verde (il vecchio ma aureo standard RGB). Quindi, matematicamente, ogni pixel può essere definito come un array di tre valori, ognuno dei quali rappresenta una componente di colore. Pertanto, estendendola all'intera immagine, l'immagine finale sarà in realtà il mix di tre componenti dell'immagine: componenti dell'immagine Rosso, Blu e Verde.

Per elaborarlo, è necessario molto lavoro! Tuttavia, nelle immagini in scala di grigi, ogni pixel ha solo un'informazione sul colore. Quindi, l'elaborazione di un'immagine a colori è tre volte più lenta rispetto a un'immagine in scala di grigi (almeno tre volte, a seconda della tecnica coinvolta). E c'è di più: per alcuni scopi (come questo progetto), elaborare tutti i colori non è affatto necessario o importante. Pertanto, siamo giunti alla conclusione: l'utilizzo di immagini in scala di grigi è altamente raccomandato per l'elaborazione delle immagini. Dopo la sottrazione dello sfondo, è necessario applicare il filtro Sfocatura gaussiana.

Il filtro Sfocatura gaussiana applicato sull'immagine sottratta dallo sfondo uniforma tutti i contorni dell'oggetto rilevato in movimento. Di sicuro, sarà utile nei prossimi passaggi dell'elaborazione delle immagini.

Passaggio 2: binarizzazione

Binarizzazione
Binarizzazione

Nella maggior parte dei casi di elaborazione delle immagini, la binarizzazione è quasi un passaggio obbligatorio dopo aver evidenziato oggetti/caratteristiche in un'immagine. Motivo: in un'immagine binaria, ogni colore di pixel può assumere solo due valori: 0x00 (nero) o 0xFF (bianco). Questo aiuta molto l'elaborazione delle immagini in modo da richiedere ancora meno "potenza di calcolo" per applicare le tecniche di elaborazione delle immagini nei passaggi successivi. La binarizzazione può essere eseguita confrontando ogni colore di pixel dell'immagine in scala di grigi con una determinata soglia. Se il valore del colore del pixel è maggiore della soglia, questo colore del pixel assumerà il valore del bianco (0xFF), e se il valore del colore del pixel è inferiore della soglia, questo colore del pixel assumerà il valore del nero (0x00). Sfortunatamente, la scelta del valore di soglia non è così facile da fare. Dipende da fattori ambientali, come le condizioni di illuminazione. Una scelta errata di un valore di soglia può rovinare ulteriormente tutti i passaggi. Quindi, ti consiglio vivamente di regolare manualmente una soglia nel progetto per il tuo caso prima di ulteriori azioni. Questo valore di soglia deve garantire che l'oggetto in movimento venga visualizzato nell'immagine binaria. Nel mio caso, dopo una scelta adeguata di una soglia, si ottiene ciò che vedete in figura 5.

Figura 5 - immagine binaria

Passaggio 3: dilatare

Fino ad ora, era possibile rilevare oggetti in movimento, evidenziarli e applicare la binarizzazione, il che si traduce in un'immagine abbastanza chiara dell'oggetto in movimento (= immagine abbastanza chiara dell'oggetto per scopi di elaborazione delle immagini). La preparazione per il conteggio degli oggetti è QUASI terminata. Il "QUASI" qui significa che ci sono alcune piccole regolazioni da fare prima di andare avanti. A questo punto, ci sono reali possibilità di presenza di "buchi" negli oggetti (masse nere di pixel nell'oggetto evidenziato in bianco). Questi fori possono essere qualsiasi cosa, da particolari condizioni di illuminazione a una parte della forma dell'oggetto. Una volta che i buchi possono "produrre" oggetti falsi all'interno di oggetti reali (a seconda di quanto sono grandi e di dove si trovano), le conseguenze della presenza di buchi in un'immagine possono essere catastrofiche per il conteggio degli oggetti. Un modo per eliminare questi buchi è utilizzare una tecnica di elaborazione delle immagini chiamata Dilate. Usa questo e i buchi spariscono.

Passaggio 4: la ricerca dei contorni (e dei suoi centroidi)

La ricerca dei contorni (e dei suoi centroidi)
La ricerca dei contorni (e dei suoi centroidi)

A questo punto abbiamo gli oggetti evidenziati, senza buchi al loro interno e pronti per il prossimo: la ricerca dei contorni (e dei suoi centroidi). Ci sono risorse in OpenCV per rilevare automaticamente i contorni, ma i contorni rilevati devono essere scelti con saggezza (per scegliere solo l'oggetto o gli oggetti reali). Quindi, il criterio per rilevare i contorni è l'area dell'oggetto, misurata in pixel². Se un contorno ha un'area superiore a un limite (configurato nel software), allora deve essere considerato come un oggetto reale da contare. La scelta di questo limite/criterio di area è molto importante e una scelta sbagliata qui significa conteggi errati. È necessario provare alcuni valori dei limiti del valore dell'area e verificare cosa si adatta meglio al proprio utilizzo. Non preoccuparti, questi limiti non sono così difficili da trovare/regolare. Una volta selezionati tutti gli oggetti nell'immagine, il passaggio successivo consiste nel disegnare un reticolo su di esso (questo reticolo deve contenere un intero oggetto rilevato al suo interno). E il centro di questo rettangolo è… il centroide dell'oggetto! Stai forse pensando "Qual è il problema con questo centroide?", giusto? Ecco la tua risposta: non importa quanto grande o come sia la forma dell'oggetto, il suo movimento è lo stesso del baricentro. In altre parole: questo semplice punto chiamato baricentro rappresenta tutto il movimento dell'oggetto. Rende il conteggio molto semplice ora, non è vero? Vedere l'immagine sotto (figura 6), dove il baricentro dell'oggetto è rappresentato come un punto nero.

Passaggio 5: movimento e conteggio degli oggetti di Centorid

Il gran finale: confronta le coordinate del centroide dell'oggetto con le coordinate delle linee di entrata e uscita e applica l'algoritmo di conteggio descritto prima. E ci sarà il conteggio degli oggetti in movimento!

Risultato finaleCome mostrato all'inizio di questo post, ecco il progetto in azione:

Consigliato: