首页 > 解决方案 > 如何从深度图像和 RGB 图像生成点云?

问题描述

如何从深度或 rgb 图像生成点云?

例子:

https://i.imgur.com/LFPgbpk.jpg https://i.stack.imgur.com/YvlW0.jpg

我需要从该深度或 rgb 图像生成点云,但我找不到相应的代码。

我设法在 3js 中找到了一个,但我无法导出它,如果我可以通过深度和 rgb 的图像生成点云,有人可以帮助我吗?

标签: point-cloud-librarypoint-clouds

解决方案


你可以看看 PCL 库是如何使用 OpenNI 2 抓取模块的:这个模块负责处理来自 OpenNI 兼容设备(例如 Kinect)的 RGB/深度图像。另一个例子是来自 ROS 的 depth2cloud。让我们集中讨论前一个例子。

首先,它获取相机的内在参数。这通常通过校准离线完成,或者您可能已经知道相机的参数。

  float constant_x = 1.0f / device_->getDepthFocalLength ();
  float constant_y = 1.0f / device_->getDepthFocalLength ();
  float centerX = ((float)cloud->width - 1.f) / 2.f;
  float centerY = ((float)cloud->height - 1.f) / 2.f;

然后,经过一系列有效性检查并创建适当大小的缓冲区,它为每个点设置 3d 坐标:

  pt.z = depth_map[depth_idx] * 0.001f;
  pt.x = (static_cast<float> (u) - centerX) * pt.z * constant_x;
  pt.y = (static_cast<float> (v) - centerY) * pt.z * constant_y;

从原始代码可以看出,它遍历深度图像的所有像素,然后使用相机参数将它们投影到 3d 空间中。

类似的推理适用于该convertToXYZRGBPointCloud函数,该函数还负责在该点上设置正确的 RGB 颜色值。


推荐阅读