segment_rigid_motions — 3D motion_segment op

• 데이터 종류: points × points → labels

• 호출: import fullseye as fs; fs.ledger.segment_rigid_motions(pts0, pts1, thresh, max_bodies: 'int' = 5, min_inliers=None, n_iter: 'int' = 100, k_sample: 'int' = 6, seed: 'int' = 0) -> 'dict'(구현을 직접 호출하려면 import motion_seg3d; motion_seg3d.segment_rigid_motions(pts0, pts1, thresh, max_bodies: 'int' = 5, min_inliers=None, n_iter: 'int' = 100, k_sample: 'int' = 6, seed: 'int' = 0) -> 'dict', 원장에서 가져오려면 ops3d.get("segment_rigid_motions"))

• 원장 경유의 반환값: fullseye.ledger.segment_rigid_motions(...) 는 선언된 out 형 labels 의 값만 반환합니다(실제 함수는 보조 정보도 반환). 버려진 쪽이 필요하면 fullseye.ledger.segment_rigid_motions.raw(...) 를 쓰거나 motion_seg3d.segment_rigid_motions 를 직접 호출하세요.

• 실제 반환: {"labels", "motions"} → labels

사용법

두 점군을 운동이 일치하는 강체마다 분할(반복 RANSAC 에 의한 multi-body 분할).

먼저 estimate_flow로 관측 흐름(각 pts0 점 -> pts1 최근접)을 구하고, target = pts0 + flow를 대응처로 고정한다. 이후 남은 점 집합에 대해:

1. 공간적으로 가까운 k_sample 점(seed + 그 최근접)을 씨앗으로 Kabsch로 강체 가설을 세우고,

2. 흐름 정합 || (R·s + t) - target(s) || < thresh를 만족하는 inlier를 세고,

3. n_iter 시행에서 유의성 게이트를 만족하는 최선의 가설을 고르고(inlier 잔차 중앙값이 thresh의 일정 비율 미만 = 진짜 강체처럼 잔차가 0 근방에 집중. 무상관/잡음의우연한 적합은 허용 구를 채워 잔차 ≈ 0.6*thresh가 되므로 걸러진다), 그 inlier로 Kabsch 재적합(refine)하며,

4. inlier 수가 min_inliers 이상 이고 refine 후에도 유의성을 유지하면 그것을 1 강체로확정하고 제거한다. 만족하지 않으면 body를 만들지 않고 나머지는 -1인 채로 종료한다(가짜강체를 날조하지 않는다).

를 max_bodies 개 또는 남은 점이 임계값을 밑돌 때까지 반복한다. 어느 강체에도 속하지 않는 남은 점은 labels = -1(outlier / 미대응, 사칭하지 않음). 근방 씨앗 샘플링은 공간적으로 연속인 물체를한꺼번에 잡기 위한 locality prior로, 임계값이 아니라 상대 순위만 쓰므로 스케일 불변이다.

Args:

pts0: (N, 3) 시각 0의 점군.

pts1: (M, 3) 시각 1의 점군(N과 일치할 필요 없음).

thresh: 흐름 정합의 inlier 거리 임계값. 좌표 스케일 상대로 줄 것

(모듈 안에 절대 epsilon을 갖지 않으므로 호출자가 좌표계에 맞춘다).

max_bodies: 추출할 강체 수의 상한(>= 1).

min_inliers: 1 강체로 인정하는 최소 inlier 수. None이면 max(3, round(0.1*N)).

outlier 덩어리를 가짜 강체로 만들지 않기 위한 하한.

n_iter: 강체 1 개당 RANSAC 시행 횟수.

k_sample: 1 가설을 만드는 씨앗 샘플의 점 수(seed + 최근접, >= 3).

seed: RANSAC 난수 시드(재현성).

Returns:

dict: {"labels": (N,) int(각 점의 강체 id, 0..K-1 / outlier=-1), "motions": [(R, t), ...] (id 순의 강체 변환, K 개)}.

Raises:

ValueError: 형상 부정 / 비유한 / pts1 비어 있음 / thresh <= 0 / max_bodies < 1 /

k_sample < 3.

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

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

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

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

• motion_seg — py -3.11 examples_3d/motion_seg.py

타입이 이어지는 다음 연산자(labels 를 입력으로 받는 것)

fuse_to_voxel · vol_region_props

같은 카테고리(motion_segment)

estimate_flow · fit_rigid


*Provenance: motion_seg3d.py — 3D 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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