Avrete visto che ho pubblicato un sorgente che ha come obiettivo quello di fare object detection, in particolare face detection, e usare i movimenti dell'oggetto rilevato per muovere il cursore del mouse. Grazie all'uso delle OpenCV il programma è volutamente molto modulare. Quindi basta cambiare l'XML usato, contenente i descrittori di Haar, per riconoscere qualsiasi altro tipo di oggetto. Il problema è quello di creare un XML stabile e robusto tale da riconoscere l'oggetto desiderato. Il mio obiettivo ora è muovere il cursore del mouse attraverso la mano, ma non ho trovato in giro, a differenza del face detection, nessun XML stabile preconfezionato che mi permettesse di farlo. Quindi sto praticamente facendo da me. Tuttavia la cosa, pur essendo concettualmente semplice, richiede molto tempo, dato che bisogna raccogliere un campione di immagini positive (ovvero contenenti l'oggetto da riconoscere) relativamente ampio (meglio se nell'ordine del migliaio). Da queste ritagliare, uno ad uno, i rettangoli in cui è presente il campione da riconoscere, usando utility apposite per il crop. Bisogna poi creare anche un campione di immagini negative, in genere dello stesso numero di quelle positive, contenenti gli eventuali sfondi su cui si va a collocare l'oggetto da riconoscere, in modo che il software sappia cosa scartare.
Personalmente ho usato wxcam per fare gli snapshot delle immagini. wxcam però salva gli scatti in formato TIF, e altri software in formato BMP, entrambi non compatibili con le OpenCV. Quindi, una volta che avete terminato i vostri scatti potete convertirli in PNG, ad esempio, usando l'utility di ImageMagick 'convert':
Una volta che avete scattato il vostro campione di immagini positive, ovvero contenenti l'oggetto da riconoscere (nel mio caso la mano), e piazzate tutti nella stessa directory (mettiamo /home/utente/cv/hand/positive), usate questo sorgente per selezionare dalle immagini positive solo il campione che vi interessa. Per compilarlo, una volta che avete le OpenCV installate:
A questo punto avviate l'eseguibile sulla directory contenente le immagini positive, in questo modo:
In questo modo verràanalizzata la directory contenente le immagini positive e le informazioni sui frame selezionati verranno piazzate nel file positive.txt.
Selezionate con il tasto sinistro, partendo dall'angolo in alto a sinistra, la regione da riconoscere, quindi premete SPAZIO per salvare la selezione e 'b' per proseguire con la prossima immagine. In origine bisogna premere ENTER, ma b è più vicino alla barra spaziatrice, quindi ho deciso di usare quello per avanzare per comodità.
Una volta terminato, create il file di samples comprensibile a OpenCV sulla base delle vostre selezioni usando opencv-createsamples:
Ora create un file contenente invece l'elenco dei file negativi, ovvero immagini di sfondo ecc. che non contengono il vostro campione da analizzare. Supponendo che tali immagini siano nella directory negative e salvate come *.png:
Ora contate quante immagini positive e negative avete:
e quindi, finalmente, usate le informazioni così raccolte per generare l'XML con i classificatori di Haar utile per le OpenCV e per il mio software:
dove con -data si specifica il nome dell'XML in cui andranno salvate le informazioni, con -vec il file binario generato precedentemente con le informazioni sui positivi, con -bg l'elenco dei file negativi, poi il numero di immagini positive, il numero di quelle negative e il numero di passi che dovràcompiere il software per il training.
Al termine dell'elaborazione, avrete il vostro XML contenente i classificatori di Haar per riconoscere l'oggetto desiderato, che potete dare in pasto al mio software.
L'obiettivo dell'hand detection non è tanto banale però. Personalmente ho raccolto qualche centinaio di immagini campione positive e negative e generato l'XML, ma queste informazioni non sono ancora abbastanza per fare un hand detection davvero robusto in qualsiasi condizione di luminosità, a qualsiasi distanza e in qualsiasi ambiente. Quindi, tenendo conto che a livello software ora per fortuna c'è giàquasi tutto, dato che le OpenCV e il mio software sono punti di riferimento giàcompleti, vi chiedo, se avete tempo, di collaborare con me raccogliendo immagini campione di mani aperte in diverse condizioni di luminosità, distanza, sfondi ecc., e le relative immagini negative contenenti solo sfondi e contesti. Gli XML così generati poi potete inviarmeli, e io provvederò a fare il merge con quello che ho già. L'obiettivo è quello di generare un XML davvero robusto per l'hand detection, da proporre poi alle varie basi dati delle universitào dei centri di ricerca per il riconoscimento degli oggetti, nonché fare un robusto cursor moving usando la mano. Grazie a tutti per la collaborazione.
Personalmente ho usato wxcam per fare gli snapshot delle immagini. wxcam però salva gli scatti in formato TIF, e altri software in formato BMP, entrambi non compatibili con le OpenCV. Quindi, una volta che avete terminato i vostri scatti potete convertirli in PNG, ad esempio, usando l'utility di ImageMagick 'convert':
Codice:
for i in *.tif
do
echo converting $i...
convert $i -format png $i.png
done
Una volta che avete scattato il vostro campione di immagini positive, ovvero contenenti l'oggetto da riconoscere (nel mio caso la mano), e piazzate tutti nella stessa directory (mettiamo /home/utente/cv/hand/positive), usate questo sorgente per selezionare dalle immagini positive solo il campione che vi interessa. Per compilarlo, una volta che avete le OpenCV installate:
Codice:
g++ -o ObjectMaker ObjectMaker.cpp `pkg-config --cflags --libs opencv`
A questo punto avviate l'eseguibile sulla directory contenente le immagini positive, in questo modo:
Codice:
./ObjectMaker positive.txt /home/utente/cv/hand/positive/
In questo modo verràanalizzata la directory contenente le immagini positive e le informazioni sui frame selezionati verranno piazzate nel file positive.txt.
Selezionate con il tasto sinistro, partendo dall'angolo in alto a sinistra, la regione da riconoscere, quindi premete SPAZIO per salvare la selezione e 'b' per proseguire con la prossima immagine. In origine bisogna premere ENTER, ma b è più vicino alla barra spaziatrice, quindi ho deciso di usare quello per avanzare per comodità.
Una volta terminato, create il file di samples comprensibile a OpenCV sulla base delle vostre selezioni usando opencv-createsamples:
Codice:
opencv-createsamples -info positive.txt -vec positive.vec
Ora create un file contenente invece l'elenco dei file negativi, ovvero immagini di sfondo ecc. che non contengono il vostro campione da analizzare. Supponendo che tali immagini siano nella directory negative e salvate come *.png:
Codice:
find negative/ -name *.png > negative.txt
Ora contate quante immagini positive e negative avete:
Codice:
numpos=`find positive/ -name *.png | wc -l`
numneg=`find negative/ -name *.png | wc -l`
e quindi, finalmente, usate le informazioni così raccolte per generare l'XML con i classificatori di Haar utile per le OpenCV e per il mio software:
Codice:
opencv-haartraining -data hand -vec positive.vec -bg negative.txt -npos $numpos -nneg $numneg -nstages 20
dove con -data si specifica il nome dell'XML in cui andranno salvate le informazioni, con -vec il file binario generato precedentemente con le informazioni sui positivi, con -bg l'elenco dei file negativi, poi il numero di immagini positive, il numero di quelle negative e il numero di passi che dovràcompiere il software per il training.
Al termine dell'elaborazione, avrete il vostro XML contenente i classificatori di Haar per riconoscere l'oggetto desiderato, che potete dare in pasto al mio software.
L'obiettivo dell'hand detection non è tanto banale però. Personalmente ho raccolto qualche centinaio di immagini campione positive e negative e generato l'XML, ma queste informazioni non sono ancora abbastanza per fare un hand detection davvero robusto in qualsiasi condizione di luminosità, a qualsiasi distanza e in qualsiasi ambiente. Quindi, tenendo conto che a livello software ora per fortuna c'è giàquasi tutto, dato che le OpenCV e il mio software sono punti di riferimento giàcompleti, vi chiedo, se avete tempo, di collaborare con me raccogliendo immagini campione di mani aperte in diverse condizioni di luminosità, distanza, sfondi ecc., e le relative immagini negative contenenti solo sfondi e contesti. Gli XML così generati poi potete inviarmeli, e io provvederò a fare il merge con quello che ho già. L'obiettivo è quello di generare un XML davvero robusto per l'hand detection, da proporre poi alle varie basi dati delle universitào dei centri di ricerca per il riconoscimento degli oggetti, nonché fare un robusto cursor moving usando la mano. Grazie a tutti per la collaborazione.