«

»

Feb 16

Программирование под kinect – с чего начать

Многообещающей разработке от Microsoft – Kinect, похоже, удалось то, чего не могли добиться ее предшественники (PlayStation move, Wii Remote) – создать всеобщий ажиотаж, подстегивая производителей и разработчиков бередить фантазию и измышлять новые способы применения этого необычного контроллера, позволяющего управлять приставкой или компьютером жестами и голосом.

Раздумываете, не пришла ли пора ворваться в нарождающийся рынок программ и игр, которые понимают человека с полуслова? Грезите идей новаторских механизмов управления геймплеем? Желаете поднять уровень взаимодействия пользователей с вашими наработками на новый уровень? ДАДАДА, вот только не понятно с чего начать?

Для начала расслабьтесь – все не так радужно, как спешат нас уверить маркетологи Микрософта. Давайте разберемся с чем вы будете работать. Кинект – не что иное, как набор нескольких сенсоров, теснящихся в стильном глянцевом корпусе. Веб-камера, камера глубины и несколько микрофонов. Соответственно вы, при наличии драйвера и минимального API,  можете получить RGB-картинку, матрицу глубины и аудио-данные. На ум сразу приходят термины “computer vision”, “линейная алгебра” и “нейронные сети”, и релиз мега-игры несколько откладывается, так как не совсем понятно как трактовать очередной жест игрока.

Какой SDK для Kinect вам лучше подойдет?

Официальный Kinect SDK от Microsoft. Драйвера только под Windows. Поддерживаются C++, C#, VB. Кроме низко-уровневых функций для получения “сырых” данных от сенсоров, в комплект входят классы и алгоритмы для skeleton-tracking (распознавания в кадре человека и частей его тела), а также для обработки аудио-сигналов (главным образом для связки с Microsoft Speech). В интернетах бродят немало эффектных, на первый взгляд, примеров с использованием игровых движков (например XNA). К сожалению, если вам не достаточно знать где у пользователя находится кисть руки, и важно  должным образом распознавать жесты вам придется включить в свой проект дополнительные библиотеки. Встроенных средств для реализации такой функциональности в sdk от микрософт нету. Если покопаться в заголовочных файлах SDK (MSR_NuiImageCamera.h), можно отыскать характеристики камер, которые могут понадобиться для анализа изображения вручную. Описание алгоритма, используемого Микрософтом для распознавания частей тела описано тут – http://research.microsoft.com/pubs/145347/BodyPartRecognition.pdf.

С чего начать программирование под Kinect с SDK от Microsoft:

http://channel9.msdn.com/Series/KinectQuickstart – серия видео-уроков по базовым возможностям SDK.

Пошаговое руководство на русском (для SDK Beta 2) с некоторыми пояснениями по используемым структурам – http://habrahabr.ru/blogs/cpp/123588/

Проект http://kinectdtw.codeplex.com может использоваться для записи положений тела (на основе skeleton tracking), для включения в свои C# проекты обработчиков для них.

Проект OpenKinect – кроссплатформенная библиотека (libfreenect) для работы с kinect под Mac Os, Linux, WIndows. Поддерживаются C++, C Sharp, Java, Lisp, Python. Ведутся работы для интеграции существующих наработок с  OpenCV, MATLAB, LabView. В рамках данного проекта разработаны утилиты для записи всех данных получаемых с кинекта в файлы – Record, а также для эмуляции кинекта – Fakenect. В вики этого проекта содержится подборка информации по всей подноготной кинекта – описание регистров устройства, протокола передачи данных на уровне USB-протокола и т.п. – если готовы ковыряться с самого нижнего уровня – начать лучше всего оттуда. Надо понимать, что если вы используете драйвер от OpenKinect то всю работу по анализу изображений и звуков – вы берете на себя.

Как видите – особо не густо. Данные как-то надо обрабатывать. А тут выбор тоже не очень большой.

Какие библиотеки могут быть использованы для определения команд через Kinect:

OpenCV – мощный набор алгоритмов из области компьютерного зрения. Кроссплатформенная (в том числе под Android). Поддерживает C/C++, Python. Подготовка изображения для анализа, всевозможные фильтры, распознавание лиц и жестов, отслеживание объектов на изображении. Умеет таскать картинку прямо с камеры. Аналоги мне не известны. Для обработки изображения с камер, пожалуй, единственный выбор.

OpenNi – универсальный набор функций для получения данных с различных устройств (включая ASUS WAVI/Xtion). Набор API для обработки данных, получаемых от драйверов сенсоров для реализации “естественного” интерфейса – обработки команд пользователей распознаваемых из 3d сцен. При начале работы приложение, используя возможности данного фреймворка, определяет какие сенсоры доступны и на основе данных получаемых от них формирует граф состоящий из узлов особого типа. Узлы представляют собой абстракцию для каждого типа – устройства, пользователя или карты глубины. Как и SDK от Microsoft, openni умеет определять “скелетон” человека и его позу. Если хотите чего-то большего – анализировать изображения все равно придется самостоятельно, однако универсальный программный интерфейс для работы с устройствами от различных производителей – в некоторых случаях суровый довод “За”. Доступно для C/C++.

Интересный пример использования OpenNi для экспорта движений для Blender или MotionBuilder Brekel Kinect.

Дальнейшая информация для изучения:

Стерео-зрение, по русски, для ничего не понимающих – http://habrahabr.ru/blogs/image_processing/130300/

Недавние исследования от Стенфорда, на тему распознавания жестов рук – http://www.stanford.edu/class/ee368/Project_11/Reports/Tang_Hand_Gesture_Recognition.pdf

Работа об определении людей на изображении с помощью Kinect – http://cvrc.ece.utexas.edu/Publications/HAU3D11_Xia.pdf

Эксперименты с матрицей глубины, получаемой от Кинекта – http://mathnathan.com/2011/02/03/depthvsdistance/

Интересные идеи применения кинект-подобных устройств – http://developkinect.com/

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>