我写了一个简单的kinect应用程序,我正在访问深度值以检测某些对象。我使用以下代码来获取深度值
depth = NuiDepthPixelToDepth(pBufferRun);
这将给出每个像素的深度值。现在我想要选择图像的一个区域,并获得该相应区域的RGB相机值。
我不确定:
NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution
?我对最简单的解决方案很好,我有一个深度框架和一个颜色框架,这样我就可以用opencv选择ROI,然后相应地裁剪颜色框架。
答案 0 :(得分:2)
是。您可以在不打开流的情况下获取颜色框中的坐标,但是您将无法对它们执行任何有用的操作,因为您没有要索引的颜色数据!
没有有意义的距离转换为颜色。您需要两个图像流和一个坐标转换函数。
这是一个非常有记录的功能。转而看看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,例如。测试哪一个实际上被返回应该是微不足道的)