微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决从Kinect传感器接收到的坐标的不受控制的更改,

如何解决如何解决从Kinect传感器接收到的坐标的不受控制的更改,

我想使用Kinect传感器控制机器人。我得到右手关节的坐标并计算角度。该角度将应用于机器人并蹲下。但是我对坐标的不受控制的更改有问题。因此,角度也会突然变化并且变化很大。这完全破坏了我的系统。 图像和骨骼数据的事件处理程序代码

private void MySensor_AllFramesReady(object sender,AllFramesReadyEventArgs e)
    {
        using (ColorImageFrame imageSensorFrame = e.OpenColorImageFrame())
        {
            if (imageSensorFrame == null)
            {
                return;
            }

            please.pictureBox1.Image = imageSensorFrame.ToBitmap();
        }
        using (var frame = e.OpenSkeletonFrame())
        {
            if (frame != null)
            {
                var Skeletons = new Skeleton[frame.SkeletonArrayLength];
                frame.copySkeletonDataTo(Skeletons);

                var TrackedSkeleton = Skeletons.FirstOrDefault(s => s.TrackingState == SkeletonTrackingState.Tracked);
                if (TrackedSkeleton != null)
                {                        
                    a = AngleJoint(TrackedSkeleton.Joints[JointType.HandRight],TrackedSkeleton.Joints[JointType.ElbowRight],TrackedSkeleton.Joints[JointType.ShoulderRight]).ToString(System.Globalization.CultureInfo.InvariantCulture);                        
                }
            }
        }
    }

使用“角度连接”方法来计算角度。这是其代码代码

public static double AngleJoint(Joint j1,Joint j2,Joint j3)
    {
        double angle = 0.0;
        double lj21X = j2.Position.X - j1.Position.X;
        double lj21Y = j2.Position.Y - j1.Position.Y;
        // double lj21Z = j1.Position.Z - j2.Position.Z;

        double vectordot21 = Math.Sqrt(Math.Pow(lj21X,2) + Math.Pow(lj21Y,2));
        double lj32X = j2.Position.X - j3.Position.X;
        double lj32Y = j2.Position.Y - j3.Position.Y;
        //double lj32Z = j3.Position.Z - j2.Position.Z;
        double vectordot32 = Math.Sqrt(Math.Pow(lj32X,2) + Math.Pow(lj32Y,2));
        double h = lj21X * lj32X + lj21Y * lj32Y;
        double res = h / (vectordot21 * vectordot32);
        if (res != Double.NaN)
        {
            if (-1 <= res && res <= 1)
            {
                double Angleradians = Math.Acos(res);
                angle = Angleradians * (180.0 / Math.PI);
            }
            else
                angle = 0.0;
        }
        else
            angle = 0.0;            
        return angle;            
    }

我假设由于我和Kinect之间的距离太远而丢失了坐标。是否可以跟踪骨骼的单独部分而不是整个部分?即,以便仅将骨架的一部分包括在框架中。我知道要以坐姿追踪骨骼,但这不适合我... 我寻求您的帮助或建议。我对你只有希望))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。