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,i是double类型,r,g,b是unint8类型 |
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
四、可视化两个点云
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
浙公网安备 33010602011771号