首页 文章

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

提问于
浏览
1

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

depth = NuiDepthPixelToDepth(pBufferRun);

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

我不确定的是什么:

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

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

  • 如何使用 NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution

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

1 回答

  • 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,例如 . 测试哪一个实际上正在返回应该是微不足道的)

相关问题