Сергей РезникСтатьи

Знакомство с Kinect SDK

Автор:

Давайте проведем небольшой обзор недавно вышедшей Kinect SDK.
К счастью, SDK написан на С++. После его установки мы видим всего лишь 6 файлов в папке include, а так же шесть динамически подключаемых библиотек (.dll). Классы и константы начинаются с аббревиатуры NUI - Natural User Interface. Открываем справку и начинаем изучение.

Подключение SDK видится очень простым:
To compile a NUI-based project, include MSR_NuiApi.h in your project, link against the .LIB file, and ensure that the .DLL is on your path when you run your project.
Переходим с следующему разделу, и видим 4 подраздела: API, Image Camera API, Skeleton API и класс NuiImageBuffer. Рассмотрим основные интересные моменты каждого раздела.

В разделе API описаны инициализация и выключение системы. При инциализации нужно указывать какие подсистемы наше приложение будет использовать: DEPTH_AND_PLAYER_INDEX, COLOR, SKELETON, DEPTH.

Следующий раздел: Image Camera API
С помощью этого API можно получить данные с камер. Открываем поток методом NuiImageStreamOpen. Следует отметить параметры для этого метода:

enum _NUI_IMAGE_TYPE {
    NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX = 0,
    NUI_IMAGE_TYPE_COLOR,
    NUI_IMAGE_TYPE_COLOR_YUV,
    NUI_IMAGE_TYPE_COLOR_RAW_YUV,
    NUI_IMAGE_TYPE_DEPTH,
    NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX_IN_COLOR_SPACE,
    NUI_IMAGE_TYPE_DEPTH_IN_COLOR_SPACE,
    NUI_IMAGE_TYPE_COLOR_IN_DEPTH_SPACE,
} NUI_IMAGE_TYPE;

Некоторые из этих параметров не поддерживаются в текущем SDK. А так же параметр, которые задает разрешение изображения:

enum _NUI_IMAGE_RESOLUTION {
    NUI_IMAGE_RESOLUTION_INVALID = -1,
    NUI_IMAGE_RESOLUTION_80x60 = 0,
    NUI_IMAGE_RESOLUTION_320x240,
    NUI_IMAGE_RESOLUTION_640x480
    NUI_IMAGE_RESOLUTION_1280x1024, 
} NUI_IMAGE_RESOLUTION;

Как видим - самое большое разрешение 1280х1024.

Далее получаем кадры с помощью NuiImageStreamGetNextFrame. Можно задать время, через которое данный метод вернет управление, если изображение не будет получено.
Так же можно настроить угол камеры: NuiCameraElevationSetAngle. Замечание к данной функции: Warning You should tilt the Kinect sensor as few times as possible, to minimize wear on the camera and to minimize tilting time. The camera motor is not designed for constant or repetitive movement, and attempts to use it that way may cause degradation of motor function. Вобщем лучше это не использовать.

Следующий раздел: Skeleton API

Включаем отслеживание скелета методом NuiSkeletonTrackingEnable и затем получаем кадры методом NuiSkeletonGetNextFrame. Этот метод возвращает нам вот такую структуру:

struct _NUI_SKELETON_FRAME {
    LARGE_INTEGER liTimeStamp;
    DWORD dwFrameNumber;
    DWORD dwFlags;
    Vector4 vFloorClipPlane;
    Vector4 vNormalToGravity;
    NUI_SKELETON_DATA SkeletonData[NUI_SKELETON_COUNT];
} NUI_SKELETON_FRAME;

Среди прочего в этой структуре содержится положение пола и вектор направления ускорения свободного падения. Все расчитывается приблизительно.
Интересно отметить: If the number of tracked skeletons is less than NUI_SKELETON_COUNT при этом NUI_SKELETON_COUNT = 6. Это намек на то, что можно отслеживать до 6 человек?
Внутри структуры NUI_SKELETON_DATA помимо прочего находится массив костей, для которых указанно расстояние до камеры в метрах. Всего отслеживается 20 костей (голова, позвоничник, таз, колени, локти, итд).

Класс NuiImageBuffer содержит в себе данные изображения. Интересно отметить методы LockRect, который предоставляет доступ к данным в виде

void * pBits;

Еще есть API для работы со звуком, но это мы разберем в другой раз.
В целом Beta SDK выглядит довольно простым и интересным в использовании. Не дождусь, когда у меня будет переходник чтобы опробовать его.

#Kinect, #project natal

17 июня 2011

Комментарии [14]