- Kinect for Windows SDK. Часть 1. Сенсор
- Kinect for Windows SDK. Часть 2. Потоки данных
- [Kinect for Windows SDK. Часть 3. Функциональные возможности]
- Играем в кубики с Kinect
- Программа, апорт!
Трекинг человеческой фигуры
С помощью такой замечательной функции Kinect способен распознать фигуру человека и его движения. И, на самом деле, даже не одного, а целых шести! В смысле определить, что в поле зрения сенсора находиться до шести людей, но только для двух может быть собрана детальная информация. Взгляните на рисунок:
![image](https://habrastorage.org/getpro/habr/post_images/ef1/c83/9e2/ef1c839e2584235b65c0cc1c521fafcb.png)
Лично у меня первый вопрос был: «Почему именно для этих двух перцев он[Kinect] построил полный 20-ти точечный скелет, а у остальных показал только пупки?» Но дело тут не в дискриминации, просто так сенсор действует по умолчанию – для первых двух распознанных фигур строится детальный скелет, остальные довольствуются тем, что их хотя бы заметили. В MSDN есть даже пример, как изменить это поведение, например, чтобы строить детальный скелет для ближайших к сенсору людей.
Точки в построенном скелете называются Joint, что можно перевести как сустав, соединение, узел. Узел мне кажется более адекватным переводом, да и голову называть суставом, как-то не очень хорошо.
Итак, первое, что необходимо сделать в приложении, чтобы получать информацию о фигурах в кадре, это включить нужный поток:
// подписываемся на событие с координатами найденных фигур в кадре
sensor.SkeletonFrameReady += SkeletonsReady;
// включаем поток
sensor.SkeletonStream.Enable();
Второе – обработать событие SkeletonFrameReady. Все что остается сделать – извлечь из кадра информацию об интересующих фигурах. Одна фигура – один объект класса Skeleton. Объект хранит данные о состоянии трекинга — свойство TrackingState (построен ли полный скелет или же известно только о местоположении фигуры), данные об узлах фигуры – свойство Joints. По сути это словарь, ключами которого являются значения перечисления JointType. Вот например, захотелось вам получить местоположения левого колена – нет ничего проще!
Joint kneeLeft = skeleton.Joints[JointType.KneeLeft];
int x = kneeLeft.Position.X;
int y = kneeLeft.Position.Y;
int z = kneeLeft.Position.Z;
Значения перечисления JointType оригинально показаны на рисунке витрувианского человека.
![image](https://habrastorage.org/getpro/habr/post_images/7c5/0a6/4bc/7c50a64bcba9e7aa005b31225308ced6.png)
До этих строк я писал о 20-ти узловом скелете. Построить который не всегда представляется возможным. Так появился режим, называемый трекинг сидящей фигуры (seated skeletal tracking). В этом режиме сенсор строит не полный 10-ти узловой скелет.
![image](https://habrastorage.org/getpro/habr/post_images/196/6c9/e9e/1966c9e9ee7437d1ff9eb677383bb766.png)
Чтобы Kinect начал распознавать фигуры в этом режиме достаточно установить свойство TrackingMode объекта SkeletonStream во время инициализации потоков:
kinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;
В режиме трекинга сидящей фигуры сенсор так же может распознавать до шести фигур и отслеживать две фигуры. Но есть и свои особенности. Так, например, чтобы сенсор «заметил» вас необходимо подвигаться, помахать руками, в то время как в режиме распознавания полного скелета достаточно встать перед сенсором. Трекинг сидящей фигуры более ресурсоемкая операция, поэтому будьте готовы к уменьшению FPS.
Другая статья цикла — Играем в кубики с Kinect, целиком посвящена теме трекинга человеческой фигуры.
Распознавание речи
Строго говоря, распознавание речи не является встроенной возможностью Kinect, так как для этого используется дополнительный SDK, а сенсор выступает в роли источника аудиосигнала. Поэтому для разработки приложений распознавания речи потребуется установка Microsoft Speech Platform. По желанию можно устанавливать разные языковые пакеты, а для клиентских машин существует отдельный пакет (speech platform runtime).
В общем случае вариант использования speech platform следующий:
- выбрать обработчик (engine) распознавания для требуемого языка из доступных в системе;
- создать словарь и передать его выбранному обработчику. Говоря по-человечески, необходимо решить какие слова ваше приложение должно уметь распознавать и передать их обработчику распознавания в виде строк (нет нужды создавать аудиофайлы со звучанием каждого слова);
- установить для обработчика источник аудиосигнала. Это могут быть Kinect, микрофон, аудиофайл;
- дать команду обработчику для начала распознавания.
После этого остается только обрабатывать событие, возникающее всякий раз, когда обработчик распознает слово. Пример работы с этой платформой вы найдете в статье Программа, апорт!
Трекинг лица
В отличие от трекинга фигуры, трекинг лица полностью реализуется программно, на основании данных получаемых из видеопотока (color stream) и потока данных дальномера (depth stream). Поэтому от ресурсов клиентского компьютера будет зависеть то, как быстро будет работать трекинг.
Стоит отметить, что трекинг лица (face tracking) это не то же самое что распознавание лиц (face recognition). Забавно, но в некоторых статьях встречал именно рассказы о том, что в Kinect реализована функция распознавания лиц. Так что же такое трекинг лица и где он может быть полезен?
Трекинг лица – это слежение за лицом человека в кадре с построением 87-ми узловой схемы лица. В MSDN сказано, есть возможность следить за несколькими лицами, но не сказано о верхнем пределе, вероятно, он равен двум (для стольких людей сенсор может построить N узловой скелет). Функционал может быть полезен в играх, чтобы ваш персонаж (avatar) мог передать всю палитру отображаемых на вашем лице эмоций; в приложениях, которые адаптируются под ваше настроение (плаксивое или игривое); в приложениях распознавания лиц, наконец, или даже эмоций (доктор Лайтман?).
Итак, схема. Собственно вот она (схема моей мечты):
![image](https://habrastorage.org/getpro/habr/post_images/f75/47d/209/f7547d2091a7bcd2ad8274a06bdeaf22.png)
Помимо этих 87 узлов, вы можете получить координаты еще для 13: центры глаз, носа, уголки губ и границы головы. SDK даже может построить 3D маску лица, как показано на следующем рисунке:
![image](https://habrastorage.org/getpro/habr/post_images/d67/afe/b0e/d67afeb0e90ba3429dfd709eb6fec19e.jpg)
Теперь, вооружившись общим понимание трекинга лица реализуемого 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 точками).
В общем виде алгоритм использования трекинга может выглядеть следующим образом:
- выбрать сенсор и включить видеопоток (color stream), поток данных дальномера (depth stream) и поток трекинга фигуры (skeleton stream);
- добавить обработчик события сенсора AllFramesReady, которое возникает, когда кадры всех потоков готовы к использованию;
- в обработчике события инициализировать FaceTracker (если это еще не сделано) пройтись по найденным в кадре фигурам и собрать для них построенные схемы лиц;
- обработать схемы лиц (например, показать построенную 3D маску или определить эмоции людей в кадре).
Хочу отметить, что я умышленно не привожу примеры кода, т.к. привести пример в пару строк не получится, а перегружать статью гигантскими многострочными листингами не хочется.
Помните, что качество нахождения лица в кадре зависит как от расстояния до головы, так и от её положения (наклонов). Приемлемыми наклонами головы для сенсора считаются вверх-вниз ±20°, влево-вправо ±45°, наклон на бок ±45°. Оптимальными будут ±10°, ±30° и ±45° для наклонов вверх-вниз, влево-вправо и набок соответственно (см. 3D Head Pose).
Kinect Studio
Когда первый раз пытаешься написать, что-то для Kinect, чувство того, что чего-то не хватает, не покидает ни на минуту. И когда в сотый раз настраиваешь точки останова так, чтобы они сработали именно при определенном жесте, и когда в сотый раз делаешь этот жест перед камерой, вот тогда и понимаешь чего же не хватает на самом деле! Простого эмулятора. Чтобы можно было записать нужные жесты, а потом спокойно сидеть и отлаживаться. Как ни странно, лучи добра посланные разработчиками всего мира, испытавшими разработку для Kinect, достигли цели. В состав Developer Toolkit вошел инструмент под названием Kinect Studio.
![Kinect Studio](https://habrastorage.org/getpro/habr/post_images/890/379/e5f/890379e5f10b91e2c758d37422d02e09.jpg)
Kinect Studio можно рассматривать как отладчик или эмулятор. Его роль чрезвычайно проста, помочь вам записать данные получаемые от сенсора и направить их в ваше приложение. Вы можете снова и снова проигрывать записанные данные, а при желании сохранить их в файл и вернуться к отладке через некоторое время.
Чтобы начать работать с Kinect Studio, вы подключаетесь к приложению и выбираете сенсор. Теперь все готово к тому, чтобы начать запись (recording) данных сенсора или инжекцию (injection) сохраненных данных.
![image](https://habrastorage.org/getpro/habr/post_images/739/5ae/dc3/7395aedc33ab247c0cf4fbd4ce7d51f8.png)
Послесловие
Статья-обзор, которая даже не планировалась, за время работы претерпела не одно изменение, а в результате разделилась на три части. В них я попытался собрать материал, который находил на просторах всемирной паутины. Но все таки главным источником знаний был и остается MSDN. Сейчас Kinect скорее напоминает котенка, который только-только учиться ползать, чем продукт, который можно воспринимать не только как just for fun. Я сам отношусь к нему с определенным скепсисом. Но кто знает, что будет завтра. Сейчас Kinect показывает хорошие результаты в игровой индустрии, а Kinect for Windows открывает простор для творчества разработчикам всего мира.