如何从深度图像和RGB图像生成点云?

问题描述

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

示例:

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

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

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

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

解决方法

您可以看看PCL库如何做到这一点,using the OpenNI 2 grabber module:此模块负责处理来自OpenNI兼容设备(例如Kinect)的RGB /深度图像。另一个示例是depth2cloud from ROS。让我们集中前面的例子。

首先,它得到intrinsic camera parameters。通常,这是通过校准离线进行的,或者您可能已经知道相机的参数。

  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;

然后,在进行大量有效性检查并创建适当大小的缓冲区后,将其sets the 3d coordinates用于每个点:

  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颜色值。