我写了一个简单的kinect应用程序,我正在访问深度值来检测一些对象 . 我使用以下代码来获取深度值
depth = NuiDepthPixelToDepth(pBufferRun);
这将给出每个像素的深度值 . 现在我想要选择图像的一个区域,并获得该相应区域的RGB相机值 .
我不确定的是什么:
-
我需要打开彩色图像流吗?
-
或仅仅将深度转换为颜色就足够了?
-
如何使用
NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution
?
我对最简单的解决方案很好,我有一个深度框架和一个颜色框架,这样我就可以用opencv选择ROI,然后相应地裁剪颜色框架 .
1 回答
是 . 您可以在不打开流的情况下获取颜色框架中的坐标,但是您将无法对它们执行任何有用的操作,因为您没有要索引的颜色数据!
没有有意义的距离转换为颜色 . 您需要两个图像流和一个坐标转换功能 .
这是一个非常有记录的功能 . 再看看NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution,因为函数参数和文档实际上是有意义的!深度值和深度(x,y)坐标,RGB(x,y)坐标输出 . 简单 .
要在某些给定坐标处获取RGB数据,必须首先使用
NuiImageStreamGetNextFrame
获取RGB帧以获取INuiFrameTexture
实例 . 在此调用LockRect
以获得NUI_LOCKED_RECT
. 此对象的pBits
属性是指向原始XRGB图像的第一个像素的指针 . 该图像按行从上到下依次存储,每个像素由4个连续字节表示,表示填充字节,然后是R,G和B .因此
(100, 200)
位置的像素为并且表示红色通道的字节应为
这是一种标准的32位RGB图像格式,缓冲区可以自由传递到您选择的图像处理库... GDI,WIC,OpenCV,IPL等等 .
(告诫......我不完全确定我的像素字节顺序正确 . 我认为它是XRGB,但它可能是XBGR或BGRX,例如 . 测试哪一个实际上正在返回应该是微不足道的)