如何解决从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 (将#修改为@)