2013-12-14 45 views
0

我想製作一個Kinect程序,這要歸功於,當您的左手X位置穿過右肩X位置時,它將在PowerPoint上播放以下幻燈片。我已經完成了繪製骨架流的程序部分,並且它正常工作。對於第二部分,我試過這個:將兩個關節位置與Kinect比較

private void NextSlide(Skeleton skeleton) 
{ 
    Joint leftHand = skeleton.Joints[JointType.HandLeft]; 
    Joint spine = skeleton.Joints[JointType.Spine]; 
    Joint shoulderRight = skeleton.Joints[JointType.ShoulderRight]; 
    bool check = false; 
    if (leftHand.Position.X == shoulderRight.Position.X && check == false) 
    { 
     check = true; 
     System.Windows.Forms.SendKeys.Send("{RIGHT}"); 
    } 
    if (leftHand.Position.X == spine.Position.X && check == true) 
    { 
     check = false 
    } 
} 

任何人都可以解釋我在我的代碼中有什麼問題? 謝謝,

編輯:

我也試過這樣:

private void NextSlide(Skeleton skeleton) 
{ 
    Joint leftHand = skeleton.Joints[JointType.HandLeft]; 
    Joint spine = skeleton.Joints[JointType.Spine]; 
    Joint shoulderRight = skeleton.Joints[JointType.ShoulderRight]; 
    double lefthandposition = (int)leftHand.Position.X; 
    double shoulderrightposition = (int)shoulderRight.Position.X; 
    double spineposition = (int)spine.Position.X; 
    bool turn = false; 
    double right = lefthandposition - shoulderrightposition; 
    bool finish = false; 
    double ok = lefthandposition - spineposition; 
    if (right < 0) 
    { 
     turn = true; 
    } 
    if (ok > 0) 
    { 
     finish = true; 
    } 
    bool check = false; 
    if (turn == true && check == false && finish == false) 
    { 
     System.Windows.Forms.SendKeys.Send("{RIGHT}"); 
     check = true; 
     turn = false; 
    } 
    if (finish == true && check == true && turn == false) 
    { 
     check = false; 
     finish = false; 
    } 
} 

但它不工作太:/

+0

的兩個職位的機率完全相等,都很渺茫。您可以通過在肩部附近揮動手臂一段時間來實現它。另外,你使用了'JointType.ShoulderLeft'而不是'JointType.ShoulderRight'。 –

+0

對不起ShoulderLeft,在我的代碼中,我寫了ShoulderRight,但是當我複製出來時,我犯了一個錯誤:/。否則,我必須做些什麼才能做到這一點,只需在我的肩膀附近揮手一段時間。 –

回答

0

你碰到麻煩的是,您使用==作爲支票。如果有的話,你很少會遇到兩個關節完全相同的情況。根據您的需要,您需要使用>=<=作爲支票。

例如,檢查JointType.LeftHand >= JointType.RightShoulder,和JointType.LeftHand <= JointType.Spine,爲您的位置檢查。

另一個解決方案可能是使用現有的手勢庫來完成你想要的。這裏有兩個:

的Fizbin庫的GitHub的頁面介紹如何設置和執行現有的手勢:Executing on Gestures。包含在現有手勢集中的是「向右滑動」和「向左滑動」手勢,其執行方式類似於您想要執行的操作。

GitHub的頁面進入更多細節,但快速綱要將與設置的手勢庫和一個回調開始:要使用

gestureController = new GestureController(); 
gestureController.GestureRecognized += OnGestureRecognized; 

你會然後初始化手勢(S):

IRelativeGestureSegment[] swipeleftSegments = new IRelativeGestureSegment[3]; 
swipeleftSegments[0] = new SwipeLeftSegment1(); 
swipeleftSegments[1] = new SwipeLeftSegment2(); 
swipeleftSegments[2] = new SwipeLeftSegment3(); 
gestureController.AddGesture("SwipeLeft", swipeleftSegments); 

您可以修改現有手勢組件或編寫自己的手勢組件。這幾個例子將演示如何比較聯合職位。例如,在「SwipeLeft」手勢第一段如下:

public class SwipeLeftSegment1 : IRelativeGestureSegment 
{ 
    /// <summary> 
    /// Checks the gesture. 
    /// </summary> 
    /// <param name="skeleton">The skeleton.</param> 
    /// <returns>GesturePartResult based on if the gesture part has been completed</returns> 
    public GesturePartResult CheckGesture(Skeleton skeleton) 
    { 

     // right hand in front of right shoulder 
     if (skeleton.Joints[JointType.HandRight].Position.Z < skeleton.Joints[JointType.ElbowRight].Position.Z && skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.ShoulderCenter].Position.Y) 
     { 
      // right hand below shoulder height but above hip height 
      if (skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandRight].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y) 
      { 
       // right hand right of right shoulder 
       if (skeleton.Joints[JointType.HandRight].Position.X > skeleton.Joints[JointType.ShoulderRight].Position.X) 
       { 
        return GesturePartResult.Succeed; 
       } 
       return GesturePartResult.Pausing; 
      } 
      return GesturePartResult.Fail; 
     } 
     return GesturePartResult.Fail; 
    } 
} 

通知它通過一系列聯合檢查,並返回三種結果之一:

  • 成功:姿勢已完成(當所有'if'語句成功時觸發)
  • 暫停:手勢部分完成(當您想要指示手勢處於「運動中」但未完成時觸發)
  • 失敗:手勢未處於全部執行

當您想要初始化的手勢,你只需要到「骨架」的數據發送給手勢庫:

private void OnSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
{ 
    using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
    { 
      if (frame == null) 
        return; 

      // resize the skeletons array if needed 
      if (skeletons.Length != frame.SkeletonArrayLength) 
        skeletons = new Skeleton[frame.SkeletonArrayLength]; 

      // get the skeleton data 
      frame.CopySkeletonDataTo(skeletons); 

      foreach (var skeleton in skeletons) 
      { 
        // skip the skeleton if it is not being tracked 
        if (skeleton.TrackingState != SkeletonTrackingState.Tracked) 
          continue; 

        // update the gesture controller 
        gestureController.UpdateAllGestures(skeleton); 
      } 
    } 
} 

最後,執行上的手勢:

private void OnGestureRecognized(object sender, GestureEventArgs e) 
{ 
    switch (e.GestureName) 
    { 
      case "SwipeLeft": 
        // do what you want to do 
        break; 

      default: 
        break; 
    } 
}