2016-07-16 7 views
1

Ich benutze kinect SDK, um eine Anwendung in C# zu entwickeln. Jetzt habe ich Zweifel, ob ich das Skelett verfolgen kann.Beide Skeleton-Tracking-Methoden sind korrekt in Kinect?

Ich habe 2 Code, aber es gibt 2 verschiedene Ansätze. Ich möchte wissen, dass beide Methoden zu denselben Konzepten führen. oder anders?

Code 1:

void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
{ 
    using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
    { 
     m_skeletons = new Skeleton[frame.SkeletonArrayLength]; 
     frame.CopySkeletonDataTo(m_skeletons); 
    } 

    if(m_skeletons != null && m_skeletons.Length != 0) 
    { 
     foreach (Skeleton skeleton in m_skeletons) 
     { 
      if (skeleton != null && skeleton.TrackingState == SkeletonTrackingState.Tracked) 
      { 
       //doing some operations 
      } 


      } 

     } 

} 

jetzt eine andere Verfolgungsverfahren wie: Code 2:

void Kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
{ 
    using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
    { 
     m_skeletons = new Skeleton[frame.SkeletonArrayLength]; 
     frame.CopySkeletonDataTo(m_skeletons); 
    } 

    if(m_skeletons != null && m_skeletons.Length != 0) 
    { 
     foreach (Skeleton skeleton in m_skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)) 
      { 

       //doing some operations 
      } 

     } 

} 

sowohl foreach (Skeleton skeleton in m_skeletons) und die

foreach (Skeleton skeleton in m_skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked)) 

sind richtig? Ist ein Unterschied?

Antwort

1

Beide Ansätze sind funktionell gleichwertig.

Die .Where(s => s.TrackingState == SkeletonTrackingState.Tracked) erstellt einen Enumerator, der bereits die Prüfung enthält. Ihr foreach wird nur die Elemente durchlaufen, für die die Bedingung gilt. Im anderen Beispiel tun Sie das explizit mit einer if-Anweisung.