1. 问题背景
之前需要开发一个点云操作可视化界面,使用open3d打开保存不同类型点云文件,但是操作asc文件时报错[Open3D WARNING] Read geometry::PointCloud failed: unknown file extension for C:/Users/dy_ec/Desktop/planeGUI/plane_filter.asc (format: auto).
2. 问题原因
open3d无法直接打开.asc文件
3. 问题解决
利用np.loadtxt()读取,然后再将numpy数组转换成.pcd格式,和其他格式统一进行后续处理
elif fileName_suffix == ".asc":
data = np.loadtxt(fileName_choose, delimiter=',', skiprows=1)
# numpy数组转pcd读取 统一格式
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(data[:, :3])
pcd.colors = o3d.utility.Vector3dVector(data[:, 3:6])
point_cloud = pcd
- 注意1:numpy数组读取列的格式(python中矩阵的取行列操作_python取矩阵的几行几列-CSDN博客)
-
注意2:np.loadtxt()的属性delimiter,需要根据实际的文件设置间隔符号,默认是空格。填写错误会报错ValueError: could not convert string to float:(python使用numpy模块报错ValueError: could not convert string to float:_numpy 读取数据valueerror: could not convert string-CSDN博客)
4. 后续问题
读取.asc格式的点云文件后不显示画面,一片空白也不报错。经过debug输出colors数值后发现原因。程序中先通过numpy数组读取.asc文件,后再转换成.pcd文件,最后通过open3d显示可视化。读取的numpy中的colors属性是原始数据,范围在[0,255],而open3d可视化读取的colors一般是在[0,1]区间。因此当读取后缀名为.asc文件时,将colors/255
- 直接读取的colors数值
- 能正常显示的colors数值
- 解决方法
参考链接:
[1]知乎文章