dlt_pose — 3D pose_estimation op

• 데이터 종류: points × keypoints → pose

• 호출: import fullseye as fs; fs.ledger.dlt_pose(points_3d, points_2d, K)(구현을 직접 호출하려면 import pnp3d; pnp3d.dlt_pose(points_3d, points_2d, K), 원장에서 가져오려면 ops3d.get("dlt_pose"))

사용법

DLT 로 3D-2D 대응에서 카메라 자세를 복원(K 기지). → (R (3,3), t (3,)). 6 점 이상 필요.

pnp_pose의 (R, t) 부분(정규화 DLT + 평면 PnP 분기 + LM 정밀화). 재투영 RMS도 필요하면 pnp_pose를 쓴다. 공면 입력(체커보드 등)은 평면 PnP로자동으로 분배한다(이전 구현은 fail-closed(실패 시 거부)로 거부했지만, 올바르게 풀 수 있으므로 푼다).

절차(모듈 함수 pnp3d.pnp_pose를 refine=True로 호출):

• 화소를 K⁻¹로 정규화 영상 좌표로, 3D 점은 Hartley 정규화(무게중심을 원점, 평균 거리 √3)하여 DLT(미지수 12개의 SVD)를 푼다.

• 공면도(공분산의 최소/최대 고윳값 비의 제곱근)가 0.05 미만이면 평면 PnP(호모그래피 분해)도 후보에 더하고, 엄밀히 평면(3번째 퍼짐이 0)이면 DLT를 생략한다.

• 각 후보를 재투영 오차의 Levenberg-Marquardt(최대 30회 반복)로 정밀화하고, 전방 점(깊이 > 0)의 비율이 최대, 같으면 재투영 RMS가 최소인 후보를 채택한다.

반환값: R (3,3) 회전(det=+1), t (3,)(월드 좌표와 같은 단위). 규약 Xc = R X + t, x ≅ K Xc.

Raises ValueError: points_2d가 (N,2)가 아님(영상을 넘긴 경우 지목해 거부) / points_3d가 (N,3)이 아님 / 비유한 / 6점 미만 / 점 수 불일치 / 모든 점이 한 직선 위이거나 한 점.

주의: 이상값에는 무방비(모든 점을 동등하게 사용). 오대응이 있으면 pnp_ransac. 결정론적(난수 없음). 평가는 reprojection_error, GT와의 비교는 pose_error.

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

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

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

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

• pnp_pose_outliers — py -3.11 examples_3d/pnp_pose_outliers.py

• pose_estimation — py -3.11 examples_3d/pose_estimation.py

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

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

같은 카테고리(pose_estimation)

pnp_ransac · reprojection_error


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

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