1 Open3D点云格式介绍
1.1 xyz
1.2 xyzn
1.3 xyzrgb
1.4 pts
1.5 ply
1.6 pcd
2 点云格式转换
2.1 读取点云数据
编辑
2.2 pcd转ply
2.3 pcd转xyz
2.4 pcd转xyzrgb
2.5 pcd转pts
1 Open3D点云格式介绍
1.1 xyz
每一行包含 [x y z] ,其中的x, y, z 是三维坐标,坐标之间以空格分隔。
1.2 xyzn
每一行包含[x, y, z, nx, ny, nz], 其中的nx,ny,nz是法向量
1.3 xyzrgb
每一行包含[x, y, z, r, g, b], 其中的r,g,b是范围在[0, 1]的float类型
1.4 pts
第一行为整数,表示点云中的点数。之后每行为点坐标及其属性,可以是[x, y, z, i, r, g, b],[x, y, z, r, g, b],[x, y, z, i]或者[x, y, z]格式,i代表反射强度intensity, 其中x、y、z、i为doublel类型,r、g、b是uint8类型 |
比较有特点的是,pts格式的点云,行与行之间以空白行分隔。
下面以[x, y, z, i, r, g, b]类型为例展示
1.5 ply
ply文件能够同时包含点云和网格数据,有binary和ASCII码两种编码类型。更多内容请查看 Polygon File Format,
二进制binary格式
ASCII码格式
1.6 pcd
pcd格式是PCL指定的点云格式,更多内容请查看 Point Cloud Data
同样的,pcd也有binary和ASCII码两种编码。
binary编码
ASCII编码
2 点云格式转换
open3d进行点云格式转换,不涉及数据格式 ,直接保存为想要的类型即可。下面以pcd点云转换为其他格式的点云为例,进行示范。
2.1 读取点云数据
import open3d as o3d import numpy as np print("->正在加载点云... ") pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\Armadillo\Armadillo.pcd") print(pcd) print("->正在可视化点云") o3d.visualization.draw_geometries([pcd])2.2 pcd转ply
import open3d as o3d print("->加载pcd点云...") pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.pcd") print(pcd) print("->正在可视化点云") o3d.visualization.draw_geometries([pcd]) print("\n->保存为binary类型的ply点云...") o3d.io.write_point_cloud("H:/HTempWK/temp/open3d/data/savebunnyBinary.ply", pcd) # 读取保存得二进制点云数据进行展示 pcd_from_file = o3d.io.read_point_cloud("H:/HTempWK/temp/open3d/data/savebunnyBinary.ply") print("->正在可视化保存的点云...") o3d.visualization.draw_geometries([pcd_from_file]) print("\n->保存为ASCII码类型的ply点云...") o3d.io.write_point_cloud("H:/HTempWK/temp/open3d/data/savebunnyASCII.ply", pcd, write_ascii = True) # 读取保存得ASCII码点云数据进行展示 pcd_from_file = o3d.io.read_point_cloud("H:/HTempWK/temp/open3d/data/savebunnyASCII.ply") print("->正在可视化保存的点云...") o3d.visualization.draw_geometries([pcd_from_file])2.3 pcd转xyz
import open3d as o3d print("->加载pcd点云...") pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.pcd") # 显示点云 o3d.visualization.draw_geometries([pcd]) print("\n->保存xyz点云...") o3d.io.write_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.xyz", pcd) print("->保存xyz点云完成") # 读取点云进行展示 pcd_from_file = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.xyz") o3d.visualization.draw_geometries([pcd_from_file])2.4 pcd转xyzrgb
import open3d as o3d import numpy as np pcd_path = r"H:\HTempWK\temp\open3d\pointdata\bunny.pcd" xyzrgb_path = r"H:\HTempWK\temp\open3d\pointdata\bunny.xyzrgb" pcd = o3d.io.read_point_cloud(pcd_path) points = np.asarray(pcd.points) z = points[:, 2] # 归一化到 0~1 z_norm = (z - z.min()) / (z.max() - z.min()) # 蓝 → 红 渐变 colors = np.zeros((len(points), 3)) colors[:, 0] = z_norm # R colors[:, 2] = 1 - z_norm # B pcd.colors = o3d.utility.Vector3dVector(colors) o3d.io.write_point_cloud(xyzrgb_path, pcd, write_ascii=True) pcd_from_file = o3d.io.read_point_cloud(xyzrgb_path) o3d.visualization.draw_geometries([pcd_from_file])2.5 pcd转pts
import open3d as o3d print("->加载pcd点云...") pcd = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.pcd") print(pcd) print("->正在可视化点云") o3d.visualization.draw_geometries([pcd]) print("\n->保存pts点云...") o3d.io.write_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.pts", pcd) # 读取pts数据进行展示 pcd_from_file = o3d.io.read_point_cloud(r"H:\HTempWK\temp\open3d\pointdata\bunny.pts") o3d.visualization.draw_geometries([pcd_from_file])