如何将 Kinect rgb 和深度图像转换为真实世界坐标 xyz?

How to Convert Kinect rgb and depth images to Real world coordinate xyz?

我最近正在使用 kinect 来查找一些标记的距离,所以我一直在将以像素为单位的 kinect rgb 和深度图像转换为所需的以米为单位的真实世界坐标 xyz。

请注意,在 Kinect SDK 1.8 (Kinect 1) 中,无法从 RGB 图像 space 转换为世界 space:只能从深度图像 space 转换为世界space。其他可能的转换是:

  • 深度 -> RGB
  • 世界 -> 深度
  • 世界 -> RGB

因此,要进行转换,您可以使用 SDK 中包含的坐标映射器(我假设您使用的是 Microsoft SDK 而不是 OpenNI、AS3NUI 或 EuphoriaNI)。这是关于如何从世界 space 转换为 RGB space 的示例,取自 here:

_sensor.CoordinateMapper.MapCameraPointToColorSpace(worldCoordinate);

此示例使用 C# for Kinect SDK 2.0。要查看 SDK 1.8 的另一个示例,以及关于坐标映射器使用的简短讨论,您可以查看这篇文章:Understanding Kinect Coordinate Mapping.

要从 RGB 图像 space 转换为世界坐标 space(仅适用于 Kinect 2 和 SDK 2.0),您可以使用 this method:

_sensor.CoordinateMapper.MapColorFrameToCameraSpace(depthFrame, resultArray);

您必须传递整个深度帧(不是彩色帧!!)和一个数组,其中它将 return 每个彩色帧像素的世界坐标。当然,这个数组必须足够大以包含所有点(最大分辨率下 1920 * 1080 = 2 073 600 个条目),然后使用一个简单的公式找到一个点的坐标:

worldCoordinate = resultArray[imageCoordinate.Y * rgbImageWidth + imageCoordinate.X];

您可以使用 MATLAB 计算机视觉系统工具箱中的 depthToPointCloud 函数。