Open3D Pyntcloud 读取点云和网格并可视化(含txt读取方法)

        本文主要介绍两种读取点云网格的方法,一种是通过open3d读取,另一种是通过pyntcloud读取,最后通过open3d进行可视化。第三种是通过pyvista读取再可视化。

Open3D

        官方文档,版本:0.13.0,安装命令:

pip install open3d

1.常见点云

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()方法读取点云。参数如下:

  • filenamestr ) – 文件路径。

  • 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还支持以下格式:

格式

描述

xyz

每一行包含[x, y, z],其中xyz是三维坐标

xyzn

每一行包含[x, y, z, nx, ny, nz],其中nxnynz是法线

xyzrgb

每行包含[x, y, z, r, g, b],其中rgb[0, 1]范围内取值

pts

第一行是一个整数,表示点数。后续行遵循以下格式之一:[x, y, z, i, r, g, b][x, y, z, r, g, b][x, y, z, i][x, y, z], 其中xyzi属于类型double,rgb属于类型uint8

ply

请参阅多边形文件格式,层文件可以包含点云和网格数据

pcd

查看点云数据

查看数值

# 查看点云具体数值
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中心xyz 轴分别呈现为红色绿色蓝色箭头。

  • size ( float optional default=1.0 ) – 坐标系的大小。

  • origin ( numpy.ndarray float64 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()保存为指定的格式。

2.txt点云

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点云前三个数值一般对应xyz坐标,可以通过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().normalsopen3d.geometry.PointCloud().colors加载,可视化:

3.网格

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()方法读取网格。参数如下:

  • filenamestr ) – 文件路径。

  • 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])

        设置颜色和坐标系后,可视化转换三维向量后的网格顶点

        同时可视化网格网格顶点坐标系

Pyntcloud

        官方文档,安装命令:

pip install pyntcloud

1.常见点云和网格

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,实例化为网格。同时可视化:

2.txt点云

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读取点坐标(分隔符为","),插入xyz坐标,再通过PyntCloud()加载点坐标,实例化。可视化:

PyVista

        官方文档,安装命令(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

猜你喜欢

转载自blog.csdn.net/weixin_41611054/article/details/119144582