icp_point2point_3d — 3D refine op

• 資料種類:points × points → pose

• 呼叫: import fullseye as fs; fs.ledger.icp_point2point_3d(src, dst, iters=50, init_R=None, init_t=None, tol=1e-06, max_corr_dist=None, trim_ratio=None, device='cpu', reproducible=False)(要直接呼叫實作,import match3d; match3d.icp_point2point_3d(src, dst, iters=50, init_R=None, init_t=None, tol=1e-06, max_corr_dist=None, trim_ratio=None, device='cpu', reproducible=False);從台帳取用則 ops3d.get("icp_point2point_3d"))

用法

用 point-to-point ICP(Kabsch/SVD)精化點群。

以粗匹配估計(整數NCC / Fourier-Mellin±3° / Hough±0.5voxel)得到的初始位姿 (init_R, init_t) 為起點,透過剛體變換將 src 側點雲對位到 dst 側點雲。每次迭代重新建立最近鄰對應(cKDTree),以 Kabsch 演算法(SVD)求相對旋轉、平移並累積,因此即使對應關係未知, 也能收斂到次體素精度。

對部分重疊、離群值,以 Trimmed ICP(只採用距離小的對應)與絕對距離門檻(max_corr_dist)來處理。最終 RMSE 在實際採用的對應(內點)上評估,因此即使是部分觀測也能正確反映位姿品質。

參數:

src: (N,3) 移動側點雲(torch.Tensor 或 numpy.ndarray)。

dst: (M,3) 固定側(參照)點雲。

iters: 最大迭代次數。

init_R: (3,3) 初始旋轉。None 時為單位矩陣。

init_t: (3,) 初始平移。None 時為零向量。

tol: RMSE 的相對改善低於此值時判定收斂並終止。

max_corr_dist: 超過此距離的對應視為離群值剔除(None 為停用)。

trim_ratio: 0<r<=1。每次迭代只採用最近鄰距離最小的前 r 比例對應的

Trimmed ICP。對部分重疊(重疊率 r)有效。None 為停用。

device: torch 裝置("cpu" 等)。在該裝置上求解 SVD。

reproducible: 為 True 時採用不依賴點的順序、BLAS 執行緒數的歸約(預設 False = 與以往相同)。

平均用 math.fsum,互共變異數 H 用 ozakimm(Ozaki 方案),位姿的套用為逐元素運算,RMSE 也用 math.fsum。

即使打亂 src 點的順序,R、t、rmse 也逐位元相同(同一電腦、同一 LAPACK 上)。在 trim_ratio 的分界處

距離恰好相同的點,其選取可能隨順序而變。20 萬點時每 1 次迭代由 0.7 ms 變為約 170 ms。

回傳值:

R: (3,3) 旋轉。滿足 dst ~= src @ R.T + t。有 torch 的環境下為 torch.Tensor,否則為相同值的 numpy.ndarray(2026-09-07

將主體改為 numpy 時,為了相容仍保留了該型別)。

★同一族的 icp_point2plane 一律回傳 numpy —— 族內

型別不一致,因此在下游經過 np.asarray(R) 較為安全

(兩者都能運作。為避免破壞性變更而保留了這種不一致)。

t: (3,) 平移(與 R 同型別)。

info: dict。"rmse"(採用對應上的最終RMSE), "iters"(實際迭代次數),

"converged"(bool), "inliers"(採用的對應數), "rmse_history"(list)。

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• gicp_register — py -3.11 examples_3d/gicp_register.py

• itokawa_self_register — py -3.11 examples_3d/itokawa_self_register.py

• itokawa_shape_match — py -3.11 examples_3d/itokawa_shape_match.py

• partial_overlap_icp — py -3.11 examples_3d/partial_overlap_icp.py

型別可銜接的下一個運算子(可接受 pose 作為輸入)

fuse_to_voxel · pose_error · bundle_adjust · mean_reprojection_error · optimize_pose_graph · relative_pose · mean_edge_error · rotation_translation_error

同類別(refine)

refine_peak_newton · refine_translation_lk · refine_lm · refine_rotation_z · icp_point2plane


*Provenance: match3d.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.