2012-11-11 27 views
2

我試圖建立一個邏輯承認這是由用戶的右手做了一個圈,我得到了代碼繪製從示例代碼骨架和跟蹤,如何查找關節座標(X,Y,Z),以及如何繪製跟蹤關節的軌跡?

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(0.0, 0.0, RenderWidth, RenderHeight)); 

      if (skeletons.Length != 0) 
      { 
       foreach (Skeleton skel in skeletons) 
       { 
        RenderClippedEdges(skel, dc); 

        if (skel.TrackingState == SkeletonTrackingState.Tracked) 
        { 
         this.DrawBonesAndJoints(skel, dc); 
        } 
        else if (skel.TrackingState == SkeletonTrackingState.PositionOnly) 
        { 
         dc.DrawEllipse(
         this.centerPointBrush, 
         null, 
         this.SkeletonPointToScreen(skel.Position), 
         BodyCenterThickness, 
         BodyCenterThickness); 
        } 
       } 
      } 

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

我想現在要做的是跟蹤用戶的座標右手手勢識別,

這是我如何我打算把工作做好:

  1. 開始手勢
  2. 畫出圓圈的手勢,確保存儲起始座標,然後從頭開始每記錄45度的座標,8個八分圓,我們將得到8個樣本。
  3. 爲了決定是否繪製圓,我們可以檢查八個樣本之間的關係。

此外,在深度圖像中,我想要顯示繪製手勢的軌跡,因此手形點移動時會留下跟蹤,所以最終我們會得到一個由用戶繪製的圖形。我不知道如何做到這一點。

+0

目前還不清楚你在問什麼。你有沒有嘗試過你在上面闡述的邏輯? –

+0

嗨,我想獲得右手關節的座標。到目前爲止,我已經能夠獲得右手的(X,Y,Z)座標。對於我的問題的第二部分,我需要顯示右手關節運動的軌跡(路徑),所以如果我們正在查看骨架視圖,並且用戶繪製了一個圓圈手勢,然後我們將在骨架視圖中看到右手接頭所遵循的路徑。我希望我的問題很明確:/讓我知道如果它仍然沒有。 –

+0

您是如何檢測手勢的開始?檢測結束會更容易,當你有最後一個_n_點的記錄時,你可以插入一個圓圈...... – Rook

回答

4

在每個SkeletonFrameReady事件中,每個關節的座標都可用於每個跟蹤的骨架。裏面你foreach環......

foreach (Skeleton skeleton in skeletons) { 
    // get the joint 
    Joint rightHand = skeleton.Joints[JointType.HandRight]; 

    // get the individual points of the right hand 
    double rightX = rightHand.Position.X; 
    double rightY = rightHand.Position.Y; 
    double rightZ = rightHand.Position.Z; 
} 

你可以看看JointType枚舉拉出所有的關節,並與各個座標工作。

要繪製您的手勢軌跡,您可以使用您在示例中使用的DrawContext或使用其他方法在可視圖層上繪製Path。使用您的x/y/z值,您需要將它們縮放到窗口座標。 「Coding4Fun」庫提供了預先構建的功能;或者你可以自己寫,例如:

private static double ScaleY(Joint joint) 
{ 
    double y = ((SystemParameters.PrimaryScreenHeight/0.4) * -joint.Position.Y) + (SystemParameters.PrimaryScreenHeight/2); 
    return y; 
} 

private static void ScaleXY(Joint shoulderCenter, bool rightHand, Joint joint, out int scaledX, out int scaledY) 
{ 
    double screenWidth = SystemParameters.PrimaryScreenWidth; 

    double x = 0; 
    double y = ScaleY(joint); 

    // if rightHand then place shouldCenter on left of screen 
    // else place shouldCenter on right of screen 
    if (rightHand) 
    { 
     x = (joint.Position.X - shoulderCenter.Position.X) * screenWidth * 2; 
    } 
    else 
    { 
     x = screenWidth - ((shoulderCenter.Position.X - joint.Position.X) * (screenWidth * 2)); 
    } 


    if (x < 0) 
    { 
     x = 0; 
    } 
    else if (x > screenWidth - 5) 
    { 
     x = screenWidth - 5; 
    } 

    if (y < 0) 
    { 
     y = 0; 
    } 

    scaledX = (int)x; 
    scaledY = (int)y; 
} 
相關問題