2011-01-28 11 views
6

Ho scritto un programma che utilizza i dati di profondità da un Kinect e rileva il blob per trovare la mano di un utente. Tuttavia, quando si usa la mano dell'utente per controllare il mouse, diventa molto a scatti, probabilmente perché le persone non sono molto brave a tenere le parti del corpo completamente immobili.Il rilevamento della mano ha come risultato un cursore a scatti

Ho provato a calcolare la posizione in base agli ultimi dieci posizionamenti, ma ciò ha provocato un ritardo temporale senza effettivamente impedire la scossa. La soluzione migliore finora che ho usato è quella di non spostare il cursore se il cambiamento dei pixel è inferiore a 10 in entrambe le direzioni (cioè, un cambiamento di 10 pixel in entrambe le direzioni provoca movimento). Questo va bene, ma è ancora piuttosto instabile, e si traduce in un'interfaccia goffa perché non hai una precisione precisa.

Come posso compensare la mancanza di fermezza nella forma umana in modo che il mouse non sia così a scatti?

risposta

2

Questo sarà in ogni caso un compromesso tra ritardo e stabilità.

Controlla i tuoi dati. Potresti scoprire che il jerking è dovuto alla bassa risoluzione in Kinect. In tal caso, la distanza di scuotimento sarà determinata dal livello di vicinanza alle telecamere Kinect. Quando sei troppo lontano la risoluzione della fotocamera è troppo bassa e continuerà a rimbalzare tra uno o due pixel (cam stereo).

Stai pensando nella giusta direzione calcolando la media e disponendo di una soglia per il movimento. Dici di aver calcolato la media delle ultime 10 posizioni, che con una risoluzione di 30 fps provoca un ritardo di 0,33 secondi.

Si consiglia di calcolare la media solo dell'ultimo 5 (esperimento) e invece della media calcolare il valore medio.

Solo un pensiero; il movimento raramente arriva da solo, quindi è possibile impostare una soglia per quando si riduce il numero di campioni utilizzati per la media/media.

+0

Questo è molto simile a quello che ho fatto. Ho calcolato la media degli ultimi tre punti e se il punto corrente era superiore a X pixel, ho eliminato la coda degli ultimi punti e l'ho usata. Se, tuttavia, la mano non era a X pixel di distanza, ho calcolato la media degli ultimi tre punti e il punto corrente, impostare il cursore su quella media e memorizzarlo come ultimo punto. In questo modo ho gettato via i valori anomali e ho smussato il movimento fine, ma ho comunque permesso un movimento grossolano. – Malfist

1

Qual è la frequenza di campionamento? 10 posizioni è probabile che siano solo un centesimo di secondo. Potresti voler calcolare la media dell'ultimo decimo o terzo secondo.

+0

Ottengo circa 30-60 campioni al secondo. – Malfist

1

Si è tentato di applicare uno median filter alla mappa di profondità prima di eseguire il rilevamento del BLOB? L'ho usato in un finger tracking demo e ha notevolmente migliorato la stabilità.

Una larghezza di banda compresa tra 3 e 5 mi ha dato i risultati migliori (5 uccide un po 'il fps ma è davvero fluido).

Problemi correlati