2015-11-10 1 views
2

В настоящее время мы отслеживаем объект в окне с помощью Kinect, и теперь нам нужно получить 3D вместо «2D» координат. В принципе, нам нужно значение глубины, полученное LockedRect.pBits в одной точке.OpenGL + Kinect SDK - как получить значение глубины из одного пикселя?

Наши текущие доходы произвольного кода 0 и тому подобное, но здесь это:

void getDepthData(GLubyte* dest) { 


    NUI_IMAGE_FRAME imageFrame; 
    NUI_LOCKED_RECT LockedRect; 
    if (sensor->NuiImageStreamGetNextFrame(depthStream, 0, &imageFrame) < 0) return; 
    INuiFrameTexture* texture = imageFrame.pFrameTexture; 
    texture->LockRect(0, &LockedRect, NULL, 0); 
    if (LockedRect.Pitch != 0) { 
      const USHORT* curr = (const USHORT*)LockedRect.pBits; 
      cout << curr; 
      const USHORT* dataEnd = curr + (width*height); 

      while (curr < dataEnd) { 
        // Get depth in millimeters 
        USHORT depth = NuiDepthPixelToDepth(*curr++); 

        // Draw a grayscale image of the depth: 
        // B,G,R are all set to depth%256, alpha set to 1. 
        for (int i = 0; i < 3; ++i) 
          *dest++ = (BYTE)depth % 256; 
        *dest++ = 0xff; 
      } 

    } 
    texture->UnlockRect(0); 
    sensor->NuiImageStreamReleaseFrame(depthStream, &imageFrame); 

}

ответ

2

Мы нашли решение! Кому-то интересно это самое; pBits - это минимальное значение в формате USHORT, и вы хотите найти x-й пиксель после него. Изображая его в матрице, вы хотите найти глубину, например. 2 строки вниз и 3 столбца справа от pBits в матрице 5 * 4, что дает вам pBits + 2 * width + 3 = 13-е место после pBits (это помогает визуализация на бумаге).

void getDepthData(RotatedRect trackBox, GLubyte* dest) { 

NUI_IMAGE_FRAME imageFrame; 
NUI_LOCKED_RECT LockedRect; 
if (sensor->NuiImageStreamGetNextFrame(depthStream, 0, &imageFrame) < 0) return; 
INuiFrameTexture* texture = imageFrame.pFrameTexture; 
texture->LockRect(0, &LockedRect, NULL, 0); 
if (LockedRect.Pitch != 0) { 
    USHORT* curr = (USHORT*)(LockedRect.pBits); 
    curr = curr + (USHORT)trackBox.center.y * width + (USHORT)trackBox.center.x; 

     // Get depth in millimeters 
     USHORT depth = NuiDepthPixelToDepth(*curr); 

     cout << depth << "\n"; 

} 
texture->UnlockRect(0); 
sensor->NuiImageStreamReleaseFrame(depthStream, &imageFrame); 

кроме нашего делает secrifice довольно код 1*width+1 различие, которое не является проблемой на 40+ см расстоянии.