2012-01-09 3 views
15

Я использую Microsoft Kinect SDK, чтобы получить информацию о глубине и цвете с Kinect, а затем преобразовать эту информацию в облако точек. Мне нужна информация о глубине в координатах реального мира с центром камеры в качестве источника.Данные глубины для Microsoft Kinect SDK для координат реального мира

Я видел ряд функций преобразования, но они, по-видимому, для драйверов OpenNI и других производителей. Я читал, что информация о глубине, поступающая от Kinect, уже находится в миллиметрах и содержится в 11 бит ... или что-то в этом роде.

Как преобразовать эту битовую информацию в координаты реального мира, которые я могу использовать?

Заранее спасибо!

ответ

10

Это обслужены в Kinect для библиотеки Windows, используя класс Microsoft.Research.Kinect.Nui.SkeletonEngine, и следующий метод:

public Vector DepthImageToSkeleton (
    float depthX, 
    float depthY, 
    short depthValue 
) 

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

Оттуда (когда я создал сетку в прошлом), после перечисления массива байт в растровом изображении, созданных глубины изображения Kinect, создать новый список точки вектора похож на следующее:

 var width = image.Image.Width; 
     var height = image.Image.Height; 
     var greyIndex = 0; 

     var points = new List<Vector>(); 

     for (var y = 0; y < height; y++) 
     { 
      for (var x = 0; x < width; x++) 
      { 
       short depth; 
       switch (image.Type) 
       { 
        case ImageType.DepthAndPlayerIndex: 
         depth = (short)((image.Image.Bits[greyIndex] >> 3) | (image.Image.Bits[greyIndex + 1] << 5)); 
         if (depth <= maximumDepth) 
         { 
          points.Add(nui.SkeletonEngine.DepthImageToSkeleton(((float)x/image.Image.Width), ((float)y/image.Image.Height), (short)(depth << 3))); 
         } 
         break; 
        case ImageType.Depth: // depth comes back mirrored 
         depth = (short)((image.Image.Bits[greyIndex] | image.Image.Bits[greyIndex + 1] << 8)); 
         if (depth <= maximumDepth) 
         { 
          points.Add(nui.SkeletonEngine.DepthImageToSkeleton(((float)(width - x - 1)/image.Image.Width), ((float)y/image.Image.Height), (short)(depth << 3))); 
         } 
         break; 
       } 

       greyIndex += 2; 
      } 
     } 

Таким образом, конечным результатом является список векторов, хранящихся в миллиметрах, и если вы хотите, чтобы сантиметры умножали на 100 (и т.д.).

+0

Спасибо, Льюис! Это именно то, что я был после, хотя я до сих пор не понимаю бизнес битбифтинга, чтобы получить значение глубины. –

+1

Я считаю, что метод DepthImageToSkeleton был реорганизован в MapDepthToSkeletonPoint на объект KinectSensor –

+0

Только для записи: http://arena.openni.org/OpenNIArena/Applications/ViewApp.aspx?app_id=426 – EdgarT

Смежные вопросы