c++ - 如何获取在深度流中选择的 ROI 的 RGB 值

标签 c++ kinect

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

depth = NuiDepthPixelToDepth(pBufferRun);

这将为我提供每个像素的深度值。现在我想子选择图像的一个区域,并获取该对应区域的 RGB 相机值。

我不确定的是:

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

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

最佳答案

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

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

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

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

  • 如何使用 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) ];

代表红色 channel 的字节应该在

lockedRect->pBits[ ((200 * width * 4) + (100 * 4) + 1 ];

这是标准的 32 位 RGB 图像格式,缓冲区可以自由地传递给您选择的图像处理库...GDI、WIC、OpenCV、IPL 等等。

(警告...我不完全确定我的像素字节顺序是否正确。我认为它是 XRGB,但它可能是 XBGR 或 BGRX,例如。实际返回的测试应该是微不足道的)

关于c++ - 如何获取在深度流中选择的 ROI 的 RGB 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13346128/

相关文章:

c# - WPF 中的自定义鼠标光标大小

c++ - 您推荐哪些线程分析工具?

c++ - 在 C++ 中如何将方法指定为析构函数而不是构造函数?

c++ - sig_atomic_t 和 std::atomic<> 可以互换吗?

c# - 找不到类型或命名空间名称,C# 初学者

c - C 语言(也称为非 C++)的 Kinect 和 OpenNI 示例代码

c++ - 设置来自系统 ("command"的变量) (C++)

c++ - QInputDialog 操作取决于 ComboBox 中的项目选择

python - 如何在 ubuntu 中将 xBox kinect 连接到 opencv?

opencv - Kinect 2 失败 'AcquireLatestFrame'