Облако точек тела с использованием Kinect SDK

Я делаю программу с SDK, где при обнаружении пользователей программа рисует скелет, которому они должны следовать. Недавно я увидел рекламу игры на моем Xbox, Nike+ Kinect и увидел, как он отображает копию персонажа, выполняющего что-то еще, например:

http://www.swaggerseek.com/wp-content/uploads/2012/06/fcb69__xboxkinect1.jpg

Or

http://www.swaggerseek.com/wp-content/uploads/2012/06/fcb69__xboxkinect.jpg

Могу ли я создать представление облака точек единственного обнаруженного человека (а не любого фона)? Заранее спасибо!


ИЗМЕНИТЬ

Использование этот сайт, я могу создавать облака точек, но не могу обрезать тело человека.


person Liam McInroy    schedule 13.06.2012    source источник


Ответы (4)


Похоже, что они отображают не полное облако точек, а карту интенсивности с синим оттенком. Это можно сделать с помощью изображения глубины из Kinect for Windows sdk. То, что вы ищете, это индекс игрока. Это предоставленный бит в каждом пикселе изображения глубины. Чтобы получить бит индекса игрока, вы также должны включить скелетный поток в своем коде инициализации.

Вот как бы я поступил. Я изменяю один из кратких руководств по Kinect для Windows SDK, которые можно найти здесь загрузите его и внесите следующие изменения:

//Change image type to BGRA32
image1.Source = 
                BitmapSource.Create(depthFrame.Width, depthFrame.Height, 
                96, 96, PixelFormats.Bgra32, null, pixels, stride); 

        //hardcoded locations to Blue, Green, Red, Alpha (BGRA) index positions       
        const int BlueIndex = 0;
        const int GreenIndex = 1;
        const int RedIndex = 2;
        const int AlphaIndex = 3;

//get player and depth at pixel
int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask;
int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth;

//check each pixel for player, if player is blue intensity.

            if (player > 0)
            {
                pixels[colorIndex + BlueIndex] = 255;
                pixels[colorIndex + GreenIndex] = intensity;
                pixels[colorIndex + RedIndex] = intensity;
                pixels[colorIndex + AlphaIndex] = 100;

            }
            else
            {
                //if not player make black and transparent
                pixels[colorIndex + BlueIndex] = 000;
                pixels[colorIndex + GreenIndex] = 000;
                pixels[colorIndex + RedIndex] = 000;
                pixels[colorIndex + AlphaIndex] = 0;
            }

Мне нравится использовать этот пример для тестирования цветов, так как он по-прежнему предоставляет вам средство просмотра глубины с правой стороны. Я прикрепил изображение этого эффекта ниже:

введите здесь описание изображения

Изображение слева представляет собой карту интенсивности со слегка окрашенными данными интенсивности на уровне пикселей.

Надеюсь, это поможет Дэвиду Бейтсу

person davidbates    schedule 01.07.2012
comment
После размышлений об эффекте уровня пикселей. Вы можете увеличить интенсивность для каждого второго пикселя, чтобы получить эффект искры, показанный на образце изображения. Просто говорю :) - person davidbates; 02.07.2012

Вы можете сделать очень простую триангуляцию точек. Проверьте это руководство:

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/Terrain_basics.php

Проверьте результат:

введите здесь описание изображения

person EdgarT    schedule 04.09.2012
comment
Очень хорошо. Не могли бы вы опубликовать реальный проект или то, как вы отображаете глубину в треугольники? Учебник создает статическую сетку, но ничего не говорит о картографировании. - person davidbates; 12.09.2012
comment
Это просто. Каждый пиксель в потоке глубины стал вершиной, X и Y — положение пикселя, а Z — глубина. Таким образом, используя метод из этого руководства, создайте индексы треугольников. - person EdgarT; 12.09.2012
comment
Вот функция для создания треугольников. Это довольно грязный код, je je. paste.ideaslabs.com/show/wUQpbnvU5T - person EdgarT; 12.09.2012
comment
Очень красиво, сейчас попробую. Одна вещь, которую я заметил в вашем коде, это то, что он строит вершины каждый раз, когда ему отправляется поток глубины. Как это влияет на производительность, я знаю, что векторы дешевы, но их очень много, и все они отрендерены программным обеспечением. - person davidbates; 18.09.2012
comment
Что ж, на моем старом ПК CoreDuo графика Intel работает нормально. Но, конечно, вы можете сделать некоторые оптимизации. - person EdgarT; 18.09.2012
comment
Не могли бы вы предоставить необходимый код для этого? Похоже, что указанный вами URL-адрес функции не работает. - person Shanaka; 25.04.2013

Это невозможно автоматически с официальным Kinect SDK. Но это реализовано в альтернативном SDK под названием OpenNI, там можно просто получить набор точек, из которых состоит пользователь. Если вы не хотите его использовать, я могу предложить довольно простой способ отделения пользователя от фона. Поскольку вы знаете z-позицию пользователя, вы можете просто взять точки, z которых находится в диапазоне от 0 до userZ + некоторое значение, представляющее толщину тела.

Другая идея состоит в том, чтобы пройтись по облаку точек, начиная с какого-то сустава (или суставов), и брать точки только в том случае, если расстояние меняется плавно, потому что, если вы возьмете фоновую точку, граничное тело и следующую точку тела, падение расстояния будет легко заметно. Проблема здесь в том, что вы начнете считать пол частью тела, потому что переход туда плавный, поэтому вы должны проверить его, используя самый нижний (голеностопный) сустав.

Или вы можете использовать сегментацию в PCL (http://docs.pointclouds.org/trunk/group__segmentation.html), но я не знаю, решена ли там проблема ног-пола. Похоже, у них это хорошо получается (http://pointclouds.org/documentation/tutorials/planar_segmentation.php ).

person Andrey    schedule 13.06.2012
comment
@OutlawLemur для PCL есть ссылка на учебник. Если вы решите реализовать это самостоятельно, то тут не может быть примера, это задача, которую нужно решить. - person Andrey; 14.06.2012

В Kinect для Windows SDK версии 1.5 есть образец, который можно изменить для этого.

Примеры имен: depth-d3d или depthwithcolor-d3d.

Они оба создают облака точек.

person Rob Relyea    schedule 14.06.2012
comment
Не могу не заметить, что это оба примера C++, я использую C# - person Liam McInroy; 14.06.2012