前言
Open3D是目前python中可用的用于 3D 數(shù)據(jù)處理的現(xiàn)代庫,可以對點云、網(wǎng)格等三維數(shù)據(jù)進行讀取、采樣、配準、可視化等操作。其中對點云等三維模型進行可視化的功能在Python中顯得非常方便。
在通過對官方文檔的研究之后作者發(fā)現(xiàn)在Open3D的多種可視化函數(shù)中出現(xiàn)了返回所選點的信息的命令,將代碼跑通后就有了這篇三維物體可視化交互的文章,希望諸位能通過這篇文章獲取一些新的思路。
開發(fā)環(huán)境
python 3.9.12
Open3D 0.15.1
Pycharm 2021.2
點云的可視化
Open3D對于點云的可視化可以采用兩種方式,一種是直接用visualization下面的用于繪制幾何圖形列表的函數(shù)draw_geometries來進行顯示,另外一種就是使用可視化工具Visualizer來進行顯示。
第一種方式簡單快捷,但并不能返回所選點的信息,如果讀者發(fā)現(xiàn)了可以返回值的方法歡迎補充。
1. draw_geometries
Open3D的官方文檔中給出了四種不同的draw_geometries
- draw_geometries —— 用于繪制幾何圖形列表的函數(shù)
- draw_geometries_with_editing —— 具有編輯功能的用于繪制幾何圖形列表的函數(shù)
- draw_geometries_with_key_callbacks —— 具有自定義鍵調(diào)用功能的繪制幾何圖形列表的函數(shù)
- draw_geometries_with_vertex_selection —— 具有頂點選擇功能的繪制幾何圖形列表的函數(shù)
除了第一種函數(shù),后三種均可以選取點并在終端里顯示選取點的信息,但是并不會返回值,所以我們無法在程序中直接得到所選點的信息。
后三種選取點的可視化效果也不太一樣,這邊只針對第四種進行說明。
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)
執(zhí)行代碼,可視化窗口跳出
此時在可視化窗口按下Shift鍵進入點的選擇模式:
這時候使用鼠標可以進行頂點的選擇,所選點的信息會顯示在終端中:
注意:代碼中用point來獲取返回值信息,而最后打印出來的point是None證明所選點只會在終端中顯示出來,并不會返回值
官方文檔中也說明了函數(shù)是沒有返回值的,那么如果想要獲得所選點的信息該怎么辦呢。這就可以使用另外一種方法了。
2.Visualizer
Open3D的官方文檔中也給出了四種不同的Visualizer
- Visualizer —— 可視化工具主類
- VisualizerWithEditing —— 具有編輯功能的可視化工具
- VisualizerWithKeyCallback —— 具有自定義鍵調(diào)用功能的可視化工具
- VisualizerWithVertexSelection —— 具有頂點選擇功能的可視化工具
對于open3d.visualization.Visualizer這種可視化工具,它的基本使用方法可以簡單總結為下面幾步(作者為了演示簡化了各函數(shù)參數(shù),感興趣的讀者可以參考官方文檔):
- 創(chuàng)建vis類
vis = o3d.visualization.VisualizerWithVertexSelection() - 創(chuàng)建可視化窗口
vis.create_window(window_name=‘Open3D’, width=1920, height=1080, visible=True) - 輸入點云或者網(wǎng)格數(shù)據(jù)
vis.add_geometry(mesh) - 激活窗口 此操作會阻塞線程
vis.run() - 清除可視化窗口
vis.destroy_window()
在可視化過程中也可以通過相關函數(shù)進行獲得當前視角的RGB圖像和深度圖等操作,十分方便。
而open3d.visualization.VisualizerWithVertexSelection中增加了一個函數(shù)get_picked_points:
get_picked_points(self: open3d.cpu.pybind.visualization.VisualizerWithVertexSelection) → List[open3d::visualization::VisualizerWithVertexSelection::PickedPoint]
它的描述為Function to get picked points,此函數(shù)可以返回在可視化窗口選取點的坐標和索引信息。
下圖展示了返回值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列表中
如此這般就實現(xiàn)了點云的可視化交互,我們可以通過在可視化界面中直接進行選擇從而獲得一個或者一部分點的信息,進而可以直接在后續(xù)的程序中進行處理。文章來源:http://www.zghlxwxcb.cn/news/detail-784766.html
教程書寫不易,如果有幫到諸位還請點個贊或者收藏,謝謝大家。文章來源地址http://www.zghlxwxcb.cn/news/detail-784766.html
到了這里,關于python如何實現(xiàn)點云可視化交互——Open3D實例教程(獲取所選點的信息)保姆級教學的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!