C# 使用Kinect测量人体关节角度

C# 使用Kinect测量人体关节角度,c#,kinect,C#,Kinect,我刚刚开始从事kinect和C#编程,所以我对它非常业余 我想知道关节角度 我创建此代码只是为了测试我的技能,而没有使用kinect,但我在代码方面遇到了问题 我假设vector3v1和vector3v2作为关节置换,但是Find\u angle返回的值是NaN 我在这个过程中遗漏了什么吗?请注意,这方面的任何帮助都会有所帮助 Vector3 V1 = new Vector3(100,40,90); Vector3 v2 = new Vector3(160,60,90); public Main

我刚刚开始从事kinect和C#编程,所以我对它非常业余 我想知道关节角度

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

我假设vector3
v1
和vector3
v2
作为关节置换,但是
Find\u 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);
}

我对它不熟悉,但在应用ACO之前,应该将向量的乘积除以向量的大小

例如:

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

得到你想要的关节的X和Y,然后在它的两侧得到一个关节。然后看看如何计算的角度

基本上做:

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);
float x1=joint1.X;
浮动y1=接头1.Y;
浮点数x2=joint2.X;
浮动y2=接头2.Y;
浮动角度弧度;
浮动扩散系数x=x2-x1;
浮动差=y2-y1;
float atan2Result=(float)Math.Atan2(diffX,diffY);
角度弧度=atan2Result/2;
if(角度弧度<0.0f)
角度弧度+=(浮点)Math.PI;
浮点温度余弦=(浮点)数学余弦(角度弧度);
浮点温度正弦=((浮点)数学正弦(角度弧度)*-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个关节之间的角度
///Regresa elángulo interno dadas 3接头
/// 
/// 
/// 
/// 
/// 
点之间的公共静态双角度(接头j1、接头j2、接头j3)
{
双安古洛=0;
双shrhX=j1.Position.X-j2.Position.X;
双shrhY=j1.位置Y-j2.位置Y;
双shrhZ=j1.位置Z-j2.位置Z;
双hsl=向量范数(shrhX、shrhY、shrhZ);
双unrhX=j3.Position.X-j2.Position.X;
双unrhY=j3.Position.Y-j2.Position.Y;
双unrhZ=j3.Position.Z-j2.Position.Z;
双hul=向量范数(unrhX、unrhY、unrhZ);
双mhshu=shrhX*unrhX+shrhY*unrhY+shrhZ*unrhZ;
双x=mHSU/(hul*hsl);
如果(x!=Double.NaN)
{
如果(-1)