当前位置:   article > 正文

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

pyntcloud

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

Open3D

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

pip install open3d

1.常见点云

  1. import open3d as o3d
  2. import numpy as np
  3. ply_path = './gt-11.ply'
  4. # 通过open3d直接读取点云
  5. pcd = o3d.io.read_point_cloud(ply_path)
  6. # 查看点云具体数值
  7. pcd_value = np.asarray(pcd.points)
  8. print(pcd_value)
  9. # 转成三维向量
  10. pcd_vector = o3d.geometry.PointCloud()
  11. pcd_vector.points = o3d.utility.Vector3dVector(pcd.points)
  12. # 手动绘制颜色
  13. # pcd.paint_uniform_color([1, 0.706, 0])
  14. pcd_vector.paint_uniform_color([1, 0.706, 0])
  15. # 三维模型的坐标中心
  16. # origin = pcd.get_center()
  17. origin = pcd_vector.get_center()
  18. # 坐标系
  19. coordinate = o3d.geometry.TriangleMesh.create_coordinate_frame(size=0.2, origin=origin - 0.5)
  20. # 可视化
  21. o3d.visualization.draw_geometries([pcd])
  22. o3d.visualization.draw_geometries([pcd_vector, coordinate])
  23. # 保存
  24. 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

查看点云数据

查看数值

  1. # 查看点云具体数值
  2. pcd_value = np.asarray(pcd.points)
  3. print(pcd_value)

        通过numpy转换点坐标查看点云具体数值。

三维向量化

  1. # 转成三维向量
  2. pcd_vector = o3d.geometry.PointCloud()
  3. pcd_vector.points = o3d.utility.Vector3dVector(pcd.points)

        open3d.utility.Vector3dVector()可以将点坐标转成三维向量。向量化后可以进行颜色绘制、可视化、保存...等一系列操作。

绘制颜色

  1. # 手动绘制颜色
  2. # pcd.paint_uniform_color([1, 0.706, 0])
  3. pcd_vector.paint_uniform_color([1, 0.706, 0])

坐标系

  1. # 三维模型的坐标中心
  2. # origin = pcd.get_center()
  3. origin = pcd_vector.get_center()
  4. # 坐标系
  5. 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. ) ) – 坐标系的原点。

可视化

  1. # 可视化
  2. o3d.visualization.draw_geometries([pcd])
  3. 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 ) – 也可视化网格三角形的背面。

        可视化单个三维模型(没有绘制颜色情况下为彩色):

        同时可视化多个三维模型(坐标系其实也是个三维模型):

保存

  1. # 保存
  2. o3d.io.write_point_cloud('human.pcd', pcd)

        通过open3d.io.write_point_cloud()保存为指定的格式。

2.txt点云

  1. import open3d as o3d
  2. import numpy as np
  3. txt_path = './airplane_0001.txt'
  4. # 通过numpy读取txt点云
  5. pcd = np.genfromtxt(txt_path, delimiter=",")
  6. pcd_vector = o3d.geometry.PointCloud()
  7. # 加载点坐标
  8. pcd_vector.points = o3d.utility.Vector3dVector(pcd[:, :3])
  9. o3d.visualization.draw_geometries([pcd_vector])

        Open3D不能直接读取txt点云,可以通过numpy读取点坐标(分隔符为","),再转成三维向量进行可视化。使用numpy.genfromtxt()可以考虑txt文件中的缺失数据。txt点云前三个数值一般对应xyz坐标,可以通过open3d.geometry.PointCloud().points加载,可视化:

  1. # 加载法线或颜色
  2. # pcd_vector.normals = o3d.utility.Vector3dVector(pcd[:, 3:6])
  3. pcd_vector.colors = o3d.utility.Vector3dVector(pcd[:, 3:6])
  4. o3d.visualization.draw_geometries([pcd_vector])

        如果有法线颜色,那么可以分别通过open3d.geometry.PointCloud().normalsopen3d.geometry.PointCloud().colors加载,可视化:

3.网格

  1. import open3d as o3d
  2. import numpy as np
  3. ply_path = './gt-118.ply'
  4. # 通过open3d直接读取网格
  5. mesh = o3d.io.read_triangle_mesh(ply_path)
  6. 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模型,因为没有绘制顶点法线。

绘制顶点法线

  1. # 绘制网格顶点法线
  2. mesh.compute_vertex_normals()
  3. o3d.visualization.draw_geometries([mesh])

        可视化:

查看数值

  1. # 查看网格顶点具体数值
  2. mesh_vertices = np.asarray(mesh.vertices)
  3. print(mesh_vertices)

        通过numpy转换顶点坐标查看网格顶点具体数值。

可视化

  1. # 手动绘制颜色
  2. mesh.paint_uniform_color([1, 0.706, 0])
  3. # 三维模型的坐标中心
  4. origin = mesh.get_center()
  5. # 坐标系
  6. coordinate = o3d.geometry.TriangleMesh.create_coordinate_frame(size=10, origin=origin - 20)
  7. # 加载网格顶点
  8. pcd_vector = o3d.geometry.PointCloud()
  9. pcd_vector.points = o3d.utility.Vector3dVector(mesh_vertices)
  10. # 可视化
  11. o3d.visualization.draw_geometries([pcd_vector])
  12. o3d.visualization.draw_geometries([mesh, pcd_vector, coordinate])

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

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

Pyntcloud

        官方文档,安装命令:

pip install pyntcloud

1.常见点云和网格

  1. import open3d as o3d
  2. from pyntcloud import PyntCloud
  3. ply_path = './gt-118.ply'
  4. # 通过pyntcloud读取点云或网格
  5. point = PyntCloud.from_file(ply_path)
  6. # 关闭mesh,即点云或网格顶点
  7. pcd = point.to_instance("open3d", mesh=False)
  8. # 开启mesh,即网格
  9. mesh = point.to_instance("open3d", mesh=True)
  10. # 绘制网格顶点法线
  11. mesh.compute_vertex_normals()
  12. # 可视化
  13. o3d.visualization.draw_geometries([pcd, mesh])

        通过PyntCloud.from_file()方法可以读取点云网格,再通过PyntCloud.from_file().to_instance()实例化,可选择开启或关闭mesh参数。当关闭mesh,实例化为点云网格顶点;当开启mesh,实例化为网格。同时可视化:

2.txt点云

  1. import open3d as o3d
  2. from pyntcloud import PyntCloud
  3. from pandas import DataFrame
  4. import numpy as np
  5. txt_path = './airplane_0254.txt'
  6. # 通过numpy读取txt点云
  7. pcd = np.genfromtxt(txt_path, delimiter=",")
  8. # 插入x,y,z坐标
  9. pcd = DataFrame(pcd[:, :3], columns=['x', 'y', 'z'])
  10. # 加载点坐标
  11. point = PyntCloud(pcd)
  12. # 实例化
  13. mesh = point.to_instance("open3d", mesh=True)
  14. # 可视化
  15. o3d.visualization.draw_geometries([mesh])

        通过numpy读取点坐标(分隔符为","),插入xyz坐标,再通过PyntCloud()加载点坐标,实例化。可视化:

PyVista

        官方文档,安装命令(python >= 3.6):

pip install pyvista
  1. import pyvista as pv
  2. # 读取点云或网格
  3. ply_path = './gt-118.ply'
  4. mesh = pv.read(ply_path)
  5. cpos = mesh.plot()

        可视化:

参考链接

https://github.com/HuangCongQing/Point-Clouds-Visualization

Open3D 读取、保存、显示点云_点云侠的博客-CSDN博客

https://github.com/daavoo/pyntcloud

open3d 读取点云文件输出pcd常用的函数_Mr.鱼的博客-CSDN博客_open3d pcd

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/95610
推荐阅读
  

闽ICP备14008679号