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, 무게중심에서 바깥쪽으로 부호 통일 = 강체 변환에 불변)을 축으로 근방 점을(α=축으로부터의 거리, β=축 방향 높이)의 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_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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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