如何将 RGB 深度图像转换为点云?

Posted

技术标签:

【中文标题】如何将 RGB 深度图像转换为点云?【英文标题】:How can I convert RGB depth image to Point Cloud? 【发布时间】:2019-02-18 13:20:10 【问题描述】:

我有一个关于机器人映射的研究想法。基本上,最终目标是使用适中的单目相机(售价 20-50 美元)并创建 3D 占用网格图(有一个用 c++ 编写的流行库,称为 Octomap)。为了做到这一点,我建议自己采取以下步骤:

    获取 rgb 图像(来自视频)并使用卷积神经网络转换为深度图像。这部分完成了。

    获取原始 rgb 图像和创建的深度图像并转换为点云。

    获取点云并将其转换为 3D 占用网格图。

所以对于第 2 步,我有点困惑,无论我做对还是错。我已经使用了这个代码,它是一个开源的:

import argparse
import sys
import os
from PIL import Image

focalLength = 938.0
centerX = 319.5
centerY = 239.5
scalingFactor = 5000

def generate_pointcloud(rgb_file,depth_file,ply_file):

    rgb = Image.open(rgb_file)
    depth = Image.open(depth_file).convert('I')

    if rgb.size != depth.size:
        raise Exception("Color and depth image do not have the same 
resolution.")
    if rgb.mode != "RGB":
        raise Exception("Color image is not in RGB format")
    if depth.mode != "I":
        raise Exception("Depth image is not in intensity format")


    points = []    
    for v in range(rgb.size[1]):
        for u in range(rgb.size[0]):
            color = rgb.getpixel((u,v))
            Z = depth.getpixel((u,v)) / scalingFactor
            print(Z)
            if Z==0: continue
            X = (u - centerX) * Z / focalLength
            Y = (v - centerY) * Z / focalLength
            points.append("%f %f %f %d %d %d 0\n"% 

我认为points 是实际存储点云的列表,对吗?

所以我要问的一个大问题是,使用深度学习算法创建 RGB 图像和深度图像是否可以使用上面的代码转换为点云?

【问题讨论】:

我想你应该没问题,只要你知道缩放因子和焦距。 【参考方案1】:

如果您能妥善处理 RGB 和深度图像比例,那就没问题了。您的最终点云属性可能类似于 (x,y,z,r,g,b)

【讨论】:

以上是关于如何将 RGB 深度图像转换为点云?的主要内容,如果未能解决你的问题,请参考以下文章

你好,问一下,现在你知道如何保存kinect的深度图像-并用pcl转化为点云pcd格式了吗

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

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

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

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

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