2012-09-19 55 views
2

我刚刚正在研究kinect和C#编程,所以我非常爱好它 我想知道关节角度。使用Kinect的身体关节角度

我创建此代码只是为了测试我的技能而不使用kinect,但是在代码方面有问题。

我假设vector3 v1和vector3 v2作为联合更换,但从Find_angle返回的值为NaN

我在过程中遗漏了什么吗?请在这方面提供任何帮助。

Vector3 V1 = new Vector3(100,40,90); 
Vector3 v2 = new Vector3(160,60,90); 
public MainWindow() 
{ 
    InitializeComponent(); 

    Vector3.Normalize(V1); 
    Vector3.Normalize(v2); 

    float Result = this.find_angle(V1,v2); 
    MessageBox.Show(Result.ToString()); 
} 
public float find_angle(Vector3 va, Vector3 vb) 
{ 
    float dot_pro=Vector3.Dot(va, vb); 
    double angle = Math.Acos(dot_pro); 

    angle = angle * 180/Math.PI; 

    return (float)(angle); 
} 

回答

0

我不熟悉它,但你应该在应用acos之前将它们的大小乘以它们的大小。

例子:

double len_prod = va.Len * vb.Len; 
double angle = Math.Acos(dot_pro/len_prod); 
2

获取的X,你想联合Y的公司,然后得到其任一侧的关节。然后看看如何计算角度How do I calculate angle from two coordinates?

基本上做到:

float x1 = joint1.X; 
float y1 = joint1.Y; 

float x2 = joint2.X; 
float y2 = joint2.Y; 

float angleRadians; 

float diffX = x2 - x1; 
float diffY = y2 - y1; 

float atan2Result = (float)Math.Atan2(diffX, diffY); 
angleRadians = atan2Result/2; 
if (angleRadians < 0.0f) 
    angleRadians += (float)Math.PI; 

float tempCosine = (float)Math.Cos(angleRadians); 
float tempSine = ((float)Math.Sin(angleRadians) * -1); 

编辑

您可能希望看到Kinect sideways skeleton tracking联合跟踪

1

的功能,如果你正在使用Kinect SDK获得骨骼跟踪,你可以使用这个:

/// <summary> 
    /// Return the angle between 3 Joints 
    /// Regresa el ángulo interno dadas 3 Joints 
    /// </summary> 
    /// <param name="j1"></param> 
    /// <param name="j2"></param> 
    /// <param name="j3"></param> 
    /// <returns></returns> 
    public static double AngleBetweenJoints(Joint j1, Joint j2, Joint j3) 
    { 
     double Angulo = 0; 
     double shrhX = j1.Position.X - j2.Position.X; 
     double shrhY = j1.Position.Y - j2.Position.Y; 
     double shrhZ = j1.Position.Z - j2.Position.Z; 
     double hsl = vectorNorm(shrhX, shrhY, shrhZ); 
     double unrhX = j3.Position.X - j2.Position.X; 
     double unrhY = j3.Position.Y - j2.Position.Y; 
     double unrhZ =j3.Position.Z - j2.Position.Z; 
     double hul = vectorNorm(unrhX, unrhY, unrhZ); 
     double mhshu = shrhX * unrhX + shrhY * unrhY + shrhZ * unrhZ; 
     double x = mhshu/(hul * hsl); 
     if (x != Double.NaN) 
     { 
      if (-1 <= x && x <= 1) 
      { 
       double angleRad = Math.Acos(x); 
       Angulo = angleRad *(180.0/Math.PI); 
      } 
      else 
       Angulo = 0; 


     } 
     else 
      Angulo = 0; 


     return Angulo; 

    } 


    /// <summary> 
    /// Euclidean norm of 3-component Vector 
    /// </summary> 
    /// <param name="x"></param> 
    /// <param name="y"></param> 
    /// <param name="z"></param> 
    /// <returns></returns> 
    private static double vectorNorm(double x, double y, double z) 
    { 

     return Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2) + Math.Pow(z, 2)); 

    } 

此方法使用3个关节来获得角度。

enter image description here