如何将 Kinect 2.0 的深度数据转换为距离值?

How to convert the depth data from a Kinect 2.0 to a distance value?

我想利用 Kinect 2.0 SDK 的深度传感器,但不是以图像格式绘制或显示此数据,而是以整数或类似的格式。举个例子,如果我的手非常靠近 Kinect,我会得到一个整数值,告诉我相机和障碍物之间的大致距离。 也许是这样的。当障碍物移动时,Kinect 会重新计算距离并可能每隔一秒或半秒更新一次。

The distance between the kinect and the obstacle is 20 cm
The distance between the kinect and the obstacle is 10 cm 
The distance between the kinect and the obstacle is 100 cm

这可能吗? 我搜索了教程,但我能找到的是表示通常使用点云或黑白深度图像。

这很简单。我不知道 C++ 中的确切代码,但在 C# 中,一旦你有了深度框架,你需要执行以下操作: 我假设您已经知道要评估深度值的 Y 和 X 点。

一旦你知道了,你需要先将深度帧的每个字节转换成ushort。

之后,您需要计算与您的X和Y点对应的depthPixels内的索引。通常这是使用的方程式:

// Get the depth for this pixel
ushort depth = frameData[y * depthFrameDescription.Height + x];

希望对您有所帮助。

Kinect 确实使用了点云。并且点云中的每个像素都有一个无符号短整数值,表示与 Kinect 的距离(以毫米为单位)。据我所知,相机已经能够补偿或物体在其视野的两侧比前面更远,所以所有数据都代表这些物体远离 Kinects 相机正在观察的平面的深度。 Kinect 最多可以查看大约 8m,但只有 4-5m 之间的可靠数据,并且看不到任何小于 0.5m 的东西。 因为这听起来像是您将它用作障碍物检测系统,所以我建议监控点云中的所有数据点,并对与其他数据点分开的分组数据点进行平均,并将它们解释为距离近似距离的自己的对象。 Kinect 还以每秒 30 帧的速度更新(假设您的硬件可以处理密集的数据流)。因此,您只需不断地监控点云以了解物体距离的变化。

如果您首先下载 SDK 和 Kinect Studio,您可以使用 depth/IR 编程示例和工作室来更好地了解如何使用数据。

虽然这个问题已经被问了一段时间,而且提问的人很可能自己解决了这个问题,但我只是想给其他可能有同样问题/问题的人提供解决这个问题的 C++ 代码。

注意:该解决方案基于 Kinect 2.0 SDK,如果我没记错的话,我是从 SDK Browser 2.0 中提供的示例之一获取的,它随 Kinect 2.0 SDK 一起提供。我删除了我所做的所有特殊修改,只留下了最重要的方面(因此,您很可能必须修改 void 并给它一个 return 某种参数)。

m_pDepthFrameReader 已初始化 IDepthFrameReader*

void KinectFusionProcessor::getDistance() {
IDepthFrame* frame = NULL;
if (SUCCEEDED(m_pDepthFrameReader->AcquireLatestFrame(&frame))) {
    int width = 512;
    int height = 424;
    unsigned int sz=(512*424);
    unsigned short buf[525 * 424] = {0};
    frame->CopyFrameDataToArray(sz,buf);

    const unsigned short* curr = (const unsigned short*)buf;
    const unsigned short* dataEnd = curr + (width*height);

    while (curr < dataEnd) {
        // Get depth in millimeters
        unsigned short depth = (*curr++);
    }
}
if (frame) frame->Release();
}