-2

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

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

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

如果用户往回走,则输出应为 DOWN。如果用户向左走,则输出应为 LEFT。RIGHT 也是如此。

直到我拥有的是:

    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 库了解不多,所以我需要一点帮助来做这件事。

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

4

2 回答 2

3

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

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

于 2012-04-17T02:37:12.043 回答
1

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

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

于 2012-04-17T06:04:39.100 回答