3D机器学习(12):Open3D学习笔记:RGBD图像转化为点云、点云的体素化

Open3D学习笔记:将4通道RGBD图像转换为双通道的灰度深度图,并将其用照相机转化为点云。点云的体素化

 

1、将4通道RGBD图像转换为双通道的灰度深度图

Redwood格式=深度图+RGB图,其中深度信息存储在16-bit的单通道图像中。整数值表示以毫米为单位的深度测量值。

  print("Read Redwood dataset")

    color_raw = o3d.io.read_image("../../TestData/RGBD/color/00000.jpg")3通道

depth_raw = o3d.io.read_image("../../TestData/RGBD/depth/00000.png")1通道

Open3D默认转换功能为:从一对彩色和深度图像创建一个RGBDImage。即彩色图像被转换为​​灰度图像,存储float在[0,1]范围内。深度图像存储在另一个float中,以米为单位表示深度值。

RGBDImage of size
Color image : 640x480, with 1 channels.
Depth image : 640x480, with 1 channels.

最后把转换后的两张单通道图画出来,这里没有用黑白,而用的是黄蓝,仅仅是因为好看。结果如下图:

plt.subplot(1, 2, 1)                 第一张位置
    plt.title('Redwood grayscale image')   第一张名字
    plt.imshow(rgbd_image.color)
    plt.subplot(1, 2, 2)               第二张位置
    plt.title('Redwood depth image')   第二张名字
    plt.imshow(rgbd_image.depth)

3D机器学习(12):Open3D学习笔记:RGBD图像转化为点云、点云的体素化_第1张图片

 

2、给定一组相机参数,可以将RGBD图像转换为点云。

使用函数 o3d.geometry.PointCloud.create_from_rgbd_image()将RGBD图像转化为点云,在这里,我们使用PinholeCameraIntrinsicParameters.PrimeSenseDefault默认的相机参数。它的图像分辨率为640x480,焦距(fx,fy)=(525.0,525.0),光学中心(cx,cy)=(319.5,239.5)。结果如下图。

pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
        rgbd_image,
        o3d.camera.PinholeCameraIntrinsic(
            o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))

记得翻转它,否则则是倒着的点云

    pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])

    o3d.visualization.draw_geometries([pcd])

3D机器学习(12):Open3D学习笔记:RGBD图像转化为点云、点云的体素化_第2张图片

读取相机固有的参数

pinhole_camera_intrinsic = o3d.io.read_pinhole_camera_intrinsic(

        "../../TestData/camera_primesense.json")

    print(pinhole_camera_intrinsic.intrinsic_matrix)

这样就产生了相机的矩阵参数:

[[ 525.     0.   319.5]

 [   0.   525.   239.5]

 [   0.     0.     1. ]]

RGBD摄像机?

 

3、点云的体素化(包含下采样)

体素下采样使用常规体素网格从输入点云创建统一下采样的点云。它通常用作许多点云处理任务的预处理步骤。该算法分为两个步骤:

-点被存储到体素中。

-每个占用的体素通过平均内部的所有点来生成精确的一个点。

这里直接采用函数pcd.voxel_down_sample(voxel_size=0.05),将pcd点云格式转化为体素格式,并且以0.05米的单位进行下采样。

    print("Downsample the point cloud with a voxel of 0.05")

    downpcd = pcd.voxel_down_sample(voxel_size=0.05)

    o3d.visualization.draw_geometries([downpcd])

下图展示了下采样后的结果:

3D机器学习(12):Open3D学习笔记:RGBD图像转化为点云、点云的体素化_第3张图片

你可能感兴趣的:(3D机器学习(12):Open3D学习笔记:RGBD图像转化为点云、点云的体素化)