1.點雲讀入
- 讀入檔案(配套點雲下載下傳連結)
# 讀取點雲
pcd = o3d.io.read_point_cloud("point_cloud_00000.ply")
- 配套點雲顔色為白色,open3d的點雲顯示預設背景為白色,是以将點雲顔色更改為黑色
- 顯示點雲

2.點雲預處理
- 均勻體素下采樣:使用正常體素栅格從輸入點雲建立均勻下采樣的點雲。它通常用作許多點雲處理任務的預處理步驟。該算法分兩步操作:點被分段為體素;每個被占用的體素通過平均内部的所有點來精确生成一個點。
downpcd = pcd.voxel_down_sample(voxel_size=5e-3)
o3d.visualization.draw_geometries([downpcd])
- 關鍵參數voxel_size,體素大小,機關是米
3.點雲法線提取與可視化
- 計算法向量(原理:查找相鄰點,并使用協方差分析計算相鄰點的主軸。)
downpcd.estimate_normals(
search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))
-
- 關鍵參數:一個o3d.geometry.KDTreeSearchParamHybrid的執行個體化對象,兩個關鍵參數radius=0.1和max_nn=30:10厘米的搜尋半徑,最多隻考慮30個鄰居,以節省計算時間。
- 法向方向問題:協方差分析算法産生兩個相反的方向作為正常候選。如果不知道幾何體的全局結構,兩者都可能是正确的。這就是所謂的法線方向問題。Open3D嘗試将法線定向為與原始法線對齊(如果存在)。否則,Open3D會随機猜測。如果需要考慮方向,則需要調用其他方向函數,如orienta_normals_to_align_with_direction和orienta_nrmals_towards_camer_location。
- 提取估計的法相向量
N = np.array(downpcd.normals)
print(N)
[[-0.10498607 -0.08691976 0.9906679 ]
[-0.01047759 0.11685291 -0.99309396]
[ 0.20985038 0.09336236 -0.97326578]
...
[-0.30973721 -0.08777727 0.94676186]
[-0.39558671 -0.0815209 0.91480353]
[ 0.1276047 -0.09240519 0.98751117]]
- 可視化法向量(按N可以顯示或隐藏法向量,按主鍵盤上的=、-可以調整法向量顯示長短)
o3d.visualization.draw_geometries([downpcd], window_name="法線估計",
point_show_normal=True,
width=800, # 視窗寬度
height=600) # 視窗高度