python, laspy, open3d, 激光点云,laspy转open3d
https://blog.csdn.net/cxcjoker7894/article/details/135870984
open3d不能直接读取.las文件,可以使用laspy做中转,用laspy读出来点,着色,强度等等信息,写入open3d中,再用open3d实现可视化。
先上最后正确的代码:
import numpy as np
import laspy
import open3d as o3d
point_cloud_path = '2F.las'
las = laspy.read(point_cloud_path)
# 写入点
point_data = np.stack([las.x, las.y, las.z], axis=0).transpose((1, 0))
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(point_data)
# 写入着色
if las.red.max() >= 256: las.red >>= 8
if las.green.max() >= 256: las.green >>= 8
if las.blue.max() >= 256: las.blue >>= 8
colors = np.stack([las.red*256/65535, las.green*256/65535, las.blue*256/65535], axis=0).transpose((1, 0))
pcd.colors = o3d.utility.Vector3dVector(colors)
# 测试可视化
o3d.visualization.draw_geometries([pcd])
过程中要注意两个易踩的坑:
一个是取las点坐标时是小写的xyz,如果写成大写,会发现laspy取出的坐标偏大, X = (x - x_offset) / x_scale,而point_format中并未提供小写选项。
一个是着色rgb值位数,需要转换。