0

我使用以下 c++ 代码从 kinect 中读取深度信息:

    BYTE * rgbrun = m_depthRGBX;
    const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;

    // end pixel is start + width*height - 1
    const USHORT * pBufferEnd = pBufferRun + (Width * Height);

    // process data for display in main window.
    while ( pBufferRun < pBufferEnd )
    {
        // discard the portion of the depth that contains only the player index
        USHORT depth = NuiDepthPixelToDepth(*pBufferRun);

        BYTE intensity = static_cast<BYTE>(depth % 256);


        // Write out blue byte
        *(rgbrun++) = intensity;

        // Write out green byte
        *(rgbrun++) = intensity;

        // Write out red byte
        *(rgbrun++) = intensity;

        ++rgbrun;

        ++pBufferRun;

    }

我想知道的是,实现帧翻转(水平和垂直)的最简单方法是什么?我在 kinect SDK 中找不到任何功能,但也许我错过了?

EDIT1我不想使用任何外部库,因此任何解释深度数据布局以及如何反转行/列的解决方案都受到高度赞赏。

4

1 回答 1

5

因此,您使用的是带有玩家数据的标准 16bpp 单通道深度图。这是一个很好的易于使用的格式。图像缓冲区按行排列,图像数据中的每个像素的低 3 位设置为玩家 ID,前 13 位设置为深度数据。

这是反向读取每一行的快速'n'dirty方法,并将其写入具有简单深度可视化的RGBWhatever图像,这对于查看您当前使用的包装输出会更好一些。

BYTE * rgbrun = m_depthRGBX;
const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;

for (unsigned int y = 0; y < Height; y++)
{
    for (unsigned int x = 0; x < Width; x++)
    {
        // shift off the player bits
        USHORT depthIn = pBufferRun[(y * Width) + (Width - 1 - x)] >> 3;

        // valid depth is (generally) in the range 0 to 4095.
        // here's a simple visualisation to do a greyscale mapping, with white
        // being closest. Set 0 (invalid pixel) to black.
        BYTE intensity = 
            depthIn == 0 || depthIn > 4095 ?
                0 : 255 - (BYTE)(((float)depthIn / 4095.0f) * 255.0f);

        *(rgbrun++) = intensity;
        *(rgbrun++) = intensity;
        *(rgbrun++) = intensity;
        ++rgbrun;
    }
}

未经测试的代码、E&OE 等 ;-)

如果不是使用单个rgbrun指针,而是获得指向当前行开头的指针并将输出写入该行,则可以并行化外循环。

于 2012-11-02T11:49:08.697 回答