View Full Version : [C++ OpenCv] Algoritmo di tracking su Kinect
Salve a tutti!
Spero ci sia qualcuno che almeno concettualmente possa rassicurarmi sull'esito di quello che sarà un mio progetto d'esame.
Sto utilizzando un Kinect collegato al computer, su internet si trovano moltissimi hack di questa periferica Microsoft.
L'ambiente in cui mi trovo è Debian e uso i driver liberi freenect.
Le potenzialità del kinetct risiedono principalmente nell'emettitore/ricevitore IR che lo rendono di fatto un radar per la lettura delle profondità, oltre che alla presenza della videocamera RGB standard.
L'obiettivo è al momento "agganciare" e tracciare un pendolo che si muove nello spazio, leggendo ad ogni istante le coordinate per ricostruirne con la massima fedeltà possibile la traiettoria.
Dopo questo preambolo ecco la domanda "teorica" più che altro..
Ho la possibilità di effettuare un threshold dell'immagine IR in base alla profondità desiderata (es 3 metri, 20 cm..) isolando quindi un oggetto ad una determinata distanza (fin tanto che è fermo).
Secondo voi, una volta che ho a disposizione un "blob" binario rappresentante l'oggetto che voglio tracciare, posso trovare qualche libreria compatibile con OpenCv che mi consenta di seguire il movimento di quest ultimo dopo l'aggancio iniziale nell'immagine non segmentata?
Si è molto specifica come richiesta, ma magari avete avuto qualche esperienza simile, tentar non nuoce.
Grazie :)
ho avuto un problema simile con un touch screen con ir..
una delle soluzioni è:
per ogni immagine applichi il filtro di profondità e ottieni il blob
lo processi e ricavi un oggetto (ad esempio) che lo rappresenta e che contiene un riferimento al blob nello spazio (chessò il punto approssimato del centro)
compari l'oggetto nuovo con l'oggetto vecchio (del giro prima) e con la rappresentazione spaziale ( il centro ad esempio) ti calcoli di quanto si è spostato, velocità, accellerazione, etc.. insomma ciò che vuoi :)
di librerie precotte che fanno questo non ne conosco, però se l'oggetto è solo 1 questa soluzione non è dificile da rappresentare e non ciuccia tanta cpu (dipende ovviamente dal grado di precisione che vuoi e da altre cose in background che stai facendo)
;)
per ogni immagine applichi il filtro di profondità e ottieni il blob
lo processi e ricavi un oggetto (ad esempio) che lo rappresenta e che contiene un riferimento al blob nello spazio (chessò il punto approssimato del centro)
compari l'oggetto nuovo con l'oggetto vecchio (del giro prima) e con la rappresentazione spaziale ( il centro ad esempio) ti calcoli di quanto si è spostato, velocità, accellerazione, etc.. insomma ciò che vuoi :)
Molto gentile :)
Il problema che sorgerebbe nel mio caso è il seguente: all'inizio l'aggancio dell'oggetto da seguire avviene con un click del mouse, che selezione la profondità a cui effettuare il threshold iniziale isolandolo.
Successivamente però l'oggetto si muove, variando la propria posizione nello spazio 3D e dunque anche il valore dei pixel che lo caratterizzano. Di volta in volta dovrei trovare un nuovo valore di threshold.
Credi sia possibile procedere in un qualche modo lo stesso?
tutto dipende dall'ambiente..
se il pendolo si muove in un'area quadrata (diciamo), dove non c'è nessun'altro oggetto e kinect è posizionato a un lato del quadrato è semplice..
prima di applicare la procedura descritta sopra parti e fai una scansione partendo da profondità 0 fino alla massima, quando trovi qualcosa vuol dire che è il pendolo e applichi i filtro etc (però con la variabile in della profondità in più quando calcoli la distanza)
ripeto, questa è una semplice soluzione.. credo che ce ne siano molte altre :p
NB: ovviamente si può ottimizzare, per esempio la scansione della profondità la puoi fare a partire dall'ultimo valore registrato, visto che la webcam sarà minimo a 30 fps e il pendolo non si muove alla velocità della luce, perciò non sarà molto lontano dalla posizione vecchia :D
tutto dipende dall'ambiente..
se il pendolo si muove in un'area quadrata (diciamo), dove non c'è nessun'altro oggetto e kinect è posizionato a un lato del quadrato è semplice..
prima di applicare la procedura descritta sopra parti e fai una scansione partendo da profondità 0 fino alla massima, quando trovi qualcosa vuol dire che è il pendolo e applichi i filtro etc (però con la variabile in della profondità in più quando calcoli la distanza)
ripeto, questa è una semplice soluzione.. credo che ce ne siano molte altre :p
NB: ovviamente si può ottimizzare, per esempio la scansione della profondità la puoi fare a partire dall'ultimo valore registrato, visto che la webcam sarà minimo a 30 fps e il pendolo non si muove alla velocità della luce, perciò non sarà molto lontano dalla posizione vecchia :D
Ottime idee, grazie :)
Vorrà dire che piegherò un po' le condizioni sperimentali alle possibilità del kinect. Avrei preferito qualcosa di più "robusto", ma forse chiedo troppa pappa pronta...
Ultima domanda, conosci qualche libreria che possa fare al caso? Attualmente per OpenCv c'è qualcosa, ma sono aperto ad altre possibilità.
Ottime idee, grazie :)
Vorrà dire che piegherò un po' le condizioni sperimentali alle possibilità del kinect. Avrei preferito qualcosa di più "robusto", ma forse chiedo troppa pappa pronta...
Ultima domanda, conosci qualche libreria che possa fare al caso? Attualmente per OpenCv c'è qualcosa, ma sono aperto ad altre possibilità.
mah magari c'è qualcosa di già fatto.. solo che non credo sia così semplice...
le condizioni che ti ho detto sopra sono per una soluzione semplice e base, ovviamente con più lavoro puoi piegare kinect al tuovolere, non il contrario :p
spulcia bene le openCV che sembrano abbastanza complete sotto questo aspetto
mah magari c'è qualcosa di già fatto.. solo che non credo sia così semplice...
le condizioni che ti ho detto sopra sono per una soluzione semplice e base, ovviamente con più lavoro puoi piegare kinect al tuovolere, non il contrario :p
spulcia bene le openCV che sembrano abbastanza complete sotto questo aspetto
Provo a dare un'occhiata per vedere cosa riesco a tirare fuori.
grazie :)
non ho capito, il tracking te lo vorresti fare poi sull'immagine RGB?
in questo caso hai tutta la letteratura che vuoi! se la forma del blob non è troppo "strana" puoi provare a usare mean-shift (per dettagli http://comaniciu.net/).
Non so se opencv lo ha già pronto... sicuramente contiene camshift per il tracking delle facce, ma non so quanto sia generico.
non ho capito, il tracking te lo vorresti fare poi sull'immagine RGB?
in questo caso hai tutta la letteratura che vuoi! se la forma del blob non è troppo "strana" puoi provare a usare mean-shift (per dettagli http://comaniciu.net/).
Non so se opencv lo ha già pronto... sicuramente contiene camshift per il tracking delle facce, ma non so quanto sia generico.
Al momento tutto si svolge sulla telecamera IR perchè è in grado di restituire anche valori di "profondità" ;)
Sfortunatamente l'emettitore non è molto stabile e l'immagine catturata non particolarmente definita..Sicuramente il massimo sarebbe integrare le informazioni delle due cam, ma il lavoro sta già diventando pesantuccio così :)..
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.