Open3D 读取、保存、显示点云

一、主要函数

1、读取点云

read_point_cloud(filename, format='auto', remove_nan_points=True, remove_infinite_points=True, print_progress=False)

  从文件读取点云。当用户不填写点云的扩展名时,会自动解码;若填写它尝试根据扩展名对文件进行解码。

  • filename:点云文件的路径
  • format:输入文件的格式。如果未指定或设置为“auto”,则从文件扩展名推断格式。默认参数为auto
  • remove_nan_points:默认参数为True,表示将从点云中删除包含NaN的所有点
  • remove_infinite_points:默认参数为True,表示将从点云中删除包含无限值的所有点
  • print_progress:默认参数为False,如果设置为True,则在控制台中可视化进度条

1、read_point_cloud用来读取点云数据。Open3D通过文件扩展名来解码文件。支持的扩展名是:pcd,ply,xyz,xyzrgb,xyzn,pts等。默认情况下,Open3D尝试通过文件扩展名推断文件类型。

2、保存点云

write_point_cloud(filename, pointcloud, write_ascii=False, compressed=False, print_progress=False)

 保存点云到本地文件夹

  • filename:点云文件的路径
  • pointcloud:待保存的点云
  • write_ascii:默认参数为False。设置为True则以ascii格式输出,否则将使用二进制格式
  • compressed:默认参数为False.设置为True则表示以压缩格式写入保存点云
  • print_progress:默认参数为False,如果设置为True,则在控制台中可视化进度条

3、显示点云

draw_geometries(window_name='Open3D', width=1920, height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face, *args, **kwargs)

 可视化点云。使用鼠标、触控板从不同的角度查看几何图形。按H键为GUI打印出键盘指令的完整列表。

  • window_name:可视化窗口的显示标题
  • width:可视化窗口的宽度
  • height:可视化窗口的高度
  • left:可视化窗口的左边距
  • top:可视化窗口的上边距
  • point_show_normal:如果设置为True,则可视化点法线
  • mesh_show_wireframe:如果设置为True,则可视化网格线框
  • mesh_show_back_face:可视化网格三角形的背面

4、Open3D支持的点云格式

格式 描述
xyz 每一行包含[x,y,z],其中x,y,z是三维坐标
xyzn 每一行包含[x,y,z,nx,ny,nz],其中x,y,z是三维坐标,nx,ny,nz是法向量
xyzrgb 每一行包含[x,y,z,r,g,b],其中x,y,z是三维坐标,r,g,b是颜色信息,取值范围是[0,1]
pts 第一行是表示点数的整数。随后的行遵循以下一种格式:[x,y,z,i,r,g,b],[x,y,z,r,g,b],[x,y,z,i]或[x,y,z],,其中x,y,z,idouble类型,r,g,bunint8类型
ply 见:多边形文件格式ply文件可同时包含点云和网格数据
pcd 见:点云数据

还可以读取指定文件类型,在这种情况下,文件扩展名将被忽略。

pcd = o3d.io.read_point_cloud("飞机.txt", format='xyz')

5、输出点云信息

  • print(pcd):可视化窗口的上边距
  • print(o3d.np.asarray(pcd.points)):输出点云中点的三维坐标

二、代码实现(包括读取txt格式)

1、读取常见点云

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("bunny.pcd")
print(pcd)#输出点云点的个数
print(np.asarray(pcd.points))#输出点的三维坐标
print('给所有的点上一个统一的颜色,颜色是在RGB空间得[0,1]范围内得值')
pcd.paint_uniform_color([0, 1, 0])
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
o3d.visualization.draw_geometries([pcd])

2、读取txt格式的点云

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("飞机.txt", format='xyz')
print(pcd)#输出点云点的个数
print(np.asarray(pcd.points))#输出点的三维坐标
print('给所有的点上一个统一的颜色,颜色是在RGB空间得[0,1]范围内得值')
pcd.paint_uniform_color([0, 1, 0])
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
o3d.visualization.draw_geometries([pcd])

三、结果展示

飞机为txt格式的点云数据

D:\python-3.8.2\python.exe E:/Python/Open3D.py
Format = auto
Extension = pcd
geometry::PointCloud with 35947 points.
[[ 2.4303460e+00  1.1378950e-01  4.4746702e-03]
 [ 2.4233880e+00  1.1290552e-01  1.9049700e-03]
 [ 2.3951631e+00  1.2848833e-01  3.7195299e-02]
 ...
 [ 2.3929720e+00  1.2721899e-01 -4.3458499e-02]
 [ 2.4302433e+00  1.4045967e-01 -3.5460801e-03]
 [ 2.4215605e+00  1.3802132e-01 -8.1668496e-03]]
给所有的点上一个统一的颜色,颜色是在RGB空间得[0,1]范围内得值

Process finished with exit code 0

四、可视化两个点云

【Open3d】使用open3d可视化

import open3d as o3d
#====================读取点云数据===================
source = o3d.io.read_point_cloud("路口1A.pcd")
target = o3d.io.read_point_cloud("路口2A.pcd")

#================可视化两个点云====================
def view_cloud(source, target):
    source.paint_uniform_color([1, 0, 0])
    target.paint_uniform_color([0, 1, 0])
    o3d.visualization.draw_geometries([source, target])
view_cloud(source, target)

五、给点云随机上色

import open3d as o3d
import numpy as np

pcd = o3d.io.read_point_cloud("Armadillo.ply")
pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1, (1,3)))
o3d.visualization.draw_geometries([pcd])

六、显示点云自身的颜色

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("tree1.pcd")
print(pcd)#输出点云点的个数
print(np.asarray(pcd.points))#输出点的三维坐标
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
o3d.visualization.draw_geometries([pcd],width=800,height=800)

版权声明:本文为CSDN博主「点云侠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36686437/article/details/106529415

posted @ 2023-06-29 10:33  成理随风  阅读(12070)  评论(2)    收藏  举报