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.