目錄
一、概述
二、代碼實現
2.1關鍵函數
2.2完整代碼
三、實現效果
3.1原始點云
3.2構建后點云
一、概述
????????八叉樹(Octree)是一種樹狀數據結構,用于遞歸地將3D空間分割成較小的立方體。八叉樹特別適用于3D計算機圖形學、點云處理和空間索引。八叉樹的每個節點表示一個正方體的體積元素,每個節點有八個子節點,這八個子節點所表示的體積元素加在一起就等于父節點的體積。一般中心點作為節點的分叉中心。
八叉樹的構建原理:
1.初始分割:
????????- 開始時,整個3D空間被包含在一個根立方體中。
2.遞歸分割:
????????- 每個立方體(稱為一個八叉樹節點)被遞歸地分割成八個子立方體(每個維度一分為二)。
????????- 這個過程根據需要進行,直到達到某個預定義的深度或滿足某些條件(例如,每個葉節點包含的點數不超過某個閾值)。
3.節點存儲:
????????- 內部節點存儲其子節點的信息。
????????- 葉節點存儲包含在該立方體中的點或其他數據。
二、代碼實現
2.1關鍵函數
Open3D中的open3d.geometry.Octree可用于創建、搜索、遍歷具有用戶指定的最大樹深度max_depth的八叉樹。
convert_from_point_cloud(self, point_cloud, size_expand=0.01)
從點云中構建八叉樹
- point_cloud:為輸入的點云數據
- size_expand :一個小的擴展尺寸,使八叉樹比原來的點云邊界略大,以容納所有的點。(默認值為:0.01m)
2.2完整代碼
import numpy as np
import open3d as o3dpcd = o3d.io.read_point_cloud("Chair.pcd")
point = np.asarray(pcd.points)
N = point.shape[0]
# 點云隨機著色
pcd.colors = o3d.utility.Vector3dVector(np.random.uniform(0, 1, size=(N, 3)))
# 可視化點云
o3d.visualization.draw_geometries([pcd], window_name="原始點云",width=1024, height=768,left=50, top=50)
# 創建八叉樹, 樹深為9
octree = o3d.geometry.Octree(max_depth=9)
# 從點云中構建八叉樹,適當擴展邊界0.001m
octree.convert_from_point_cloud(pcd, size_expand=0.001)
# 可視化八叉樹
o3d.visualization.draw_geometries([octree], window_name="可視化八叉樹",width=1024, height=768,left=50, top=50)