如何检测用户走的方向?

时间:2012-04-16 23:57:46

标签: c# console-application kinect openkinect

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

我的意思是,如果用户向前走,输出应为.. UP

0    <=  8 <=        // the user (8) is walking forward  (<=) to the camera (0=kinect)

如果用户向后走,输出应为DOWN。 如果用户向左走,则输出应为LEFT。 对于右边也是如此。

直到我拥有的是:

    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(".##"));
                            }
                        }
                    }
                }
            }
        }
    }

这只是告诉你左手的位置。我对Kinect库知之甚少,所以我需要一些帮助才能做到这一点。

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

2 个答案:

答案 0 :(得分:3)

由于所有关节都具有X,Y,Z值,因此检测前进和后退(上下)就像监视关节的Z坐标一样容易。检测左和右就像监视X坐标值一样简单。显然你需要一点缓冲空间,因为很难指望有人专门在每个轴上移动。

Spine可能是一个很好的监控关节,因为在走路时手会摆动。您需要做的就是比较最后3个或4个骨架框架,看看用户看起来移动的方向,并将其映射到您需要的任何方向。

答案 1 :(得分:1)

要检查某个方向的运动,您需要保留一段时间的关节历史。例如,从最后0.5秒开始的最后16帧。如果你有,你可以分析运动的方向,比较关节的实际位置(例如HipCenter)和历史。通过检查所有3轴,您可以说是用户向右,向左,向前,向后。他是跳跃还是蹲伏。

要创建此类历史记录,您可以创建一些结构列表。结构需要有一个时间戳。使用时间戳,您可以删除早于0.5秒的条目,这样您的列表就不会增长太多。在每个框架中,您将列表放入循环中,并通过比较关节位置

将每个元素与实际位置进行比较