2011-12-09 17 views
9

Vorrei monitorare la prima persona e utilizzare la mano destra di questa persona per navigare nell'applicazione che ho creato.Come rintracciare UNA persona con Kinect (trackingID)

Posso assumere il controllo del cursore, ora voglio solo una persona che viene monitorata. Quindi, fondamentalmente quando una persona sta navigando nel programma, e ci sono persone che camminano dietro di lui o stanno guardando con questo ragazzo, se si muovono, il kinect non dovrebbe riconoscere nessun altro.

Come posso implementare questo, so che è qualcosa con il trackingId ma cosa? : s

 foreach (SkeletonData s in allSkeletons.Skeletons) 
     { 

       if (s.TrackingState == SkeletonTrackingState.Tracked) 
       { 
        if (s.TrackingID == 0) 
        { 

         foreach (Joint joint in s.Joints) 
         { 
         } 
        } 
       } 
     } 

risposta

6

Ogni persona monitorata ha un indice giocatore. Ignora i giocatori con altri indici.
L'indice del giocatore fa parte dei dati nell'immagine del flusso di profondità. Bisogna estrarlo:

int playerIdx = depthFrame16[i16] & 0x07; 

Al fine di ottenere queste informazioni si deve inizializzare il Kinect Runtime correttamente:

_kinectNui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | .... 

Vedi qui per maggiori informazioni: http://www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx

Consiglio vivamente questo video tutorial da MS: http://research.microsoft.com/apps/video/?id=152249

Se si guarda in ShapeGameDem o che sta arrivando con l'SDK puoi vedere come lo fanno. (Hanno appena usano l'indice del skeletion nella matrice):

int playerId = 0; 
foreach (SkeletonData data in skeletonFrame.Skeletons) { 
    if (SkeletonTrackingState.Tracked == data.TrackingState) { 
     Player player; 
     if (players.ContainsKey(playerId)) 
     player = players[playerId]; 
     else 
     player = new Player(playerId); 
    } 
    playerId++; 
} 

cose Semplificare che puoi fare che (utilizzando il codice):

int myPlayerIndex = 0; //probably 0 since you are the first person entered the kinect scope 
int playerId = 0; 
foreach (SkeletonData s in allSkeletons.Skeletons) { 
    if(playerId != myPlayerIndex) 
     continue;  

    if (s.TrackingState == SkeletonTrackingState.Tracked) { 
     foreach (Joint joint in s.Joints) 
     { 
     } 
    } 
    playerId++; 
} 

Per completare le cose qui è una domanda simile in un forum MS che lo spiega: http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca

+0

Quindi in realtà hai fatto una classe di un giocatore? In questa classe si memorizza un ID giocatore, questo ID giocatore e questo ID giocatore memorizza l'array di scheletro? – Letoir

+0

L'ho controllato, questo significa che devo fare una lezione, di giocatore, dopo quella classe di ossa, per monitorare solo un'azione di una persona. Non potrebbe essere più semplice allora sembra :) – Letoir

+0

In realtà questo codice proviene da ShapeGame. Nel tuo codice la variabile allSkeletons contiene un elenco di tutti i giocatori. Se si utilizza l'indice di ogni giocatore come identificatore per questo, è possibile saltare gli altri. –