Open3D 三维点云读取可视化、下采样、去除离群点、地面提取
生活随笔
收集整理的這篇文章主要介紹了
Open3D 三维点云读取可视化、下采样、去除离群点、地面提取
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Open3D:3D數據處理的現代庫,是一個開放源代碼庫,支持快速開發處理3D數據的軟件。Open3D在C ++和Python中公開了一組精心選擇的數據結構和算法。后端經過高度優化,并支持并行化。
推薦Python,支持Python(3.5、3.6、3.7、3.8),支持系統(Ubuntu 18.04+、macOS 10.14+、Windows 10 (64-bit))。
Open3D支持讀取PointCloud、Mesh(與點云的數據結構相比,Mesh具有定義3D表面的三角形。文件類型有.ply,.stl,.obj,.off,.gltf)、Image;
Open3D的核心功能包括:
- 3D數據結構
- 3D數據處理算法
- 場景重建
- 表面對齊
- 3D可視化
- 基于物理的渲染【 Physically based rendering (PBR)】
- 在C++、Python中可用
windows10安裝(python3.7.4):
pip install open3d
驗證安裝成功與否:
python -c "import open3d as o3d"
點云讀取、可視化、下采樣、去除離群點、垂直法線估計、平面提取均可行,效果圖如下:
原始點云:
下采樣后(保留原始點云的50%左右):
離群點去除(statistical_outlier_removal 紅色為去除的離群點)
下采樣后的點云法向量估計:
平面提取后效果圖(紅色為地面點云)
地面提取效果同時展示法向量的:
從下圖可看出:原點云24萬點,下采樣后12萬點,移除離群點后11萬點,地面點近10萬點;
import open3d as o3ddef display_inlier_outlier(cloud, ind):inlier_cloud = cloud.select_by_index(ind)outlier_cloud = cloud.select_by_index(ind, invert=True)print("Showing outliers (red) and inliers (gray): ")outlier_cloud.paint_uniform_color([1, 0, 0])inlier_cloud.paint_uniform_color([0.8, 0.8, 0.8])o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud], window_name='Open3D Removal Outlier', width=1920,height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False,mesh_show_back_face=False)# 讀取:支持xyz、xyzn、xyzrgb、pts、ply、pcd、txt
pcd = o3d.io.read_point_cloud("D:/pcd/milk_cartoon_all_small_clorox.pcd")
# pcd = o3d.io.read_point_cloud("../../TestData/my_points.txt", format='xyz')
print(pcd)o3d.visualization.draw_geometries([pcd], window_name='Open3D Origin', width=1920, height=1080, left=50, top=50,point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)# 下采樣
# voxel_down_sample(把點云分配在三維的網格中,取平均值)
# uniform_down_sample (可以通過收集每第n個點來對點云進行下采樣)
# select_down_sample (使用帶二進制掩碼的select_down_sample僅輸出所選點。選定的點和未選定的點并可視化。)
print("Downsample the point cloud with a voxel of 0.003")
downpcd = pcd.voxel_down_sample(voxel_size=0.003)
print(downpcd)
o3d.visualization.draw_geometries([downpcd], window_name='Open3D downSample', width=1920, height=1080, left=50, top=50,point_show_normal=False, mesh_show_wireframe=False, mesh_show_back_face=False)# 重新計算平面法線
# 頂點法線估計【Vertex normal estimation】
# 點云的另一個基本操作是點法線估計。按n查看法線。鍵-和鍵+可用于控制法線的長度。
print("Recompute the normal of the downsampled point cloud")
downpcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
o3d.visualization.draw_geometries([downpcd], window_name='Open3D downSample Normals', width=1920, height=1080, left=50,top=50, point_show_normal=True, mesh_show_wireframe=False, mesh_show_back_face=False)# 離群點去除 【outlier removal】
# 點云離群值去除 從掃描設備收集數據時,可能會出現點云包含要消除的噪聲和偽影的情況。本教程介紹了Open3D的異常消除功能。 準備輸入數據,使用降采樣后的點云數據。
# statistical_outlier_removal 【統計離群值移除】 刪除與點云的平均值相比更遠離其鄰居的點。
# 它帶有兩個輸入參數:nb_neighbors 允許指定要考慮多少個鄰居,以便計算給定點的平均距離
# std_ratio 允許基于跨點云的平均距離的標準偏差來設置閾值級別。此數字越低,過濾器將越具有攻擊性
#
# radius_outlier_removal 【半徑離群值去除】 刪除在給定球體中周圍幾乎沒有鄰居的點。
# 兩個參數可以調整以適應數據:nb_points 選擇球體應包含的最小點數
# radius 定義將用于計算鄰居的球體的半徑
print("Statistical oulier removal")
cl, ind = downpcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0)
display_inlier_outlier(downpcd, ind)
downpcd_inlier_cloud = downpcd.select_by_index(ind)
print(downpcd_inlier_cloud)# 平面分割 【Plane Segmentation】
# Open3D還包含使用RANSAC從點云中分割幾何圖元的支持。要在點云中找到具有最大支持的平面,我們可以使用segement_plane。該方法具有三個參數。
# distance_threshold定義一個點到一個估計平面的最大距離,該點可被視為一個不規則點; ransac_n定義隨機采樣的點數以估計一個平面; num_iterations定義對隨機平面進行采樣和驗證的頻率。
# 函數然后將平面返回為(a,b,c,d) 這樣,對于平面上的每個點(x,y,z),我們都有ax + by + cz + d = 0。該功能進一步調整內部點的索引列表。
plane_model, inliers = downpcd_inlier_cloud.segment_plane(distance_threshold=0.01,ransac_n=5,num_iterations=10000)
[a, b, c, d] = plane_model
print(f"Plane equation: {a:.2f}x + {b:.2f}y + {c:.2f}z + {d:.2f} = 0")inlier_cloud = downpcd_inlier_cloud.select_by_index(inliers)
print('----inlier_cloud: ', inlier_cloud.points)
inlier_cloud.paint_uniform_color([1.0, 0, 0])
outlier_cloud = downpcd_inlier_cloud.select_by_index(inliers, invert=True)
print('----outlier_cloud: ', outlier_cloud.points)
o3d.visualization.draw_geometries([inlier_cloud, outlier_cloud], window_name='Open3D Plane Model', width=1920,height=1080, left=50, top=50, point_show_normal=False, mesh_show_wireframe=False,mesh_show_back_face=False)
o3d.io.write_point_cloud("D:/pcd/1001140020191217_las2pcd_cx_g.pcd", inlier_cloud)
# help(o3d.visualization.draw_geometries)
參考:
- http://www.open3d.org/docs/release/introduction.html#open3d-a-modern-library-for-3d-data-processing
- https://github.com/intel-isl/Open3D/releases
總結
以上是生活随笔為你收集整理的Open3D 三维点云读取可视化、下采样、去除离群点、地面提取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 试管婴儿一次取多少个卵子
- 下一篇: Python、Matplot的subpl