【点云处理技术之open3d】第一篇:open3d的快速安装、简介、文件的读写和可视化操作

文章目录

  • 1. open3d简介、安装与测试
  • 2. 读写点云数据并可视化
  • 3. 读写网格(mesh)数据并可视化
  • 4. 读写图像(rgbd)数据并可视化
  • 1. open3d简介、安装与测试

    Open3D是一个开源库,支持快速开发和处理3D数据。Open3D在c++和Python中公开了一组精心选择的数据结构和算法。后端是高度优化的,并且是为并行化而设置的。Open3D的核心功能包括:

  • 3D 数据结构
  • 3D 数据处理算法
  • 场景重建
  • 表面对齐
  • 3D 可视化
  • 基于物理渲染 (PBR)
  • 支持使用 PyTorch 和 TensorFlow 的 3D 机器学习
  • 内核 3D 操作的 GPU 加速
  • 在C ++ 和 Python 中可用
  • 安装
  • python版本的open3d安装很简单,直接执行下列命令即可(使用了镜像安装)

    pip3 install open3d -i https://pypi.tuna.tsinghua.edu.cn/simple
    
  • 测试
  • 直接运行下列命令测试是否安装成功,如果没有报错,则安装成功!

    python -c "import open3d as o3d; print(o3d)"
    

    2. 读写点云数据并可视化

    open3d可以通过文件扩展名自动推断文件类型,下面是支持的点云文件类型。

    Format Description
    xyz 每一行包括 [x,y,z] 三个值,x,y,z 是三维坐标
    xyzn 每一行包括 [x,y,z,nx,ny,nz] 六个值,其中nx,ny,nz 是法线
    xyzrgb 每一行包括 [x,y,z,r,g,b] 六个值,这里r,g,b的范围在[0,1]的浮点数
    pts 第一行是一个整数,表示点的个数,之后的每一行可以是下列格式之一:[x, y, z, i, r, g, b], [x, y, z, r, g, b], [x, y, z, i] or [x, y, z],其中x,y,z和i是double类型,r,g,b是uint8类型。
    ply 这个格式可以包含点云和网格数据,可以参考链接
    pcd Point Cloud Data

    也可以显示的指定文件类型,这样将会忽略文件扩展名。

    #忽略.txt格式,读取的格式为xyz
    pcd =o3d.io.read_point_cloud("../../my_points.txt",format='xyz')
    

    下列代码功能:读取一个pcd文件,并显示,同时将读取的pcd文件进行写入,生成copy_of_fragment.pcd文件。

    import open3d as o3d
    
    pcd = o3d.io.read_point_cloud("../test_data/fragment.pcd") # 读取pcd文件
    
    print(pcd) #只是简单的打印信息:PointCloud with 113662 points.
    
    #显示,zoom等信息是一些可选项
    o3d.visualization.draw_geometries([pcd])
    # o3d.visualization.draw_geometries([pcd], zoom=0.3412,
    #                                   front=[0.4257, -0.2125, -0.8795],
    #                                   lookat=[2.6172, 2.0475, 1.532],
    #                                   up=[-0.0694, -0.9768, 0.2024])
    
    # 在同级目录下写入 copy_of_fragment.pcd文件
    o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
    

    显示效果:

    3. 读写网格(mesh)数据并可视化

    与点云的数据结构相比,网格(mesh)数据具有定义三维曲面的三角形。默认情况下,Open3D尝试通过文件扩展名推断文件类型。支持以下网格文件类型:

    格式 描述
    ply 同点云
    stl 请查看链接
    obj 请查看链接
    off 请查看链接
    gltf 请查看链接

    代码举例:

    import open3d as o3d
    
    mesh = o3d.io.read_triangle_mesh("../test_data/knot.ply")
    print(mesh) #打印简单的信息:TriangleMesh with 1440 points and 2880 triangles.
    
    # 写入(这里是复制)一份新数据
    o3d.io.write_triangle_mesh("copy_of_knot.ply", mesh)
    
    #显示
    o3d.visualization.draw_geometries([mesh])
    

    输出显示效果:

    4. 读写图像(rgbd)数据并可视化

    下面的程序先读入jpg的普通图片和png的深度图片,然后合成rgbd的深度图像。

    import open3d as o3d
    
    color_raw = o3d.io.read_image("../test_data/RGBD/color/00000.jpg")
    depth_raw = o3d.io.read_image("../test_data/RGBD/depth/00000.png")
    #创建一个rgbd图像
    rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(
        color_raw, depth_raw)
    print(rgbd_image)
    
    #使用matplotlib显示图像
    import matplotlib.pyplot as plt
    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)
    plt.show()
    
    #rgbd 转==》pcd ,并显示
    pcd = o3d.geometry.PointCloud.create_from_rgbd_image(
        rgbd_image,
        o3d.camera.PinholeCameraIntrinsic(
            o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault))
    # Flip it, otherwise the pointcloud will be upside down
    pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]])
    o3d.visualization.draw_geometries([pcd])
    
    
    # image的读取与写入
    
    img = o3d.io.read_image("../test_data/lena_color.jpg")
    print(img)
    '''
    输出:
    Image of size 512x512, with 3 channels.
    Use numpy.asarray to access buffer data.
    '''
    # 写入(这里是拷贝)一份新的image数据
    o3d.io.write_image("copy_of_lena_color.jpg", img)
    

    输出:

    RGBDImage of size 
    Color image : 640x480, with 1 channels.
    Depth image : 640x480, with 1 channels.
    Use numpy.asarray to access buffer data.
    

    matplotlib显示图像效果:

    RGBD转PCD显示效果:

    来源:非晚非晚

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【点云处理技术之open3d】第一篇:open3d的快速安装、简介、文件的读写和可视化操作

    发表回复