Отслеживание и сравнение скелетов с предопределенными скелетами

В настоящее время я работаю над проектом для школы, который требует от меня создания определенного программного обеспечения с аппаратным обеспечением Kinect. Программное обеспечение тесно связано с «игрой» аэробики / упражнений.

Однако, поскольку я никогда не работал с Kinect, я не знаю, с чего начать. Я скачал SDK и браузер Toolkit, а также некоторые (неофициальные?) Toolkit.

У меня есть некоторый опыт программирования на Java, но я не знаю, как работать с C/C++/C# или Visual Studio.

В основном я ищу учебные пособия, которые могли бы помочь мне лучше узнать о Kinect и о том, как работает программирование для него. Я попытался найти несколько, но они были либо устаревшими, либо настолько запутанными, что я не мог за ними угнаться.

Моя главная цель в проекте — выяснить, как я могу видеть, когда живой скелет держит обе руки над головой и когда они рядом с его телом (упражнение «Прыгающий домкрат»).

Может ли кто-нибудь помочь мне в правильном направлении несколькими ссылками или примерами?


person Marouane Boutaib    schedule 21.03.2013    source источник


Ответы (1)


C# концептуально не слишком отличается от Java. У Microsoft даже есть онлайн-справка по этому вопросу: C# Язык программирования для разработчиков Java. Хотя я бы посоветовал найти хорошую книгу, в которой C# не рассматривается в контексте другого языка — изучайте C#, а не «C# в том, что касается Java».

Обучение разработке для Kinect следует проводить на примерах из Toolkit. На самом деле нет лучшего способа. ОСТОРОЖНО онлайн-учебники! Многие из них были написаны для более старых версий SDK, которые больше не совместимы. Все, что написано для SDK‹ 1.5, просто не будет работать, без усилий его портировать.

Обнаружение прыгающего домкрата может быть выполнено с помощью распознавания жестов. Есть несколько библиотек, которые предоставляют это для официального Microsoft Kinect SDK — две, на которые я обычно указываю, это Kinect Toolbox и Библиотека жестов Fizbin. Оба обеспечивают распознавание жестов, просто используя разные методы.

В случае с библиотекой жестов Физбина вы объявляете ряд классов, которые определяют, как создается жест. Например, вот как библиотека определяет смахивание левой рукой вправо от тела:

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. Левая/правая рука над центром бедра и левая/правая рука снаружи левого/правого локтя
  3. Левая/правая рука над позвоночником и левая/правая рука снаружи левого/правого локтя
  4. Левая/правая рука над левым/правым плечом и левая/правая рука снаружи левого/правого локтя
  5. Левая/правая рука над головой

... если все они совпадают, у вас есть половина прыгающего валета. Сделайте все проверки в обратном порядке под одним и тем же Gesture, и у вас будет полный прыжок на верхнюю часть тела. Вы можете добавить положения ног, чтобы получить прыжок в полный рост.

Kinect Toolbox также можно использовать для определения жеста. Я просто не использовал его лично, поэтому я не могу говорить о необходимых шагах.

person Nicholas Pappas    schedule 21.03.2013