2014-02-23 107 views
0

我ID的第一骨架Kinect的跟蹤,然後怎麼做的東西用它做的東西與它。我只對第一個骨架感興趣,並且在我不需要它們之後發生。優選地,進入的下一個骨架根本不被跟蹤。Kinect的:我怎麼ID的第一跟蹤骨架和後

有人可以幫助我的感謝。目前下面的代碼使用不起作用。我已經嘗試了一些快速linq查詢,但我不知道如何使用它。始終有錯誤。

有人可以給我一些例子,我可以工作,感謝提前!

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 

      Skeleton[] skeletons = new Skeleton[0]; 


      using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) 
      { 
       if (skeletonFrame != null) 
       { 
        skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength]; 
        skeletonFrame.CopySkeletonDataTo(skeletons); 
       } 
      } 

      using (DrawingContext dc = this.drawingGroup.Open()) 
      { 
       // Draw a transparent background to set the render size 
       dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight)); 

       if (skeletons.Length != 0) 
       { 


        foreach (Skeleton skel in skeletons) 
        { 
         RenderClippedEdges(skel, dc); 


         if (skel.TrackingState == SkeletonTrackingState.Tracked) 
         { 
          this.TrackingId = Skel; 
          sensor.SkeletonStream.AppChoosesSkeletons = true; 
          sensor.SkeletonStream.ChooseSkeletons(skel.TrackingId); 

          this.DrawBonesAndJoints(skel, dc); 

          if (skel == null) 
          { 

           Process.Start("wmplayer.exe", "C:\\Users\\User\\Downloads\\Test.wma"); 
          } 
         } 
         else if (skel.TrackingState == SkeletonTrackingState.NotTracked) 
         { 
          sensor.SkeletonStream.AppChoosesSkeletons = false; 
         } 
        } 
       } 

       // prevent drawing outside of our render area 
       this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(160, 0.0, RenderWidth, RenderHeight)); 
      } 

    } 

回答

1

您可以跟蹤只有一個骨架與這段代碼:

int trackingID; 
skeletonTracked = new Skeleton(); 
bool first = true; 
Skeleton skeleton; 
Skeleton[] skeletons = new Skeleton[6]; 

... 

public void AllFramesReady(object sender, AllFramesReadyEventArgs e) 
{ 
    using (SkeletonFrame sFrame = e.OpenSkeletonFrame()) 
    { 
     sFrame.CopySkeletonDataTo(skeletons); 
     skeleton = (from s in skeletons where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault(); 
     if (skeleton == null) 
      return; 
    } 

    using (DrawingContext dc = this.drawingGroup.Open()) 
    { 
      // Draw a transparent background to set the render size 
     dc.DrawRectangle(Brushes.Black, null, new Rect(160, 0.0, RenderWidth, RenderHeight)); 

     RenderClippedEdges(skel, dc);    

     if (skeleton.TrackingState == SkeletonTrackingState.Tracked) 
     { 
      if (first) 
      { 
       skeletonTracked = skeleton; 
       trackingId = skeleton.TrackingID; 
       ... 
       first = false; 
      } 

      if (skeleton.TrackingID == trackingId) 
      { 
       ... 
      } 
     } 

     ... 
    } 
} 

此代碼找到的第一個骨骼檢測,如果它的跟蹤ID等於檢測到的第一個,那麼您執行操作用它,否則你不會對其他稍後檢測到的骨架執行操作。不過,我想看到Kinect user Detection,因爲它具有檢測與單獨的IDS /索引骨骼等方法。 ID的方法非常適合區分多個玩家,但它們在每個骨架上都會發生很大的變化。索引被保存了很短的時間,因此您可以使用一些代碼來檢測框架是否離開框架。

+0

感謝您的回覆狐猴。我可以理解你的例子,但無論如何,我可以繪製出第一個被跟蹤的骨架骨架嗎?像這樣.DrawBonesAndJoints(First,dc); – Azl

+0

@ user3032405是的,這將做到這一點,因爲它一次只能檢測一個骨架 –

1

Kinect的軌道播放機和在骨架陣列(長度== 6)每當它檢測到一個新的時間索引不同勢設定ID。這就是爲什麼當跟蹤編號等於零的索引數爲5時,需要保存播放機的ID。

int skeletonId = 0; 
    int trackId = 0; 


    void myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     Skeleton[] skeletons = null; 

     using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
     { 
      if (frame != null) 
      { 
       skeletons = new Skeleton[frame.SkeletonArrayLength]; 
       frame.CopySkeletonDataTo(skeletons); 
      } 
     } 

     if (skeletons == null) return; 

     //variable for count of null ID 
     int skeletonsNull = 0; 
     //counting... 
     foreach (Skeleton skeletonText in skeletons) 
     { 
      if (skeletonText.TrackingId == 0) 
      { 
       skeletonsNull++; 
      } 
      else 
      { 
       skeletonId = skeletonText.TrackingId; 
      } 
     } 


     if (skeletonsNull == 5) 
     { 
      trackId = skeletonId; 
     } 


     foreach (Skeleton skeleton in skeletons) 
     { 
      if (skeleton.TrackingId == trackId) 
      { 
      //do something 
      }