如何从 rgb 和深度图像创建点云?

Posted

技术标签:

【中文标题】如何从 rgb 和深度图像创建点云?【英文标题】:How to create point cloud from rgb & depth images? 【发布时间】:2019-05-08 08:26:24 【问题描述】:

对于我目前正在从事的一个大学项目,我必须通过从this 数据集中读取图像来创建点云。这些基本上是视频帧,每一帧都有一个 rgb 图像和相应的深度图像。

我熟悉公式z = f*b/d,但是我无法弄清楚应该如何解释数据。没有提供有关用于拍摄视频的相机的信息,并且该项目还声明了以下内容:

"考虑摄像机的水平/垂直视野 48.6/62 度数”

我在计算机视觉方面几乎没有经验,而且我以前从未遇到过使用 2 个视野的情况。假设我按原样使用图像的深度(对于 z 坐标),我将如何计算点云中每个点的 x 和 y 坐标?

以下是数据集的示例:

【问题讨论】:

【参考方案1】:

是的,指定多个视野是不常见的。给定一个典型的相机(方形像素,最小失真,通过图像中心的视图矢量),通常只给出一个视场角 - 水平或垂直 - 因为另一个可以从图像纵横比得出。

在这里指定水平角度 48.6 度和垂直角度 62 度特别令人惊讶,因为图像是横向视图,我希望水平角度大于垂直角度。我很确定这是一个错字: 交换时,tan(62 * pi / 360) / tan(48.6 * pi / 360) 的比率是您期望的640 / 480 纵横比,给定图像尺寸和方形像素。

无论如何,t 的水平角基本上是说图像的水平范围,从左边缘到右边缘,覆盖了视野的弧度t,所以像素在右边缘的中心位于从中心视图光线向右旋转t / 2 弧度的光线上。这条“右手”光线从原点处的眼睛穿过(tan(t / 2), 0, -1) 点(假设右手空间,正 x 指向右侧,正 y 指向上方,向下看负 z 轴)。要在距离眼睛d 处获得空间中的点,您只需沿这条射线归一化一个向量,然后乘以d。假设样本线性分布在平面传感器上,我希望对于(x, y) 处的给定像素,您可以计算其对应的射线点:

    p = (dx * tan(hfov / 2), dy * tan(vfov / 2), -1)

其中dx2 * (x - width / 2) / widthdy2 * (y - height / 2) / heighthfovvfov 是以弧度为单位的视场角。

请注意,样本数据随附的documentation 链接到Matlab file,该Matlab file 显示了将深度图像转换为点云和距离场的推荐过程。在其中,视野与图像尺寸一起烘焙到恒定因子 570.3,可用于恢复作者认为他们的记录设备具有的视野角度:

    atan(320 / 570.3) * (360 / pi / 2) * 2 = 58.6

这确实非常接近你给出的 62 度。

从 Matlab 代码看来,图像中的值不是从给定点到眼睛的距离,而是沿视图矢量到包含给定点的垂直平面的距离(“深度”,或者基本上是“ z"),所以作者可以直接将它与向量(dx * tan(hfov / 2), dy * tan(vfov / 2), -1) 相乘,得到空间中的点,跳过前面提到的标准化步骤。

【讨论】:

谢谢!是的,这确实是一个错字,很好地弄清楚了。我有 matlab 代码,但我不想使用它,因为我看不懂它。现在我更舒服了:)

以上是关于如何从 rgb 和深度图像创建点云?的主要内容,如果未能解决你的问题,请参考以下文章

如何从点云创建深度图像

基于Python深度图生成3D点云

2将图像转换为点云

论文解读F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测

论文解读F-PointNet 使用RGB图像和Depth点云深度 数据的3D目标检测

论文解读 | F-PointNet, 使用RGB图像和Depth点云深度, 数据的3D目标检测