2012-04-17 12 views
5

Sto creando un'applicazione utilizzando l'SDK, in cui devo avere un solo utente e bloccarlo in modo che se qualcuno arriva, anche se quella persona è più vicina a Kinect, l'applicazione mantiene rintracciare il primo scheletro tracciato.Come bloccare una singola scheletro

Dal MSDN Library ho scoperto che potevo usare lo Stream Class Skeletom:

Proprietà: AppChoosesSkeletons = Ottiene o imposta un valore booleano che determina se l'applicazione sceglie quali scheletri per tenere traccia.

Metodo: SkeletonStream.ChooseSkeletons (Int32) = Scegli uno scheletro da tracciare. Sintassi: public selectKeysons (int trackingId1)

Non sono molto bravo in programmazione e sto usando C#, ho pensato di scrivere qualcosa come il codice in basso, ma dice che sto usando un'espressione non valida .

SkeletonFrame SFrame = e.OpenSkeletonFrame(); 
if (SFrame == null) return; 

Skeleton[] Skeletons = new Skeleton[SFrame.SkeletonArrayLength]; 
SFrame.CopySkeletonDataTo(Skeletons); 

int firstSkeleton = Skeletons[0].TrackingId; 
sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton); 

if (firstSkeleton == null) 
return; 

if (SkeletonTrackingState.Tracked == firstSkeleton.TrackingState) 
{ 
//body... 

Il problema è con l'sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton, si dice int firstSkeleton cannot be used.
Qualcuno potrebbe aiutarmi? Grazie!

+0

ti prego, dimmi, dove e quando si ottiene questo errore. – Likurg

+0

@Likurg L'ho scritto in un modo diverso non so se funzionerà o se è il modo migliore 'Skeleton closestSkeleton = (da s in Scheletri dove s.TrackingState == SkeletonTrackingState.Tracked && s.Joints [JointType.Head ] .TrackingState == JointTrackingState.Tracked select s) .OrderBy (s => s.TrackingId) .FirstOrDefault(); 'Dal codice che ho postato in precedenza, il problema era con' sensor.SkeletonStream.ChooseSkeletons (int firstSkeleton); ' ha detto che int firstSkeleton non poteva essere usato. Penso che la mia logica non sia giusta, manca qualcosa ma non sono sicuro di come farlo. Grazie per la risposta – Paola

+0

Hai provato a utilizzare Skeletons 'TrackingID'? Forse presti attenzione solo al primo? –

risposta

3
sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton); 

Cosa vuoi ottenere con questa linea?

Imo se si vuole lanciare firstSkeleton a int scrivere in questo modo:

sensor.SkeletonStream.ChooseSkeletons((int) firstSkeleton); 

se non volete per lanciarla e solo per dare e int variabile per methid basta scrivere:

sensor.SkeletonStream.ChooseSkeletons(firstSkeleton); 
2

Non è possibile bloccare uno scheletro, ma è possibile scegliere lo scheletro che si desidera tracciare, indipendentemente dalla sua posizione. Diventa complicato quando entrambe le persone lasciano il campo visivo del Kinect.

Impostando AppChoosesSkeletons su true, è possibile scegliere l'utente che si desidera tracciare. Per specificare l'utente o gli utenti da tracciare, chiamare il metodo SkeletonStream.ChooseSkeletons e passare l'ID di tracciamento di uno o due scheletri da tracciare (o nessun parametro se non si devono tracciare gli scheletri).

Qualcosa di simile a questo:

private void ChooseSkeleton() 
    { 
    if (this.kinect != null && this.kinect.SkeletonStream != null) 
     { 
     if (!this.kinect.SkeletonStream.AppChoosesSkeletons) 
     { 
     this.kinect.SkeletonStream.AppChoosesSkeletons = true; // Ensure AppChoosesSkeletons is set 
     } 

     foreach (Skeleton skeleton in this.skeletonData.Where(s => s.TrackingState != SkeletonTrackingState.NotTracked)) 
     { 
     int ID { get.skeleton[1]}//Get ID here 
     } 

     if (ID = 0) 
     { 
     this.kinect.SkeletonStream.ChooseSkeletons(ID); // Track this skeleton 
     } 
    } 
    } 
Problemi correlati