1

我编写了一个简单的 kinect 应用程序,我在其中访问深度值以检测一些对象。我使用以下代码来获取深度值

depth = NuiDepthPixelToDepth(pBufferRun);

这会给我每个像素的深度值。现在我想选择图像的一个区域,并获取这个对应区域的 RGB 相机值。

我不确定的是:

  • 我需要打开彩色图像流吗?
  • 还是仅将深度转换为颜色就足够了?
  • 我该如何使用NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution

我对最简单的解决方案很好,我有一个深度框架和一个颜色框架,这样我就可以使用 opencv 选择一个 ROI,然后相应地裁剪颜色框架。

4

1 回答 1

2
  • 我需要打开彩色图像流吗?

是的。您可以在不打开流的情况下获取颜色框架中的坐标,但是您将无法对它们做任何有用的事情,因为您将没有颜色数据可以索引!

  • 还是仅将深度转换为颜色就足够了?

没有将距离有意义地转换为颜色。您需要两个图像流和一个坐标转换函数。

  • 如何使用 NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution?

这是一个非常有记录的功能。去看看NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution,因为函数参数和文档实际上是有意义的!深度值和深度 (x,y) 坐标输入,RGB (x,y) 坐标输出。简单的。

要获取某个给定坐标的 RGB 数据,您必须首先获取一个 RGB 帧,NuiImageStreamGetNextFrame用于获取INuiFrameTexture实例。调用LockRect它以获得NUI_LOCKED_RECT. 该pBits对象的属性是指向原始 XRGB 图像的第一个像素的指针。该图像以从上到下从左到右的顺序逐行存储,每个像素由 4 个连续字节表示,表示一个填充字节,然后是 R、G 和 B。

(100, 200)因此,位置处的像素位于

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) ];

并且代表红色通道的字节应该在

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) + 1 ];

这是一种标准的 32 位 RGB 图像格式,缓冲区可以自由地传递给您选择的图像处理库...... GDI、WIC、OpenCV、IPL 等等。

(警告......我不完全确定我的像素字节排序是否正确。我认为它是 XRGB,但它可能是 XBGR 或 BGRX,例如。测试实际返回的应该是微不足道的)

于 2012-11-12T15:56:25.863 回答