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(失敗即拒絕)方式拒絕,但由於能正確求解,所以求解)。

步驟(以 refine=True 呼叫模組函式 pnp3d.pnp_pose):

• 像素用 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。

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 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 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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