简体   繁体   English

用Kinect查找弯头角度

[英]Finding Elbow Angle with Kinect

Vector3D Rwrist = new Vector3D(skel.Joints[JointType.WristRight].Position.X,
            skel.Joints[JointType.WristRight].Position.Y, skel.Joints[JointType.WristRight].Position.Z);
        Vector3D Relbow = new Vector3D(skel.Joints[JointType.ElbowRight].Position.X,
            skel.Joints[JointType.ElbowRight].Position.Y, skel.Joints[JointType.ElbowRight].Position.Z);
        Vector3D Rshoulder = new Vector3D(skel.Joints[JointType.ShoulderRight].Position.X,
            skel.Joints[JointType.ShoulderRight].Position.Y, skel.Joints[JointType.ShoulderRight].Position.Z);

        Vector3D wristToElbow = Vector3D.Subtract(Rwrist, Relbow);
        Vector3D elbowToShoulder = Vector3D.Subtract(Relbow, Rshoulder);

        elbowAngle = Vector3D.AngleBetween(elbowToShoulder, wristToElbow);

So it keeps returning NaN? 所以它不断返回NaN吗? I would really appreciate some help :) thanks so much guys!! 我真的很感谢您的帮助:)非常感谢你们!!

You have to normalize your Vectors. 您必须标准化向量。 Try adding this code. 尝试添加此代码。 I recommend that you do the AngleBetweenVector method yourself (See code below). 我建议您自己执行AngleBetweenVector方法(请参见下面的代码)。

public class Angles
    {
    public double AngleBetweenTwoVectors(Vector3D vectorA, Vector3D vectorB)
        {
            double dotProduct;
            vectorA.Normalize();
            vectorB.Normalize();
            dotProduct = Vector3D.DotProduct(vectorA, vectorB);

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

        public byte[] GetVector(Skeleton skeleton)
        {
            Vector3D RightShoulder = new Vector3D(skeleton.Joints[JointType.ShoulderRight].Position.X, skeleton.Joints[JointType.ShoulderRight].Position.Y, skeleton.Joints[JointType.ShoulderRight].Position.Z);
            Vector3D LeftShoulder = new Vector3D(skeleton.Joints[JointType.ShoulderLeft].Position.X, skeleton.Joints[JointType.ShoulderLeft].Position.Y, skeleton.Joints[JointType.ShoulderLeft].Position.Z);
            Vector3D RightElbow = new Vector3D(skeleton.Joints[JointType.ElbowRight].Position.X, skeleton.Joints[JointType.ElbowRight].Position.Y, skeleton.Joints[JointType.ElbowRight].Position.Z);
            Vector3D LeftElbow = new Vector3D(skeleton.Joints[JointType.ElbowLeft].Position.X, skeleton.Joints[JointType.ElbowLeft].Position.Y, skeleton.Joints[JointType.ElbowLeft].Position.Z);
            Vector3D RightWrist = new Vector3D(skeleton.Joints[JointType.WristRight].Position.X, skeleton.Joints[JointType.WristRight].Position.Y, skeleton.Joints[JointType.WristRight].Position.Z);
            Vector3D LeftWrist = new Vector3D(skeleton.Joints[JointType.WristLeft].Position.X, skeleton.Joints[JointType.WristLeft].Position.Y, skeleton.Joints[JointType.WristLeft].Position.Z);


            double AngleRightElbow = AngleBetweenTwoVectors(RightElbow - RightShoulder, RightElbow - RightWrist);
            double AngleLeftElbow = AngleBetweenTwoVectors(LeftElbow - LeftShoulder, LeftElbow - LeftWrist);

            byte[] Angles = {Convert.ToByte(AngleRightElbow), Convert.ToByte(AngleRightShoulder),Convert.ToByte(AngleLeftElbow),Convert.ToByte(AngleLeftShoulder)};
            return Angles;
        }
}
  1. Define Vectors 定义向量
  2. Substract 。减去
  3. Pass to AngleBetweenTwoVectors - method 传递给AngleBetweenTwoVectors-方法
  4. (In AngleBetweenTwoVectors) normalize (divide by Vector length on every axis) for more information here (在AngleBetweenTwoVectors) 正常化 (由Vector长度上的每个轴划分)的详细信息在这里
  5. Calculate the dot product (For more here ) 计算点积此处有更多信息
  6. Use Arcosinus (Arcos) method 使用Arcosinus (Arcos)方法
  7. Product/PI*180, otherwise you would get the radian 产品/ PI * 180,否则您将获得弧度

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM