赞
踩
本文主要介绍两种读取点云和网格的方法,一种是通过open3d读取,另一种是通过pyntcloud读取,最后通过open3d进行可视化。第三种是通过pyvista读取再可视化。
官方文档,版本:0.13.0,安装命令:
pip install open3d
- import open3d as o3d
- import numpy as np
-
- ply_path = './gt-11.ply'
- # 通过open3d直接读取点云
- pcd = o3d.io.read_point_cloud(ply_path)
-
- # 查看点云具体数值
- pcd_value = np.asarray(pcd.points)
- print(pcd_value)
-
- # 转成三维向量
- pcd_vector = o3d.geometry.PointCloud()
- pcd_vector.points = o3d.utility.Vector3dVector(pcd.points)
-
- # 手动绘制颜色
- # pcd.paint_uniform_color([1, 0.706, 0])
- pcd_vector.paint_uniform_color([1, 0.706, 0])
-
- # 三维模型的坐标中心
- # origin = pcd.get_center()
- origin = pcd_vector.get_center()
- # 坐标系
- coordinate = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.2, origin=origin - 0.5)
-
- # 可视化
- o3d.visualization.draw_geometries([pcd])
- o3d.visualization.draw_geometries([pcd_vector, coordinate])
-
- # 保存
- o3d.io.write_point_cloud('human.pcd', pcd)
open3d.io.read_point_cloud(filename, format='auto', remove_nan_points=True, remove_infinite_points=True, print_progress=False)
Open3D通过open3d.io.read_point_cloud()方法读取点云。参数如下:
filename( str ) – 文件路径。
format ( str , optional , default='auto' ) – 输入文件的格式。如果未指定或设置为
auto
,则从文件扩展名推断格式。remove_nan_points ( bool , optional , default=True ) – 如果为真,所有包含 NaN 的点将从 PointCloud 中删除。
remove_infinite_points ( bool , optional , default=True ) – 如果为 true,则所有包含无限值的点都将从 PointCloud 中删除。
print_progress ( bool , optional , default=False ) – 如果设置为 true,则在控制台中显示进度条
除了默认参数‘auto’,format还支持以下格式:
格式 | 描述 |
---|---|
| 每一行包含 |
| 每一行包含 |
| 每行包含 |
| 第一行是一个整数,表示点数。后续行遵循以下格式之一: |
| 请参阅多边形文件格式,层文件可以包含点云和网格数据 |
| 查看点云数据 |
- # 查看点云具体数值
- pcd_value = np.asarray(pcd.points)
- print(pcd_value)
通过numpy转换点坐标查看点云具体数值。
- # 转成三维向量
- pcd_vector = o3d.geometry.PointCloud()
- pcd_vector.points = o3d.utility.Vector3dVector(pcd.points)
open3d.utility.Vector3dVector()可以将点坐标转成三维向量。向量化后可以进行颜色绘制、可视化、保存...等一系列操作。
- # 手动绘制颜色
- # pcd.paint_uniform_color([1, 0.706, 0])
- pcd_vector.paint_uniform_color([1, 0.706, 0])
- # 三维模型的坐标中心
- # origin = pcd.get_center()
- origin = pcd_vector.get_center()
- # 坐标系
- coordinate = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.2, origin=origin - 0.5)
get_center()可以获取三维模型的坐标中心。open3d.geometry.TriangleMesh.create_coordinate_frame()该方法可以绘制坐标系,参数如下:
坐标系以
origin
为中心。x、y、z 轴分别呈现为红色、绿色和蓝色箭头。
size ( float , optional , default=1.0 ) – 坐标系的大小。
origin ( numpy.ndarray [ float64 [ 3 , 1 ] ] , optional , default=array ( [ 0. , 0. , 0. ] ) ) – 坐标系的原点。
- # 可视化
- o3d.visualization.draw_geometries([pcd])
- o3d.visualization.draw_geometries([pcd_vector, coordinate])
通过open3d.visualization.draw_geometries()进行可视化,参数如下:
draw_geometries(geometry_list, window_name=’Open3D’, width=1920, height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)
geometry_list ( List [ open3d.geometry.Geometry ] ) – 要可视化的几何体列表。
window_name ( str , optional , default='Open3D' ) – 可视化窗口的显示标题。
width ( int , optional , default=1920 ) – 可视化窗口的宽度。
height ( int , optional , default=1080 ) – 可视化窗口的高度。
left ( int , optional , default=50 ) – 可视化窗口的左边距。
top ( int , optional , default=50 ) – 可视化窗口的顶部边距。
point_show_normal ( bool , optional , default=False ) – 如果设置为 true,则可视化点云法线。
mesh_show_wireframe ( bool , optional , default=False ) – 如果设置为 true,则可视化网格线框。
mesh_show_back_face ( bool , optional , default=False ) – 也可视化网格三角形的背面。
可视化单个三维模型(没有绘制颜色情况下为彩色):
同时可视化多个三维模型(坐标系其实也是个三维模型):
- # 保存
- o3d.io.write_point_cloud('human.pcd', pcd)
通过open3d.io.write_point_cloud()保存为指定的格式。
- import open3d as o3d
- import numpy as np
-
- txt_path = './airplane_0001.txt'
- # 通过numpy读取txt点云
- pcd = np.genfromtxt(txt_path, delimiter=",")
-
- pcd_vector = o3d.geometry.PointCloud()
- # 加载点坐标
- pcd_vector.points = o3d.utility.Vector3dVector(pcd[:, :3])
- o3d.visualization.draw_geometries([pcd_vector])
Open3D不能直接读取txt点云,可以通过numpy读取点坐标(分隔符为","),再转成三维向量进行可视化。使用numpy.genfromtxt()可以考虑txt文件中的缺失数据。txt点云前三个数值一般对应x、y、z坐标,可以通过open3d.geometry.PointCloud().points加载,可视化:
- # 加载法线或颜色
- # pcd_vector.normals = o3d.utility.Vector3dVector(pcd[:, 3:6])
- pcd_vector.colors = o3d.utility.Vector3dVector(pcd[:, 3:6])
- o3d.visualization.draw_geometries([pcd_vector])
如果有法线或颜色,那么可以分别通过open3d.geometry.PointCloud().normals或open3d.geometry.PointCloud().colors加载,可视化:
- import open3d as o3d
- import numpy as np
-
- ply_path = './gt-118.ply'
- # 通过open3d直接读取网格
- mesh = o3d.io.read_triangle_mesh(ply_path)
- o3d.visualization.draw_geometries([mesh])
open3d.io.read_triangle_mesh(filename, enable_post_processing=False, print_progress=False)
Open3D通过open3d.io.read_triangle_mesh()方法读取网格。参数如下:
filename( str ) – 文件路径。
print_progress ( bool , optional , default=False ) – 如果设置为 true,则在控制台中显示进度条
可视化:
看起来不像3d模型,因为没有绘制顶点法线。
- # 绘制网格顶点法线
- mesh.compute_vertex_normals()
- o3d.visualization.draw_geometries([mesh])
可视化:
- # 查看网格顶点具体数值
- mesh_vertices = np.asarray(mesh.vertices)
- print(mesh_vertices)
通过numpy转换顶点坐标查看网格顶点具体数值。
- # 手动绘制颜色
- mesh.paint_uniform_color([1, 0.706, 0])
- # 三维模型的坐标中心
- origin = mesh.get_center()
- # 坐标系
- coordinate = o3d.geometry.TriangleMesh.create_coordinate_frame(size=10, origin=origin - 20)
- # 加载网格顶点
- pcd_vector = o3d.geometry.PointCloud()
- pcd_vector.points = o3d.utility.Vector3dVector(mesh_vertices)
- # 可视化
- o3d.visualization.draw_geometries([pcd_vector])
- o3d.visualization.draw_geometries([mesh, pcd_vector, coordinate])
设置颜色和坐标系后,可视化转换三维向量后的网格顶点:
同时可视化网格、网格顶点、坐标系:
官方文档,安装命令:
pip install pyntcloud
- import open3d as o3d
- from pyntcloud import PyntCloud
-
- ply_path = './gt-118.ply'
- # 通过pyntcloud读取点云或网格
- point = PyntCloud.from_file(ply_path)
- # 关闭mesh,即点云或网格顶点
- pcd = point.to_instance("open3d", mesh=False)
- # 开启mesh,即网格
- mesh = point.to_instance("open3d", mesh=True)
- # 绘制网格顶点法线
- mesh.compute_vertex_normals()
- # 可视化
- o3d.visualization.draw_geometries([pcd, mesh])
通过PyntCloud.from_file()方法可以读取点云或网格,再通过PyntCloud.from_file().to_instance()实例化,可选择开启或关闭mesh参数。当关闭mesh,实例化为点云或网格顶点;当开启mesh,实例化为网格。同时可视化:
- import open3d as o3d
- from pyntcloud import PyntCloud
- from pandas import DataFrame
- import numpy as np
-
- txt_path = './airplane_0254.txt'
- # 通过numpy读取txt点云
- pcd = np.genfromtxt(txt_path, delimiter=",")
- # 插入x,y,z坐标
- pcd = DataFrame(pcd[:, :3], columns=['x', 'y', 'z'])
- # 加载点坐标
- point = PyntCloud(pcd)
- # 实例化
- mesh = point.to_instance("open3d", mesh=True)
- # 可视化
- o3d.visualization.draw_geometries([mesh])
通过numpy读取点坐标(分隔符为","),插入x、y、z坐标,再通过PyntCloud()加载点坐标,实例化。可视化:
官方文档,安装命令(python >= 3.6):
pip install pyvista
- import pyvista as pv
-
- # 读取点云或网格
- ply_path = './gt-118.ply'
- mesh = pv.read(ply_path)
- cpos = mesh.plot()
可视化:
https://github.com/HuangCongQing/Point-Clouds-Visualization
Open3D 读取、保存、显示点云_点云侠的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。