2012-04-17 20 views
5

Tworzę aplikację za pomocą SDK, w której muszę mieć tylko jednego użytkownika i zablokować go, więc jeśli pojawi się ktoś inny, nawet jeśli ta osoba jest bliżej do Kinect, aplikacja zachowuje śledzenie pierwszego szkieletu, który śledził.Jak zablokować w pojedynczym szkielecie?

Od bibliotece MSDN znalazłem mogę użyć Skeletom Stream Klasa:

nieruchomości: AppChoosesSkeletons = Pobiera lub ustawia Boolean wartość, która określa, czy aplikacja wybiera, które szkielety śledzić.

Metoda: SkeletonStream.ChooseSkeletons (Int32) = Wybiera szkielet do śledzenia. Składnia: pustka publiczna ChooseSkeletons (int trackingId1)

Nie jestem zbyt dobry w programowaniu i używam C#, myślałem o napisaniu czegoś takiego jak kod, ale mówi, że używam nieprawidłowego wyrażenia .

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... 

Problem jest z sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton, mówi int firstSkeleton cannot be used.
Czy ktoś mógłby mi pomóc? Dzięki!

+0

Proszę, powiedz mi, gdzie i kiedy pojawi się ten błąd. – Likurg

+0

@Likurg Napisałem to w inny sposób, nie wiem, czy to zadziała, czy jest to najlepszy sposób: 'Skeleton closestSkeleton = (od s w Skeletons gdzie s.TrackingState == SkeletonTrackingState.Tracked && s.Joints [JointType.Head ] .TrackingState == JointTrackingState.Tracked select s) .OrderBy (s => s.TrackingId) .FirstOrDefault(); 'Z kodu, który napisałem wcześniej, problem był z' sensor.SkeletonStream.ChooseSkeletons (int firstSkeleton); ' napisano, że int firstSkeleton nie może być użyty. Myślę, że moja logika nie jest właściwa, czegoś brakuje, ale nie jestem pewna, jak to zrobić. Dzięki za odpowiedź ur – Paola

+0

Czy próbowałeś używać 'TrackingID' szkieletów? Może tylko zwrócić uwagę na pierwszy? –

Odpowiedz

3
sensor.SkeletonStream.ChooseSkeletons(int firstSkeleton); 

Co chcesz osiągnąć za pomocą tej linii?

Imo jeśli chcesz rzucić firstSkeleton int napisać to tak:

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

jeśli Don`t chcą rzucić go i po prostu dać i int zmienną methid wystarczy napisać:

sensor.SkeletonStream.ChooseSkeletons(firstSkeleton); 
2

Nie możesz zablokować szkieletu, ale możesz wybrać szkielet, który chcesz śledzić, niezależnie od jego położenia. To staje się skomplikowane, gdy oboje opuszczają pole widzenia Kinect.

Ustawiając AppChoosesSkeletons na true, możesz wybrać użytkownika, którego chcesz śledzić. Aby określić użytkownika lub użytkowników do śledzenia, należy wywołać metodę SkeletonStream.ChooseSkeletons i przekazać identyfikator śledzenia jednego lub dwóch szkieletów, które mają być śledzone (lub brak parametrów, jeśli nie można śledzić szkieletów).

coś takiego:

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 
     } 
    } 
    } 
Powiązane problemy