pnp_ransac — 3D pose_estimation op

• 資料種類:points × keypoints → pose

• 呼叫: import fullseye as fs; fs.ledger.pnp_ransac(points_3d, points_2d, K, thresh=2.0, iters=300, seed=0)(要直接呼叫實作,import pnp3d; pnp3d.pnp_ransac(points_3d, points_2d, K, thresh=2.0, iters=300, seed=0);從台帳取用則 ops3d.get("pnp_ransac"))

用法

對外點穩健的 PnP(RANSAC + 最終 DLT 重擬合)。→ (R, t, inlier_mask, info)。

以 6 點的最小樣本做 DLT(無精細化)→ 最大化重投影誤差 < thresh 的 inlier → 以全部 inlier 用 pnp_pose(有精細化)重新擬合。

Raises ValueError:points_2d 不是 (N,2) / points_3d 不是 (N,3) /

點數不一致 / 少於 6 點 / 非有限。

引數:

• thresh:重投影誤差的閾值 [px] (歐幾里得距離,預設 2.0)。小於此值視為 inlier。

• iters:迭代次數(預設 300)。不提前終止,一定執行這麼多次。每次迭代不放回地抽取 6 點,只求解初始位姿(退化的樣本捨棄並進入下一次)。

• seed:傳給 numpy.random.default_rng(seed)。相同輸入和 seed 時結果可重現。

回傳值:R (3,3)、t (3,)(約定 Xc = R X + t)、inlier_mask bool (N,)、info dict。info 的鍵為 n_inliers / inlier_ratio / iters / rms(最終位姿的重投影 RMS [px],在 inlier 集合上)。

• 最佳樣本的 inlier 少於 6 時,進入以全部點重新求解的 fallback,並附上 info["fallback"] = True。此時 inlier_mask 是以 fallback 位姿重新計數的實測值,因此 inlier_ratio 可能仍以較小值回傳(不捏造共識)。fallback 也失敗則 ValueError。

• inlier 數的比較只在「更多」時更新,因此數量相同時保留先找到的樣本。

• 最終位姿是在全部 inlier 上的重新擬合(有 LM 精細化)。

• Raises ValueError:形狀不正確 / 少於 6 點 / 點數不一致 / 非有限(與 dlt_pose 相同的入口檢查)。

• 評估用 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)

dlt_pose · reprojection_error


*Provenance: pnp3d.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

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