Sommario:
- Passaggio 1: approfondimenti: come viene rilevato il movimento di un oggetto in un flusso di immagini?
- Passaggio 2: binarizzazione
- Passaggio 3: dilatare
- Passaggio 4: la ricerca dei contorni (e dei suoi centroidi)
- Passaggio 5: movimento e conteggio degli oggetti di Centorid
Video: Conteggio oggetti Raspberry Pi: 5 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
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?
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
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)
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:
AccuRep: un dispositivo di conteggio per flessioni: 8 passaggi (con immagini)
AccuRep: un dispositivo di conteggio push-up: conosco molte persone che hanno iniziato a lavorare in questa quarantena. Il problema con gli allenamenti a casa è la mancanza di attrezzature da palestra. I miei allenamenti contengono principalmente flessioni. Per spingere davvero me stesso, ascolto musica rock durante i miei allenamenti. Il problema è il conteggio delle ripetizioni
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento utilizzando Shape Puncher: 5 passaggi
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento utilizzando Shape Puncher: metodo di apprendimento/insegnamento per studenti nuovi alla programmazione orientata agli oggetti. Questo è un modo per consentire loro di visualizzare e vedere il processo di creazione di oggetti dalle classi.Parti:1. EkTools punzone grande da 2 pollici; le forme solide sono le migliori.2. Pezzo di carta o c
Conteggio da 0 a 9999 con 8051 utilizzando il display a 7 segmenti: 5 passaggi
Conteggio da 0 a 9999 con 8051 utilizzando display a 7 segmenti: Ciao a tutti, in questo tutorial ti spiegheremo come contare da 0 a 9999 utilizzando quattro display a 7 segmenti utilizzando solo una porta e 4 pin digitali
CONTEGGIO ANELLO OROLOGIO: 5 passaggi (con immagini)
OROLOGIO CONTEGGIO ANELLO: Avevo programmato di acquistare un Neopixel Ring 60 Led per realizzare un orologio ma purtroppo non sono riuscito a comprarlo. Infine, ho acquistato un Neopixel Ring 35 Leds & ha escogitato un modo semplice per creare un orologio Internet in grado di visualizzare ore, minuti e amp; secondo con questo
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento con le forbici: 5 passaggi
Programmazione orientata agli oggetti: creazione di oggetti Metodo/tecnica di apprendimento/insegnamento Utilizzo delle forbici: metodo di apprendimento/insegnamento per studenti nuovi alla programmazione orientata agli oggetti. Questo è un modo per consentire loro di visualizzare e vedere il processo di creazione di oggetti dalle classi. Parti: 1. Forbici (va bene qualsiasi tipo). 2. Pezzo di carta o cartoncino. 3. Indicatore