本文主要介绍两种读取点云和网格的方法,一种是通过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博客
https://github.com/daavoo/pyntcloud
open3d 读取点云文件输出pcd常用的函数_Mr.鱼的博客-CSDN博客_open3d pcd