點雲歸一化的步驟(參照 pointnet++ 的歸一化處理, 源碼出處忘記了...):
1. 將點雲的中心置於原點(0, 0, 0)
2. 根據xyz軸中的最長軸縮放至 [-1, 1]
注意: 此時點雲的 數值范圍是 [-1, 1]
import numpy as np
def normalize_point_cloud(pc):
centroid = np.mean(pc, axis=0) # 求取點雲的中心
pc = pc - centroid # 將點雲中心置於原點 (0, 0, 0)
m = np.max(np.sqrt(np.sum(pc ** 2, axis=1))) # 求取長軸的的長度
pc_normalized = pc / m # 依據長軸將點雲歸一化到 (-1, 1)
return pc_normalized, centroid, m # centroid: 點雲中心, m: 長軸長度, centroid和m可用於keypoints的計算
if __name__ == '__main__':
pc = np.random.rand(2000, 3)
pc_normalized, centroid, m = normalize_point_cloud(pc)
keypoints = np.random.rand(2, 3)
keypoints_normalized = (keypoints - centroid) / m