该问题主要是open3d保存的ply数据用pcl读取不了,因为open3d的xyz属性一个是double,而pcl是float
方案一:Open3D自带方案
pc = o3d.t.geometry.PointCloud(o3d.core.Tensor(pcd_xyz, dtype=o3d.core.float32))
o3d.t.io.write_point_cloud("output_path.ply", pc, write_ascii=True)
然而该方案并没找到同时如何设置法向的方法。
方案二:借助trimesh库
# cloud_xyz: Nx3的点云坐标信息
# cloud_nrm: Nx3的点云法向信息
def save_ply_in_compatibility_mode(opath, cloud_xyz, cloud_nrm):
mesh = trimesh.Trimesh(vertices=np.asarray(cloud_xyz), vertex_normals=np.asarray(cloud_nrm) )
mesh.export(opath, file_type="ply")
优点是可以同时设置坐标和法向。