register_spin — 3D feature_register op

• 資料種類:points × points → pose

• 呼叫: import fullseye as fs; fs.ledger.register_spin(src, dst, device='cpu', n_keypoints=220, normal_k=18, support_radius=None, n_alpha=16, n_beta=16, support_angle_deg=60.0, lowe_ratio=0.85, ransac_iters=4000, inlier_thr=None, min_inliers=8, seed=0)(要直接呼叫實作,import feat_spin; feat_spin.register_spin(src, dst, device='cpu', n_keypoints=220, normal_k=18, support_radius=None, n_alpha=16, n_beta=16, support_angle_deg=60.0, lowe_ratio=0.85, ransac_iters=4000, inlier_thr=None, min_inliers=8, seed=0);從台帳取用則 ops3d.get("register_spin"))

用法

用 Spin Image 描述子 + RANSAC 的無初值稀疏特徵剛體配準。

在沒有任何初始位姿先驗的情況下,對 2 個點雲 src (N,3)、dst (M,3) 進行對位。以各點的法線(局部 PCA,符號統一為從質心向外 = 對剛體變換不變)為軸,將鄰域點「旋轉(spin)」累積到 (α=到軸的距離, β=沿軸方向的高度) 的 2D 直方圖中, 為每個 keypoint 建立 Spin Image 描述子(Johnson & Hebert 1997),在描述子空間中以最近鄰進行匹配(以 Lowe ratio test 篩選),再以 RANSAC(3 點最小樣本 + Kabsch) 估計對離群值穩健的剛體變換。與稠密匹配(NCC/相位相關/Hough)或 PCA 主軸對齊不同,即使在大旋轉 + 部分重疊下也能從局部特徵的對應還原位姿,因此可用作 ICP 的前級(提供 coarse init)。回傳的位姿遵循 dst ~= src @ R.T + t (= R @ src_i + t)的慣例(與 icp_point2point_3d 相同)。

參數:

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

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

device: torch 裝置("cpu" 等)。在其上求解 SVD/最終位姿。

n_keypoints: 從各點雲擷取的 keypoint 數(等間隔子取樣)。

normal_k: 法線估計所用的鄰域點數(局部 PCA)。

support_radius: Spin Image 的支撐半徑。None 時為各點雲分別量測的 bbox 對角線(取較大者)

的 0.30 倍(為避免被未知平移汙染,不取聯集而是分別量測)。

n_alpha, n_beta: Spin Image 的 (α, β) 分箱數(描述子為 n_alpha*n_beta 維)。

support_angle_deg: 支撐角閾值(度)。只累積法線與 keypoint 法線夾角在此角度以內的

支撐點(對遮擋、背面穩健)。>=90 時無效。

lowe_ratio: Lowe 比率測試閾值(只採用 d1 < ratio*d2 的對應)。

ransac_iters: RANSAC 迭代次數。

inlier_thr: RANSAC 的內點距離閾值。None 時為 bbox 對角線的 0.04 倍。

min_inliers: 視為有效位姿的最少內點數(ok 判定)。

seed: RANSAC 亂數種子。

回傳值:

R: (3,3) torch.Tensor。滿足 dst ~= src @ R.T + t 的旋轉。

t: (3,) torch.Tensor。平移。

info: dict。"n_matches"(通過 ratio test 的對應數), "inliers"(RANSAC 最終),

"inlier_ratio", "rmse"(內點上的 RMSE), "support_radius",

"inlier_thr", "ok"(是否不少於 min_inliers)。

注意:

• 描述子取決於法線符號。從質心向外的符號統一,對於法線大致呈放射狀、n·(p-質心) 的符號穩定的形狀(lumpy 的閉曲面等)有效。在薄板、管狀等 n·(p-質心)≈0 的區域較多的形狀上,符號可能在 2 個點雲之間翻轉。

• 平面、球等曲率在空間上均勻的部位描述子會退化,ratio test 會使對應消失(不適合無特徵形狀)。overlap 低於約 60% 時成功率驟降,失敗時 RANSAC 可能鎖定在幾何上一致但錯誤的解上,導致災難性誤差(建議併用 ok / inlier_ratio 閘門)。

背景知識指南(該運算子背後的物理與規範)

• blas_threads_and_memory — 矩陣分解為何慢 —— BLAS 執行緒、快取、記憶體配置

參考(範例資料、文獻)

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

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

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

• feature_register — py -3.11 examples_3d/feature_register.py

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

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

同類別(feature_register)

harris3d_keypoints · iss_keypoints · compute_fpfh · shot_descriptor · register_fpfh · register_shot


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

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