天天看點

open3d提取每個點的法向量并可視化

1.點雲讀入

  • 讀入檔案(配套點雲下載下傳連結)
# 讀取點雲
pcd = o3d.io.read_point_cloud("point_cloud_00000.ply")
           
  • 配套點雲顔色為白色,open3d的點雲顯示預設背景為白色,是以将點雲顔色更改為黑色
  • 顯示點雲
open3d提取每個點的法向量并可視化

2.點雲預處理

  • 均勻體素下采樣:使用正常體素栅格從輸入點雲建立均勻下采樣的點雲。它通常用作許多點雲處理任務的預處理步驟。該算法分兩步操作:點被分段為體素;每個被占用的體素通過平均内部的所有點來精确生成一個點。
downpcd = pcd.voxel_down_sample(voxel_size=5e-3)
o3d.visualization.draw_geometries([downpcd])
           
open3d提取每個點的法向量并可視化

- 關鍵參數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)  # 視窗高度

           
open3d提取每個點的法向量并可視化

繼續閱讀