如何获得深度流中选择的ROI的RGB值

时间:2012-11-12 15:06:34

标签: c++ kinect

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

depth = NuiDepthPixelToDepth(pBufferRun);

这将给出每个像素的深度值。现在我想要选择图像的一个区域,并获得该相应区域的RGB相机值。

我不确定:

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

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

1 个答案:

答案 0 :(得分:2)

  • 我是否需要打开彩色图像流?

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

  • 或仅仅将深度转换为颜色就足够了吗?

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

  • 如何使用NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution?

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

要在某些给定坐标处获取RGB数据,必须首先使用NuiImageStreamGetNextFrame获取RGB帧以获取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,例如。测试哪一个实际上被返回应该是微不足道的)