2012-11-12 40 views
1

我写了一个简单的kinect应用程序,我正在访问深度值以检测某些对象。我使用下面的代码来获取深度值如何获得在深度流中选择的ROI的RGB值

depth = NuiDepthPixelToDepth(pBufferRun); 

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

我不知道什么:

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

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

回答

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,例如,测试哪一个实际返回应该是琐碎)

+0

我不明白'NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution':这个函数只会返回相应深度框架的颜色框架的X/Y坐标。但我也想获得颜色信息。我如何获得?你有没有例子? – memyself

+0

@memyself那么,你可以直接从彩色图像获取RGB值,对吧?您可以使用RGB流上的NuiImageStreamGetNextFrame来获取颜色框,然后使用pFrameTexture-> LockRect来获取RGB缓冲区。它存储为一个正常的每像素32位XRGB图像 – Rook

+0

我明白如何抓取RGB缓冲区,但我不知道如何访问位置x,y处每个通道的像素值。 – memyself