跟踪和比较Skeletons与预定义的Skeleton

时间:2013-03-21 15:42:29

标签: windows kinect xbox360

我目前正在为学校开展一个项目,要求我使用Kinect硬件创建一个特定的软件。该软件与健美操/运动“游戏”密切相关。

然而,由于我从未为Kinect工作过,我对从哪里开始有点无能为力。我已经下载了SDK和Toolkit浏览器,还有一些(非官方的?)Toolkit。

我在Java编程方面有一些经验,但不知道如何使用C / C ++ / C#和Visual Studio。

我基本上都在寻找可以帮助我更好地了解Kinect及其编程方式的教程。我试过寻找一些,但它们要么已经过时,要么让我感到困惑,因为我无法跟上它们。

我在该项目的主要目标是要弄清楚我怎么能看到当一个活骷髅持有举过头顶他的双臂,当他们靠近他的身体(A开合跳运动)。

任何人都可以通过一些链接或示例帮助我朝着正确的方向前进吗?

1 个答案:

答案 0 :(得分:2)

C#在概念上与Java不同。微软甚至在这方面提供了在线帮助:The C# Programming Language for Java Developers。虽然我建议找一本不能用另一种语言包装C#的好书 - 学习C#,而不是“C#,因为它与Java有关。”

学习Kinect开发应该通过Toolkit示例来完成。真的没有更好的方法。 当心在线教程!许多是针对不再兼容的旧版SDK编写的。为SDK编写的任何内容< 1.5只是没有工作,没有努力移植它。

可以通过手势识别来检测跳跃插孔。有一些库为官方的Microsoft Kinect SDK提供了这个 - 我通常指的是Kinect ToolboxFizbin Gesture Library。两者都提供手势识别,只是使用不同的方法。

在Fizbin Gesture Library的情况下,您声明了一系列定义手势构造方式的类。例如,以下是库如何定义向身体右侧滑动左手:

namespace Fizbin.Kinect.Gestures.Segments
{
    /// <summary>
    /// The first part of the swipe right gesture
    /// </summary>
    public class SwipeRightSegment1 : IRelativeGestureSegment
    {
        /// <summary>
        /// Checks the gesture.
        /// </summary>
        /// <param name="skeleton">The skeleton.</param>
        /// <returns>GesturePartResult based on if the gesture part has been completed</returns>
        public GesturePartResult CheckGesture(Skeleton skeleton)
        {
            // left hand in front of left Shoulder
            if (skeleton.Joints[JointType.HandLeft].Position.Z < skeleton.Joints[JointType.ElbowLeft].Position.Z && skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.HipCenter].Position.Y)
            {
                // left hand below shoulder height but above hip height
                if (skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y)
                {
                    // left hand left of left Shoulder
                    if (skeleton.Joints[JointType.HandLeft].Position.X < skeleton.Joints[JointType.ShoulderLeft].Position.X)
                    {
                        return GesturePartResult.Succeed;
                    }

                    return GesturePartResult.Pausing;
                }

                return GesturePartResult.Fail;
            }

            return GesturePartResult.Fail;
        }
    }

    /// <summary>
    /// The second part of the swipe right gesture
    /// </summary>
    public class SwipeRightSegment2 : IRelativeGestureSegment
    {
        /// <summary>
        /// Checks the gesture.
        /// </summary>
        /// <param name="skeleton">The skeleton.</param>
        /// <returns>GesturePartResult based on if the gesture part has been completed</returns>
        public GesturePartResult CheckGesture(Skeleton skeleton)
        {
            // left hand in front of left Shoulder
            if (skeleton.Joints[JointType.HandLeft].Position.Z < skeleton.Joints[JointType.ElbowLeft].Position.Z && skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.HipCenter].Position.Y)
            {
                // left hand below shoulder height but above hip height
                if (skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y)
                {
                    // left hand left of left Shoulder
                    if (skeleton.Joints[JointType.HandLeft].Position.X < skeleton.Joints[JointType.ShoulderRight].Position.X && skeleton.Joints[JointType.HandLeft].Position.X > skeleton.Joints[JointType.ShoulderLeft].Position.X)
                    {
                        return GesturePartResult.Succeed;
                    }

                    return GesturePartResult.Pausing;
                }

                return GesturePartResult.Fail;
            }

            return GesturePartResult.Fail;
        }
    }

    /// <summary>
    /// The third part of the swipe right gesture
    /// </summary>
    public class SwipeRightSegment3 : IRelativeGestureSegment
    {
        /// <summary>
        /// Checks the gesture.
        /// </summary>
        /// <param name="skeleton">The skeleton.</param>
        /// <returns>GesturePartResult based on if the gesture part has been completed</returns>
        public GesturePartResult CheckGesture(Skeleton skeleton)
        {
            // //left hand in front of left Shoulder
            if (skeleton.Joints[JointType.HandLeft].Position.Z < skeleton.Joints[JointType.ElbowLeft].Position.Z && skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.HipCenter].Position.Y)
            {
                // left hand below shoulder height but above hip height
                if (skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y)
                {
                    // left hand left of left Shoulder
                    if (skeleton.Joints[JointType.HandLeft].Position.X > skeleton.Joints[JointType.ShoulderRight].Position.X)
                    {
                        return GesturePartResult.Succeed;
                    }

                    return GesturePartResult.Pausing;
                }

                return GesturePartResult.Fail;
            }

            return GesturePartResult.Fail;
        }
    }
}

您可以按照代码中的注释来查看手在身体中的移动情况。

对于你的跳跃式千斤顶,你可以在向上和向下的路上相对于一系列关节定义手。如果我要迅速吐出一系列支票,他们就会:

  1. 髋关节中心左/右手
  2. 左手/右手上方髋关节中心&amp;左/右手肘外左/右手
  3. 左手/右手在脊柱上方左/右手肘外左/右手
  4. 左/右手在左/右肩上方&amp;左/右手肘外左/右手
  5. 头顶左/右手
  6. ...如果所有这些匹配,你有半个跳跃。在相同的Gesture下反向进行所有检查,并且你有一个完整的上身跳跃千斤顶。你可以添加腿部位置以获得全身跳跃式千斤顶。

    Kinect工具箱也可用于定义手势。我个人没有使用它,所以我不能谈论所涉及的步骤。