项目场景:
本来一个10w点的stl点云文件,用meshlab
,pyvista
,cloudcompare
等打开显示的都是10w点,用open3D
打开偏偏显示的是60w点
问题描述
本来一个10w点的stl点云文件,用meshlab
,pyvista
,cloudcompare
等打开显示的都是10w点,用open3D
打开偏偏显示的是60w点, 导致我跑网络时爆了显存。
使用open3D检查发现,60w里其他的都是重复点,合并重复点之后就还是10w点,但是合并之后保存成stl文件,再用open3D打开就又变成60w点了。
import open3d as o3d
def process_stl_file(file_path):
# 读取 STL 文件
mesh = o3d.io.read_triangle_mesh(file_path)
# 记录原始顶点数量
original_vertices = len(mesh.vertices)
# 合并重复顶点
mesh = mesh.remove_duplicated_vertices()
# 记录合并后的顶点数量
merged_vertices = len(mesh.vertices)
# 输出顶点数量变化
print(f"原始顶点数量:{original_vertices}")
print(f"合并后顶点数量:{merged_vertices}")
# 计算法线
mesh.compute_vertex_normals()
# 覆盖保存 STL 文件
o3d.io.write_triangle_mesh(file_path, mesh)
# 再次加载检查
mesh_reloaded = o3d.io.read_triangle_mesh(file_path)
print(f"重载后顶点数量:{len(mesh_reloaded.vertices)}")
# 再次处理重复顶点
mesh_reloaded = mesh_reloaded.remove_duplicated_vertices()
print(f"重载后(处理重复顶点)顶点数量:{len(mesh_reloaded.vertices)}")
# 调用处理函数
file_path = r"F:\scratch1\0.stl"
process_stl_file(file_path)
原因分析:
先说结论:stl文件没有问题,问题在open3d读取stl文件的逻辑上
STL 文件格式通常不包含顶点索引,而是将每个三角形的三个顶点直接存储。这意味着即使不同三角形共享相同的顶点,STL 文件中也会重复存储这些顶点。
当你从 STL 文件中读取网格时,Open3D 会将这些顶点重新加载,因此可能再次出现重复的顶点。
解决方案:
1.在跑网络时,用open3D读取stl后加入
mesh = mesh.remove_duplicated_vertices()
,就可以快速解决问题
2.将stl转化成ply文件,再用open3D读取