news 2026/4/17 16:09:27

第四课Open3D点云数据处理:读写网格模型(mesh)与格式转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第四课Open3D点云数据处理:读写网格模型(mesh)与格式转换

1 mesh 加载函数

1.1 函数原型

1.2 参数说明

1.3代码展示

​编辑

1.4 判断mesh文件是否读取成功

2 mesh 保存函数

2.1 函数原型

2.2 参数说明

2.3 代码示例

2.4 Open3D支持的mesh类型

3 mesh 格式转换

3.1 ply 转 obj

3.2 ply 转 stl

3.3 ply 转 off

3.4 ply 转 gltf

1 mesh 加载函数

1.1 函数原型

read_triangle_mesh(filename: str, enable_post_processing: bool = False, print_progress: bool = False)

1.2 参数说明

  • filename,要可视化mesh的的路径和文件名。必选参数

当调用read_triangle_mesh函数时,需要将要读取的文件的路径和文件名作为filename参数传递给该函数。函数将解析该文件并将其转换为Open3D中的三角网格数据结构,该数据结构包含三角形的顶点和面片信息。通过这种方式,可以方便地使用Open3D库对三角网格进行可视化、处理、分析等操作。

  • enable_post_processing参数是用于控制是否启用后处理的选项。可选参数

在读取三角网格时,Open3D会对其进行一些后处理操作,包括去除重复的顶点和边缘,移除无用的顶点和边缘,以及重新计算法线等。这些后处理操作可以优化三角网格,使其更加紧凑和高效。当 enable_post_processing 参数设置为 True 时,将启用这些后处理操作;当设置为 False 时,则不启用。默认情况下,该参数被设置为 False。

  • print_progress参数用于控制是否在读取模型时输出读取进度信息。可选参数

默认情况下,该参数为False,不会在读取过程中输出进度信息,如果将其设置为True,则会输出进度信息。
如果读取的模型较大,可能需要一些时间来完成读取,因此在读取过程中输出进度信息对于了解读取进展情况非常有用。但是,在某些情况下,例如只需要读取一个非常小的模型时,输出进度信息可能会显得多余,所以可以通过设置该参数来控制输出行为。

1.3代码展示

import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) o3d.visualization.draw_geometries([mesh],window_name='把门开开',mesh_show_wireframe=False)

1.4 判断mesh文件是否读取成功

使用is_empty()函数判断

  • True:未读取到mesh文件
  • False:成功读取mesh文件
import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) o3d.visualization.draw_geometries([mesh],window_name='把门开开',mesh_show_wireframe=False)

2 mesh 保存函数

2.1 函数原型

write_triangle_mesh(filename:str,mesh:open3d.cpu.pybind.geometry.TriangleMesh,write_ascii:bool=False,compressed:bool=False,write_vertex_normals:bool=True,write_vertex_colors:bool=True,write_triangle_uvs:bool=True,print_progress:bool=False)

2.2 参数说明

  • filename必选参数,要保存的文件的路径和名称。
  • mesh必选参数,要保存的 TriangleMesh 对象。
  • write_ascii可选参数,默认为 False,表示是否将数据以 ASCII 格式写入文件。如果设置为 True,则数据将以可读的文本形式写入文件,否则以二进制形式(binary)写入文件。
  • compressed可选参数,默认为 False,表示是否将数据压缩写入文件。如果设置为 True,则写入的数据将会被压缩,否则不会。
  • write_vertex_normals可选参数,默认为 True,表示是否要写入顶点法线数据。
  • write_vertex_colors可选参数,默认为 True,表示是否要写入顶点颜色数据。
  • write_triangle_uvs可选参数,默认为 True,表示是否要写入三角形 UV 数据。
  • print_progress可选参数,默认为 False,表示是否要在控制台打印写入进度。

需要注意的是,这些参数并不是全部必须要传入的,只需要传入需要的参数即可。

2.3 代码示例

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) print("->保存ply...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.ply",mesh) # 读取保存的文件重新展示 print("->重新加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.ply") o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True)

2.4Open3D支持的mesh类型

格式描述
ply一种通用的3D模型文件格式,可以存储点云、网格和曲面等各种类型的3D数据。通常包含顶点信息、面信息、法线信息、纹理坐标信息和颜色信息等。
stl一种简单的3D模型文件格式,通常用于存储三角形网格数据。STL文件包含了每个三角形的三个顶点坐标和法线向量信息。
obj一种通用的3D模型文件格式,它可以存储多边形网格、曲面和点云等各种类型的3D数据。OBJ文件通常包含顶点信息、面信息、纹理坐标信息和法线信息等。
off一种简单的3D模型文件格式,通常用于存储多边形网格数据。OFF文件包含了每个顶点的坐标信息和每个面的顶点索引信息。
gltf一种新兴的3D模型文件格式,它使用JSON作为数据格式,可以存储多种类型的3D数据,例如网格、材质、动画和场景等。
glb一种二进制的gltf格式,它将gltf文件打包成一个二进制文件,可以更快地加载和渲染3D模型。

3 mesh 格式转换

以ply转换为Open3D支持的其他mesh格式为例。

3.1 ply 转 obj

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

3.2 ply 转 stl

转换之前要确保 ply格式的mesh含有法线,否则需要计算法线后才能执行ply 转 stl操作。

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

3.3 ply 转 off

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

3.4 ply 转 gltf

# mesh 保存函数 import open3d as o3d print("->加载ply...") mesh = o3d.io.read_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\Armadillo.ply") # 判断mesh文件是否成功读取 if mesh.is_empty(): print("文件读取失败!") else: print("文件读取成功!") # 可视化mesh o3d.visualization.draw_geometries([mesh],window_name='小兔子乖乖',mesh_show_wireframe=True) # 保存为obj print("->保存obj...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.obj",mesh) # 计算mesh顶点法线 mesh.compute_vertex_normals() # 可视化计算顶点法线后的mesh o3d.visualization.draw_geometries([mesh]) # ply 转 stl print("->保存stl...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.stl",mesh) # ply 转 off print("->保存off...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.off",mesh) # ply 转 gltf print("->保存gltf...") o3d.io.write_triangle_mesh(r"H:\HTempWK\temp\open3d\pointdata\SaveArmadillo.gltf",mesh)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 7:40:59

PyTorch-CUDA镜像中的CUDA工具包版本说明及兼容性分析

PyTorch-CUDA镜像中的CUDA工具包版本说明及兼容性分析 在现代深度学习研发中,一个常见的场景是:研究人员在本地训练好的模型,部署到服务器后却因环境差异导致运行失败。这种“在我机器上能跑”的问题,曾长期困扰着AI团队的协作效率…

作者头像 李华
网站建设 2026/4/17 18:38:39

GitHub热门推荐:PyTorch-CUDA-v2.7镜像助力AI开发者提速50%

PyTorch-CUDA-v2.7 镜像:如何让 AI 开发效率飙升 50%? 在当今 AI 研发一线,你有没有遇到过这样的场景?刚接手一个项目,兴冲冲地准备跑通代码,结果 torch.cuda.is_available() 返回了 False。排查两小时才发…

作者头像 李华
网站建设 2026/4/17 21:14:57

无需繁琐配置!PyTorch-CUDA-v2.7镜像开箱即用GPU训练

无需繁琐配置!PyTorch-CUDA-v2.7镜像开箱即用GPU训练 在深度学习项目中,最让人头疼的往往不是模型设计或调参,而是环境搭建——尤其是当你满心期待地准备开始训练时,却发现 torch.cuda.is_available() 返回了 False。明明装了NVID…

作者头像 李华
网站建设 2026/4/17 16:12:53

DiskInfo温控监测:防止PyTorch训练导致硬盘过热

DiskInfo温控监测:防止PyTorch训练导致硬盘过热 在深度学习模型训练日益常态化的今天,我们往往把注意力集中在GPU利用率、显存瓶颈和训练速度上。然而,在一场持续数天的PyTorch大规模训练任务中,真正让系统突然“罢工”的&#xf…

作者头像 李华
网站建设 2026/4/17 13:04:40

清华镜像源支持IPv6访问:提升PyTorch下载速度

清华镜像源支持IPv6访问:提升PyTorch下载速度 在高校和科研机构的AI开发一线,你是否也经历过这样的场景?凌晨两点,实验室服务器正在拉取一个PyTorch-CUDA镜像,进度条卡在30%已持续十分钟;反复重试后依然失…

作者头像 李华
网站建设 2026/4/14 15:16:51

MobaXterm高效运维:实战技巧全解析

MobaXterm高效运维实战技术文章大纲引言MobaXterm简介:功能特点、适用场景高效运维的需求背景:远程管理、多协议支持、自动化需求MobaXterm核心功能解析一体化终端工具:SSH、RDP、VNC、FTP集成会话管理:多标签、分组、保存与共享文…

作者头像 李华