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
- draw_geometries —— 用于绘制几何图形列表的函数
- draw_geometries_with_editing —— 具有编辑功能的用于绘制几何图形列表的函数
- draw_geometries_with_key_callbacks —— 具有自定义键调用功能的绘制几何图形列表的函数
- draw_geometries_with_vertex_selection —— 具有顶点选择功能的绘制几何图形列表的函数
除了第一种函数,后三种均可以选取点并在终端里显示选取点的信息,但是并不会返回值,所以我们无法在程序中直接得到所选点的信息。
后三种选取点的可视化效果也不太一样,这边只针对第四种进行说明。
draw_geometries这种方式代码比较简单,平常使用的时候比较方便,感兴趣的可以试着跑跑官方例程:
第一种 draw_geometries
import open3d as o3dimport numpy as npprint("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 o3dimport numpy as npprint("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
- Visualizer —— 可视化工具主类
- VisualizerWithEditing —— 具有编辑功能的可视化工具
- VisualizerWithKeyCallback —— 具有自定义键调用功能的可视化工具
- VisualizerWithVertexSelection —— 具有顶点选择功能的可视化工具
对于open3d.visualization.Visualizer这种可视化工具,它的基本使用方法可以简单总结为下面几步(作者为了演示简化了各函数参数,感兴趣的读者可以参考官方文档):
- 创建vis类
vis = o3d.visualization.VisualizerWithVertexSelection() - 创建可视化窗口
vis.create_window(window_name=‘Open3D’, width=1920, height=1080, visible=True) - 输入点云或者网格数据
vis.add_geometry(mesh) - 激活窗口 此操作会阻塞线程
vis.run() - 清除可视化窗口
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 o3dimport numpy as nppcd = 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列表中
如此这般就实现了点云的可视化交互,我们可以通过在可视化界面中直接进行选择从而获得一个或者一部分点的信息,进而可以直接在后续的程序中进行处理。
教程书写不易,如果有帮到诸位还请点个赞或者收藏,谢谢大家。
来源地址:https://blog.csdn.net/qq_45912037/article/details/127096161