C# 如何检测用户行走的方向?

C# 如何检测用户行走的方向?,c#,console-application,kinect,openkinect,C#,Console Application,Kinect,Openkinect,我正在尝试使用Kinect创建一个程序,在其中观察用户,并作为程序的输出告诉用户行走的方向 我的意思是,如果用户向前走,输出应该是。。向上 0 <= 8 <= // the user (8) is walking forward (<=) to the camera (0=kinect) 这只是告诉你左手的位置。我对Kinect库了解不多,所以我需要一些帮助来完成这项工作 我看过帖子,但我仍然不明白这对我有什么帮助。因为所有关节都有一个X、Y、Z值,检

我正在尝试使用Kinect创建一个程序,在其中观察用户,并作为程序的输出告诉用户行走的方向

我的意思是,如果用户向前走,输出应该是。。向上

0    <=  8 <=        // the user (8) is walking forward  (<=) to the camera (0=kinect)
这只是告诉你左手的位置。我对Kinect库了解不多,所以我需要一些帮助来完成这项工作


我看过帖子,但我仍然不明白这对我有什么帮助。

因为所有关节都有一个X、Y、Z值,检测向前和向后(上下)就像监测关节的Z坐标一样简单。检测左侧和右侧与监视X坐标值一样简单。很明显,您需要一点缓冲空间,因为很难期望有人在每个轴上单独移动


脊椎
可能是一个很好的监控关节,因为走路时双手会摆动。您需要做的只是比较最后3或4个骨架帧,以查看用户似乎正在移动的方向,并将其映射到您需要的任何方向。

要检查某个方向的移动,您需要保留一段时间的关节历史记录。例如,最后0,5秒的最后16帧。若你们有,你们可以分析运动的方向,比较关节的实际位置(例如髋部中心)和历史。通过检查所有3个轴,您可以说用户正在向右、向左、向前、向后移动。他是在跳还是蹲


要创建这样的历史记录,可以创建一些结构的列表。结构需要有一个时间戳。使用时间戳,您可以删除超过0.5秒的条目,这样您的列表不会增长太多。在每一帧中,你将列表放入循环中,通过比较关节位置,将每个元素与实际位置进行比较

七个闭合大括号的列表肯定很尴尬;可能会将一些“guard”
if
语句转换为早期返回,而不是在不做任何操作的情况下从函数末尾掉下来。很抱歉打扰您,您能帮我编写一点代码吗?
    private static  KinectSensor kinectSensor;
    static void Main(string[] args)
    {
        kinectSensor = KinectSensor.KinectSensors[0];
        kinectSensor.SkeletonStream.Enable();
        kinectSensor.Start();
        kinectSensor.SkeletonFrameReady += kinectRuntime_SkeletonFrameReady;

        while (true) { }
    }

    private static Skeleton[] data;
    static void kinectRuntime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
        {
            if (skeletonFrame != null)
            {
                if ((data == null) || (data.Length != skeletonFrame.SkeletonArrayLength))
                    data = new Skeleton[skeletonFrame.SkeletonArrayLength];
                skeletonFrame.CopySkeletonDataTo(data);

                foreach (Skeleton ske in data)
                {
                    if (ske.TrackingState == SkeletonTrackingState.Tracked)
                    {
                        var joints = ske.Joints;

                        foreach (Joint joint in ske.Joints)
                        {
                            if (joint.JointType == JointType.HandLeft)
                            {
                                Console.WriteLine(joint.Position.X.ToString(".##"));
                                Console.WriteLine(joint.Position.Y.ToString(".##"));
                                Console.WriteLine(joint.Position.Z.ToString(".##"));
                            }
                        }
                    }
                }
            }
        }
    }