kinect sdk 2.0关节角度和跟踪

时间:2014-12-31 21:05:36

标签: c# visual-studio-2013 kinect

如何检查您正在访问的关节是否具有Tracked跟踪状态。我找到8个关节的角度,我似乎无法将结果显示在我的屏幕上,

public double AngleBetweenTwoVectors(Vector3D vectorA, Vector3D vectorB)
    {
        double dotProduct = 0.0;
        vectorA.Normalize();
        vectorB.Normalize();


        dotProduct = Vector3D.DotProduct(vectorA, vectorB);

        return (double)Math.Acos(dotProduct) / Math.PI * 180;
    }

    public double[] GetVector(Body skeleton)
    {

        Vector3D Shoulder = new Vector3D(skeleton.Joints[JointType.SpineShoulder].Position.X, skeleton.Joints[JointType.SpineShoulder].Position.Y, skeleton.Joints[JointType.SpineShoulder].Position.Z);
        Vector3D RShoulder = new Vector3D(skeleton.Joints[JointType.ShoulderRight].Position.X, skeleton.Joints[JointType.ShoulderRight].Position.Y, skeleton.Joints[JointType.ShoulderRight].Position.Z);
        Vector3D LShoulder = new Vector3D(skeleton.Joints[JointType.ShoulderLeft].Position.X, skeleton.Joints[JointType.ShoulderLeft].Position.Y, skeleton.Joints[JointType.ShoulderLeft].Position.Z);
        Vector3D RElbow = new Vector3D(skeleton.Joints[JointType.ElbowRight].Position.X, skeleton.Joints[JointType.ElbowRight].Position.Y, skeleton.Joints[JointType.ElbowRight].Position.Z);
        Vector3D LElbow = new Vector3D(skeleton.Joints[JointType.ElbowLeft].Position.X, skeleton.Joints[JointType.ElbowLeft].Position.Y, skeleton.Joints[JointType.ElbowLeft].Position.Z);
        Vector3D RWrist = new Vector3D(skeleton.Joints[JointType.WristRight].Position.X, skeleton.Joints[JointType.WristRight].Position.Y, skeleton.Joints[JointType.WristRight].Position.Z);
        Vector3D LWrist = new Vector3D(skeleton.Joints[JointType.WristLeft].Position.X, skeleton.Joints[JointType.WristLeft].Position.Y, skeleton.Joints[JointType.WristLeft].Position.Z);
        Vector3D RKnee = new Vector3D(skeleton.Joints[JointType.KneeRight].Position.X, skeleton.Joints[JointType.KneeRight].Position.Y, skeleton.Joints[JointType.KneeRight].Position.Z);
        Vector3D LKnee = new Vector3D(skeleton.Joints[JointType.KneeLeft].Position.X, skeleton.Joints[JointType.KneeLeft].Position.Y, skeleton.Joints[JointType.KneeLeft].Position.Z);
        Vector3D RAnkle = new Vector3D(skeleton.Joints[JointType.AnkleRight].Position.X, skeleton.Joints[JointType.AnkleRight].Position.Y, skeleton.Joints[JointType.AnkleRight].Position.Z);
        Vector3D LAnkle = new Vector3D(skeleton.Joints[JointType.AnkleLeft].Position.X, skeleton.Joints[JointType.AnkleLeft].Position.Y, skeleton.Joints[JointType.AnkleLeft].Position.Z);
        Vector3D Hip = new Vector3D(skeleton.Joints[JointType.SpineBase].Position.X, skeleton.Joints[JointType.SpineBase].Position.Y, skeleton.Joints[JointType.SpineBase].Position.Z);
        Vector3D RHip = new Vector3D(skeleton.Joints[JointType.HipRight].Position.X, skeleton.Joints[JointType.HipRight].Position.Y, skeleton.Joints[JointType.HipRight].Position.Z);
        Vector3D LHip = new Vector3D(skeleton.Joints[JointType.HipLeft].Position.X, skeleton.Joints[JointType.HipLeft].Position.Y, skeleton.Joints[JointType.HipLeft].Position.Z);


        double AngleRElbow = AngleBetweenTwoVectors(RElbow - RShoulder, RElbow - RWrist);
        double AngleRShoulder = AngleBetweenTwoVectors(RShoulder - Shoulder, RShoulder - RElbow);
        double AngleLElbow = AngleBetweenTwoVectors(LElbow - LShoulder, LElbow - LWrist);
        double AngleLShoulder = AngleBetweenTwoVectors(LShoulder - Shoulder, LShoulder - LElbow);
        double AngleRKnee = AngleBetweenTwoVectors(RKnee - RHip, RKnee - RAnkle);
        double AngleLKnee = AngleBetweenTwoVectors(LKnee - LHip, LKnee - LAnkle);
        double AngleRHip = AngleBetweenTwoVectors(RHip - Hip, RHip - RKnee);
        double AngleLHip = AngleBetweenTwoVectors(LHip - Hip, LHip - LKnee);


        Results.Add(AngleLShoulder);
        Results.Add(AngleLElbow);
        Results.Add(AngleLKnee);
        Results.Add(AngleLHip);
        Results.Add(AngleRShoulder);
        Results.Add(AngleRElbow);
        Results.Add(AngleRKnee);
        Results.Add(AngleRHip);

        double[] resultsArray = Results.ToArray();

        return resultsArray;

    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        result1.Text = Results[4].ToString();
        result2.Text = Results[5].ToString();
        result3.Text = Results[6].ToString();
        result4.Text = Results[7].ToString();
        result5.Text = Results[0].ToString();
        result6.Text = Results[1].ToString();
        result7.Text = Results[2].ToString();
        result8.Text = Results[3].ToString();
    }

有来自kinect的实时源到程序,但是当按下按钮时,由于某种原因抛出了空指针异常。我在想这是因为我不确定是否跟踪了关节。我该怎么做呢?

也是我的代码显示角度正确吗?我正在为每个结果使用文本框。

1 个答案:

答案 0 :(得分:1)

foreach (Joint joint in skeleton.Joints)
            {
                if (joint.TrackingState == JointTrackingState.Tracked)
                {
                    //Do something                    
                }
                else if (joint.TrackingState == JointTrackingState.Inferred)
                {
                    //Do something else                   
                }
            }

如果JointTrackingStateTrackedInferredNotTracked,则会循环访问Joints数组并检查每个关节,请参阅here。计算角度的程序非常好。

如果您对如何计算关节角度有更多疑问,请参阅 here

如果你想要一个有效的程序,我会通过电子邮件发送给你。或者参见 here 。希望这会有所帮助:)