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"))

• GPU: 없음(CPU 참조 구현만)

사용법

점군을 point-to-point ICP(Kabsch/SVD)로 정련합니다.

거친 일치 추정 (정수 NCC / Fourier-Mellin ± 3 ° / Hough ± 0.5 voxel)에서 얻은초기 자세 (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이면 0 벡터입니다.

tol: RMSE의 상대 개선이 이 값보다 낮으면 수렴 중단.

max_corr_dist: 이 거리를 넘는 대응을 이상치로서 기각(None 로 무효).

trim_ratio: 0<r<=1. 각 반복에서 최근 방거리가 작은 상위 r 할인 대응 만

채택하는 Trimmed ICP. 부분 중첩(중첩율 r)에 유효. None에서 유효하지 않습니다.

device: 반환값을 배치하는 torch 디바이스("cpu" 등). SVD는 CPU의 NumPy로 해결됩니다.

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).

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

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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