Kinect for windows это

Обновлено: 08.07.2024

Как вам должно быть известно, Kinect – это бесконтактный контроллер, т.е. скажем в играх, вместо того, чтобы яростно стучать по клавиатуре или терзать gamepad, вы размахиваете руками и ногами и время от времени голосом даете какие-то команды. Самое время спрятать дорогие китайские вазы X века подальше!

Начинать знакомство с Kinect лучше со знакомства с самим сенсором. Это небольшая черная коробочка с тремя камерами, длиной чуть более 20 см и высотой около 5 см (не считая ножки). Один нюанс – в Kinect две камеры. И это изображение (взято из MSDN) тому подтверждение.

image

  • IR Emitter – Инфракрасный излучатель. Да, это не камера. Его назначение испускать инфракрасные лучи, которые, отражаясь от предметов, попадают назад в сенсор, где их принимает:
  • IR Depth Sensor – Инфракрасный приёмник. Собирает отраженные лучи, преобразуя их в расстояние от сенсора до объекта(ов). И таким образом строится, можно сказать, матрица расстояний — целый кадр. Максимальное разрешение 640x480 (30 fps). Если говорить о переводе мне кажется, «ИК приёмник» лучше отражает суть, чем дословный «ИК датчик глубины».
  • Color Sensor – Цветная камера. Захват видео с максимальным разрешением 1280x960 (12fps). Угол обзора камеры: 43° по вертикали и 57° по горизонтали (угол обзора дальномера идентичный). Можно выбрать формат картинки: RGB или YUV.
  • Microphone Array – набор микрофонов. 4 встроенных микрофона позволяют определить местоположение источника звука и направление звуковых волн. Встроенный обработчик звукового сигнала включает подавление эха и уменьшение шума.
  • Tilt Motor – Коррекция наклона. Позволяет программно настраивать наклон сенсора в диапазоне ±27° по вертикали.

Другой важный аспект аппаратной части – диапазон «рабочих» расстояний, т.е. на каком расстоянии сенсор способен видеть объекты (данные дальномера). И снова картинка помогает продемонстрировать возможности Kinect.

image

Режим Default Range доступен как для Kinect for Windows, так и для Kinect for XBox, но Near Range доступен только для сенсора Kinect for Windows. Простой пример: для всех объектов в кадре находящихся в пределах Normal Values сенсор вернёт измеренное расстояние, но для объектов, выходящих за этот диапазон, сенсор вернёт либо ноль, либо определенную для каждого диапазона константу (зависит от заданных вами настроек). Одно из существенных отличий SDK 1.5 от 1.0 в том, что теперь в режиме Near Range можно получить информацию о сидящем человеке, это так называемый трекинг сидящей фигуры (seated skeletal tracking). Kinect отслеживает 10 точек: голову, шею и руки. Но об этом чуть позже.

Хочется обратить внимание на различия двух Kinect (XBox и Windows). Первый разрабатывался и тестировался с одним устройством – XBox. Второй же, напротив, должен работать с широким диапазоном устройств (компьютеров), поэтому его кабель короче, а специальное устройство призвано не позволить Kinect подраться с остальной USB периферией. Лицензионное соглашение позволяет использовать Kinect for Windows в коммерческих целях, а Kinect for XBox нет.

Kinect

Сенсор был разработан для консоли Xbox 360, а с февраля 2012 года доступен для персональных компьютеров. Не так давно мне представилась возможность оценить сенсор и написать немного кода.

Думаю, что вы уже прочитали предыдущие статьи цикла посвященные обзору SDK. Настало время попробовать Kinect в действии! В статье я расскажу о том, как можно написать небольшую игру в кубики. И конечно кубики будут двигаться при помощи рук!

Итак, в первую очередь нам понадобится SDK для сенсора, его можно скачать с официального сайта. В SDK вы найдете некоторое количество примеров и документацию. Так же рекомендую посмотреть серию Quick Starts от Coding4Fun. И на закуску Kinect Paint на codeplex, можно скачивать, компилировать, изучать код.

Solution Explorer

В окне Toolbox доступны элементы управления из WpfViewers.

image

Теперь в MainWindows.xaml заменим корневой Grid на Canvas, на нём будем рисовать кубики. Поместим на форму элементы KinectSensorChooser и KinectColorViewer, чтобы соединиться с сенсором и отобразить видеопоток с камеры.


Обратите внимание на binding. Необходимо связать свойство Kinect класса KinectColorViewer со свойством Kinect класса KinectSensorChooser. Так color viewer будет знать, с каким сенсором мы работаем в данный момент. Остается только добавить инициализацию нужных потоков. Это можно сделать в обработчике события KinectSensorChanged (класс KinectSensorChooser), что позволит инициализировать сенсор при подключении. В общем виде это делается так:


Методы Enable потоков перегружены, вы можете передавать в них параметры, изменяющие поведение по умолчанию. Так перегруженный метод Enable для ColorStream принимает значение перечисления (enum) ColorImageFormat для настройки формата изображения (RGB или YUV), а так же его разрешения.

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

Cursor


Прежде чем двигаться дальше, создадим курсор, который будет отображать движение руки по полю. Можно взять какую-нибудь готовую картинку или красиво нарисовать курсор с помощью элемента Path. Я не стал брать картинку или красиво рисовать Path’ом, а пошел третьим путем и нарисовал Path’ом некрасиво.

Зияющая красная дырка вовсе не рана, а просто указатель центра, назначение которого я опишу чуть дальше.

Теперь остается только обрабатывать событие SkeletonFrameReady и перемещать «чудо-руку» по полю. Общий подход обработки события таков: получить кадр, вытащить из него данные по всем человеческим фигурам (skeleton) найденным в кадре и среди этих фигур выбрать первую отслеживаемую (tracked). Kinect может предоставлять данные о шести фигурах в кадре, но отслеживать перемещение может только двух (см. Player Segmentation Data). Для простой игры нам достаточно получить первого отслеживаемого игрока:


Информация о человеческой фигуре (skeleton) это набор из 20 точек. Изображение витрувианского человека как нельзя лучше подходит для их демонстрации.

Skeleton points

  • если левая рука игрока поднята и правая рука находится над кубиком – кубик перемещается вместе с правой рукой (перетаскивается);
  • если левая рука опущена, то правая может спокойно перемещаться над игровым полем.


Для того чтобы определить находиться ли правая рука игрока над кубиком, можно использовать функцию HitTest класса VisualTreeHelper. Помните красный кружок в «чудо-руке»? Именно под этой точкой мы ищем кубик.

Функция обработки жестов:


Метод расширения ScaleTo используется для приведения координат к масштабу игрового поля. Это метод входит в состав пакета Coding4Fun Kinect Toolkit (доступен для скачивания через NuGet). ToPoint2D — мой метод расширения использующийся для конвертации SkeletonPoint в Point. Понятно, что в методе UpdateCursorPosition мы перемещаем только курсор, а в методе MoveCubeUnderCursor перетаскиваем кубик.

С помощью такой замечательной функции Kinect способен распознать фигуру человека и его движения. И, на самом деле, даже не одного, а целых шести! В смысле определить, что в поле зрения сенсора находиться до шести людей, но только для двух может быть собрана детальная информация. Взгляните на рисунок:

image



Лично у меня первый вопрос был: «Почему именно для этих двух перцев он[Kinect] построил полный 20-ти точечный скелет, а у остальных показал только пупки?» Но дело тут не в дискриминации, просто так сенсор действует по умолчанию – для первых двух распознанных фигур строится детальный скелет, остальные довольствуются тем, что их хотя бы заметили. В MSDN есть даже пример, как изменить это поведение, например, чтобы строить детальный скелет для ближайших к сенсору людей.

Точки в построенном скелете называются Joint, что можно перевести как сустав, соединение, узел. Узел мне кажется более адекватным переводом, да и голову называть суставом, как-то не очень хорошо.

Итак, первое, что необходимо сделать в приложении, чтобы получать информацию о фигурах в кадре, это включить нужный поток:


Второе – обработать событие SkeletonFrameReady. Все что остается сделать – извлечь из кадра информацию об интересующих фигурах. Одна фигура – один объект класса Skeleton. Объект хранит данные о состоянии трекинга — свойство TrackingState (построен ли полный скелет или же известно только о местоположении фигуры), данные об узлах фигуры – свойство Joints. По сути это словарь, ключами которого являются значения перечисления JointType. Вот например, захотелось вам получить местоположения левого колена – нет ничего проще!


Значения перечисления JointType оригинально показаны на рисунке витрувианского человека.

image

До этих строк я писал о 20-ти узловом скелете. Построить который не всегда представляется возможным. Так появился режим, называемый трекинг сидящей фигуры (seated skeletal tracking). В этом режиме сенсор строит не полный 10-ти узловой скелет.

image

Чтобы Kinect начал распознавать фигуры в этом режиме достаточно установить свойство TrackingMode объекта SkeletonStream во время инициализации потоков:


В режиме трекинга сидящей фигуры сенсор так же может распознавать до шести фигур и отслеживать две фигуры. Но есть и свои особенности. Так, например, чтобы сенсор «заметил» вас необходимо подвигаться, помахать руками, в то время как в режиме распознавания полного скелета достаточно встать перед сенсором. Трекинг сидящей фигуры более ресурсоемкая операция, поэтому будьте готовы к уменьшению FPS.

Другая статья цикла — Играем в кубики с Kinect, целиком посвящена теме трекинга человеческой фигуры.

Распознавание речи

Строго говоря, распознавание речи не является встроенной возможностью Kinect, так как для этого используется дополнительный SDK, а сенсор выступает в роли источника аудиосигнала. Поэтому для разработки приложений распознавания речи потребуется установка Microsoft Speech Platform. По желанию можно устанавливать разные языковые пакеты, а для клиентских машин существует отдельный пакет (speech platform runtime).

  1. выбрать обработчик (engine) распознавания для требуемого языка из доступных в системе;
  2. создать словарь и передать его выбранному обработчику. Говоря по-человечески, необходимо решить какие слова ваше приложение должно уметь распознавать и передать их обработчику распознавания в виде строк (нет нужды создавать аудиофайлы со звучанием каждого слова);
  3. установить для обработчика источник аудиосигнала. Это могут быть Kinect, микрофон, аудиофайл;
  4. дать команду обработчику для начала распознавания.
Трекинг лица

В отличие от трекинга фигуры, трекинг лица полностью реализуется программно, на основании данных получаемых из видеопотока (color stream) и потока данных дальномера (depth stream). Поэтому от ресурсов клиентского компьютера будет зависеть то, как быстро будет работать трекинг.

Стоит отметить, что трекинг лица (face tracking) это не то же самое что распознавание лиц (face recognition). Забавно, но в некоторых статьях встречал именно рассказы о том, что в Kinect реализована функция распознавания лиц. Так что же такое трекинг лица и где он может быть полезен?

Трекинг лица – это слежение за лицом человека в кадре с построением 87-ми узловой схемы лица. В MSDN сказано, есть возможность следить за несколькими лицами, но не сказано о верхнем пределе, вероятно, он равен двум (для стольких людей сенсор может построить N узловой скелет). Функционал может быть полезен в играх, чтобы ваш персонаж (avatar) мог передать всю палитру отображаемых на вашем лице эмоций; в приложениях, которые адаптируются под ваше настроение (плаксивое или игривое); в приложениях распознавания лиц, наконец, или даже эмоций (доктор Лайтман?).

Итак, схема. Собственно вот она (схема моей мечты):

image

Помимо этих 87 узлов, вы можете получить координаты еще для 13: центры глаз, носа, уголки губ и границы головы. SDK даже может построить 3D маску лица, как показано на следующем рисунке:

image

Теперь, вооружившись общим понимание трекинга лица реализуемого Face Tracking SDK, самое время познакомиться с ним поближе. Face Tracking SDK – это COM-библиотека (FaceTrackLib.dll), входящая в состав Developer Toolkit. Там же есть и проект обертка (wrapper) Microsoft.Kinect.Toolkit.FaceTracking, который можно смело использовать в managed проектах. К сожалению, найти описание обертки не получилось, кроме приведенной ссылки (полагаю, что пока идет активная разработка и пока Face Tracking SDK не включен в состав Kinect SDK, остается только ожидать появление справки в MSDN).

Я остановлюсь лишь на нескольких классах. Центральное место занимает класс FaceTracker, как ни странно. В его задачи входит инициализация обработчика (engine) трекинга и слежение за перемещениями человека в кадре. Перегруженный метод Track, позволяет осуществлять поиск человека по данным с видеокамеры и дальномера. Одна из перегрузок метода принимает фигуру человека — Skeleton, что положительно сказывается на скорости и качестве поиска. Класс FaceModel помогает в построении 3D моделей, а так же занимается трансформацией моделей в систему координат камеры. В проекте Microsoft.Kinect.Toolkit.FaceTracking помимо классов оберток, можно найти и более простые, но не менее полезные типы. Например, перечисление FeaturePoint описывает все узлы схемы лица (см. выше рисунок с 87 точками).

  1. выбрать сенсор и включить видеопоток (color stream), поток данных дальномера (depth stream) и поток трекинга фигуры (skeleton stream);
  2. добавить обработчик события сенсора AllFramesReady, которое возникает, когда кадры всех потоков готовы к использованию;
  3. в обработчике события инициализировать FaceTracker (если это еще не сделано) пройтись по найденным в кадре фигурам и собрать для них построенные схемы лиц;
  4. обработать схемы лиц (например, показать построенную 3D маску или определить эмоции людей в кадре).

Помните, что качество нахождения лица в кадре зависит как от расстояния до головы, так и от её положения (наклонов). Приемлемыми наклонами головы для сенсора считаются вверх-вниз ±20°, влево-вправо ±45°, наклон на бок ±45°. Оптимальными будут ±10°, ±30° и ±45° для наклонов вверх-вниз, влево-вправо и набок соответственно (см. 3D Head Pose).

Kinect Studio

Когда первый раз пытаешься написать, что-то для Kinect, чувство того, что чего-то не хватает, не покидает ни на минуту. И когда в сотый раз настраиваешь точки останова так, чтобы они сработали именно при определенном жесте, и когда в сотый раз делаешь этот жест перед камерой, вот тогда и понимаешь чего же не хватает на самом деле! Простого эмулятора. Чтобы можно было записать нужные жесты, а потом спокойно сидеть и отлаживаться. Как ни странно, лучи добра посланные разработчиками всего мира, испытавшими разработку для Kinect, достигли цели. В состав Developer Toolkit вошел инструмент под названием Kinect Studio.

Kinect Studio

Чтобы начать работать с Kinect Studio, вы подключаетесь к приложению и выбираете сенсор. Теперь все готово к тому, чтобы начать запись (recording) данных сенсора или инжекцию (injection) сохраненных данных.

Читайте также: