C# 使用Kinect测量人体关节角度
我刚刚开始从事kinect和C#编程,所以我对它非常业余 我想知道关节角度 我创建此代码只是为了测试我的技能,而没有使用kinect,但我在代码方面遇到了问题 我假设vector3C# 使用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
v1
和vector3v2
作为关节置换,但是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)