register_spin — 3D feature_register op

데이터 종류: points × pointspose

호출: 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、重心から外向きに符号統一 = 剛体変換で不変)を軸として近傍点を

(α=軸からの距離, β=軸方向の高さ) の 2D ヒストグラムへ「回転(spin)」蓄積した

Spin Image 記述子(Johnson & Hebert 1997)を keypoint ごとに作り、記述子空間の

最近傍でマッチ(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 スレッド・キャッシュ・メモリ配置

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL URL.

• 연산자의 내력·참고문헌 —— 이 연산자 족의 바탕이 된 연구/기법의 출처.

실행 가능한 예제(이 연산자를 실제로 호출하는 검증된 샘플)

feature_registerpy -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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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