python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学

Posted ESRSchao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学相关的知识,希望对你有一定的参考价值。

前言

Open3D是目前python中可用的用于 3D 数据处理的现代库,可以对点云、网格等三维数据进行读取、采样、配准、可视化等操作。其中对点云等三维模型进行可视化的功能在Python中显得非常方便。

在通过对官方文档的研究之后作者发现在Open3D的多种可视化函数中出现了返回所选点的信息的命令,将代码跑通后就有了这篇三维物体可视化交互的文章,希望诸位能通过这篇文章获取一些新的思路。

开发环境
python 3.9.12
Open3D 0.15.1
Pycharm 2021.2

点云的可视化

Open3D对于点云的可视化可以采用两种方式,一种是直接用visualization下面的用于绘制几何图形列表的函数draw_geometries来进行显示,另外一种就是使用可视化工具Visualizer来进行显示。
第一种方式简单快捷,但并不能返回所选点的信息,如果读者发现了可以返回值的方法欢迎补充。

1. draw_geometries

Open3D的官方文档中给出了四种不同的draw_geometries

  1. draw_geometries —— 用于绘制几何图形列表的函数
  2. draw_geometries_with_editing —— 具有编辑功能的用于绘制几何图形列表的函数
  3. draw_geometries_with_key_callbacks —— 具有自定义键调用功能的绘制几何图形列表的函数
  4. draw_geometries_with_vertex_selection —— 具有顶点选择功能的绘制几何图形列表的函数

除了第一种函数,后三种均可以选取点并在终端里显示选取点的信息,但是并不会返回值,所以我们无法在程序中直接得到所选点的信息。

后三种选取点的可视化效果也不太一样,这边只针对第四种进行说明。

draw_geometries这种方式代码比较简单,平常使用的时候比较方便,感兴趣的可以试着跑跑官方例程:

第一种 draw_geometries

import open3d as o3d
import numpy as np
print("Load a ply point cloud, print it, and render it")
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
print(pcd)
print(np.asarray(pcd.points))
o3d.visualization.draw_geometries([pcd],
                                  zoom=0.3412,
                                  front=[0.4257, -0.2125, -0.8795],
                                  lookat=[2.6172, 2.0475, 1.532],
                                  up=[-0.0694, -0.9768, 0.2024])

小提示:在可视化窗口弹出后按H键可以在终端中查看详细的操作菜单

第四种 draw_geometries_with_vertex_selection

import open3d as o3d
import numpy as np
print("Load a ply point cloud, print it, and render it")
ply_point_cloud = o3d.data.PLYPointCloud()
pcd = o3d.io.read_point_cloud(ply_point_cloud.path)
print(pcd)
print(np.asarray(pcd.points))
point = o3d.visualization.draw_geometries_with_key_callbacks([pcd])
print(point)

执行代码,可视化窗口跳出

此时在可视化窗口按下Shift键进入点的选择模式:


这时候使用鼠标可以进行顶点的选择,所选点的信息会显示在终端中:
注意:代码中用point来获取返回值信息,而最后打印出来的point是None证明所选点只会在终端中显示出来,并不会返回值

官方文档中也说明了函数是没有返回值的,那么如果想要获得所选点的信息该怎么办呢。这就可以使用另外一种方法了。

2.Visualizer

Open3D的官方文档中也给出了四种不同的Visualizer

  1. Visualizer —— 可视化工具主类
  2. VisualizerWithEditing —— 具有编辑功能的可视化工具
  3. VisualizerWithKeyCallback —— 具有自定义键调用功能的可视化工具
  4. VisualizerWithVertexSelection —— 具有顶点选择功能的可视化工具

对于open3d.visualization.Visualizer这种可视化工具,它的基本使用方法可以简单总结为下面几步(作者为了演示简化了各函数参数,感兴趣的读者可以参考官方文档):

  1. 创建vis类
    vis = o3d.visualization.VisualizerWithVertexSelection()
  2. 创建可视化窗口
    vis.create_window(window_name=‘Open3D’, width=1920, height=1080, visible=True)
  3. 输入点云或者网格数据
    vis.add_geometry(mesh)
  4. 激活窗口 此操作会阻塞线程
    vis.run()
  5. 清除可视化窗口
    vis.destroy_window()

在可视化过程中也可以通过相关函数进行获得当前视角的RGB图像和深度图等操作,十分方便。

而open3d.visualization.VisualizerWithVertexSelection中增加了一个函数get_picked_points:

get_picked_points(self: open3d.cpu.pybind.visualization.VisualizerWithVertexSelection) → List[open3d::visualization::VisualizerWithVertexSelection::PickedPoint]

它的描述为Function to get picked points,此函数可以返回在可视化窗口选取点的坐标和索引信息。

下图展示了返回值point的信息,可以看到point列表在选取一个点的情况下有0号点的coord三维位置信息以及index索引信息。


整体的程序如下,用的是我自己的点云模型:

import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("arrow.ply")
vis = o3d.visualization.VisualizerWithVertexSelection()
vis.create_window(window_name='Open3D', visible=True)
vis.add_geometry(pcd)
vis.run()
point = vis.get_picked_points()
vis.destroy_window()
print(point[0].index, np.asarray(point[0].coord))

弹出可视化界面

按住Shift键

选取一个或多个点(选中点显示为绿色)

关闭窗口即可获得所选点的信息
而且信息会被储存在point列表中

如此这般就实现了点云的可视化交互,我们可以通过在可视化界面中直接进行选择从而获得一个或者一部分点的信息,进而可以直接在后续的程序中进行处理。

教程书写不易,如果有帮到诸位还请点个赞或者收藏,谢谢大家。

python点云可视化

Python三种点云可视化方案:mayavi、matplotlib、CloudCompare。

方案一:mayavi可视化点云

安装方式:

pip install mayavi

可视化代码:其中'airplane_0001.txt'数据下载地址为:modelnet40点云样例数据-深度学习文档类资源-CSDN下载

from mayavi import mlab
import numpy as np

def viz_mayavi(points):
    x = points[:, 0]  # x position of point
    y = points[:, 1]  # y position of point
    z = points[:, 2]  # z position of point
    fig = mlab.figure(bgcolor=(0, 0, 0), size=(640, 360)) #指定图片背景和尺寸
    mlab.points3d(x, y, z,
                         z,          # Values used for Color,指定颜色变化依据
                         mode="point",
                          colormap='spectral', # 'bone', 'copper', 'gnuplot'
                         # color=(0, 1, 0),   # 也可以使用固定的RGB值
                         )
    mlab.show()
points = np.loadtxt('airplane_0001.txt', delimiter=',')
viz_mayavi(points)

显示结果:

 方案二、matplotlib可视化点云

代码如下所示:

import matplotlib.pyplot as plt
import numpy as np

def viz_matplot(points):
    x = points[:, 0]  # x position of point
    y = points[:, 1]  # y position of point
    z = points[:, 2]  # z position of point
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(x,   # x
               y,   # y
               z,   # z
               c=z, # height data for color
               cmap='rainbow',
               marker="x")
    ax.axis()
    plt.show()

    
points = np.loadtxt('airplane_0001.txt', delimiter=',')
viz_matplot(points)

显示结果:

 方案三、CloudCompare可视化点云

直接用软件打开,无需安装。CloudCompare下载地址:CloudCompare点云可视化软件-深度学习文档类资源-CSDN下载

显示结果:

 Mayavi常用函数

from mayavi import mlab

fig = mlab.figure(bgcolor=(0, 0, 0), size=(640, 360)) #指定图片背景和尺寸

mlab.points3d(x, y, z,
              z,          # Values used for Color,指定颜色变化依据
              mode="point",
              colormap='spectral', # 'bone', 'copper', 'gnuplot'
              # color=(0, 1, 0),   # 也可以使用固定的RGB值
               )

opacity=1.0  # 不透明度,取值范围0-1。0.0表示完全透明,1.0表示完全不透明
color=(1, 1, 1)  # RGB数值,每个数的取值范围均为0-1。例:(1, 1, 1)表示白色。
colormap='spectral'  #  不同的配色方案

mlab.show()#显示结果

# 2D data
img = xxxx  # img is a 2D nunmpy array
mlab.imshow(img) #显示二维结果
mlab.surf()
mlab.contour_surf()
mlab.mesh()             #将物体表面以网格(mesh)的形式展示出来,即坐标空间的网格化。# 参数:representation = 'wireframe' 可以仅绘制线框。
# 参数:representation = 'surface' 为default值,绘制完整曲面。mlab.mesh(x, y, z, representation='wireframe', line_width=1.0 )

python三维点云研究计划_Coding的叶子的博客-CSDN博客_python 三维点云将按照以下目录持续进行更新……点云格式介绍、点云可视化、点云投影、生成鸟瞰图、生成前视图、点云配准、点云分割、三维目标检测、点云重建、深度学习点云算法……https://blog.csdn.net/suiyingy/article/details/124017716更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。

以上是关于python如何实现点云可视化交互——Open3D实例教程(获取所选点的信息)保姆级教学的主要内容,如果未能解决你的问题,请参考以下文章

Open3D官方文档学习笔记

Open3D官方文档学习笔记

Open3D官方文档学习笔记

『OPEN3D』1.1 点云处理 python篇

点云处理技术之open3d第一篇:open3d的快速安装简介文件的读写和可视化操作

Open3d - 将多个点云可视化为视频/动画