recover_pose — 3D two_view op

• 資料種類:image2d × image2d → pose

• 呼叫: import fullseye as fs; fs.ledger.recover_pose(pts1, pts2, K1, K2=None, planar_tol=3.0)(要直接呼叫實作,import twoview; twoview.recover_pose(pts1, pts2, K1, K2=None, planar_tol=3.0);從台帳取用則 ops3d.get("recover_pose"))

• GPU:無(僅 CPU 參考實作)

用法

由對應點 + K 恢復相對姿態 (R,t) 與 3D 結構(用 cheirality 消歧)。→ (R, t_unit, points3d)。

t 的尺度不定,因此為單位向量。points3d 在 cam1 座標系中(對應 |t|=1 的尺度)。

fail-closed:平面(共面 3D)/純旋轉場景是本質矩陣分解的退化配置,Sampson 殘差維持 ~0 卻回傳錯誤的平移方向(表面上完美)。這類輸入無法還原位姿,因此以 ValueError 明確拒絕(請使用單應性分解)。planar_tol 是與視差、尺度無關的平面度閾值(_planar_degeneracy_ratio = H 與 F 擬合程度之比小於它即判定為退化。預設 3.0)。

步驟:

• 入口檢查(8 個點以上、點數一致、(N,2) 且有限)。

• 平面度:同時以正規化 DLT 擬合單應性 H、以正規化 8 點法擬合 F,求按自由度正規化的殘差尺度之比 σ_H / σ_F(_planar_degeneracy_ratio)。若小於 planar_tol(預設 3.0)則 ValueError。平面與純旋轉約為 √2,非平面則與視差 / 雜訊成比例地變大。H 奇異時比值視為 0,同樣拒絕。恰好 8 點時無法從 F 的殘差測得雜訊,因此使用以往的判定(H 殘差中位數 / 點的散布 < 1e-2,與視差成比例)。

• ★2026-11-05(對抗性驗證 G11):以往的比值(H 殘差 / 點的散布,預設 1e-2)與視差成比例,即使非平面在基線小時也會被拒絕(camera.recover_pose 能解同一資料)。反之雜訊大時連平面也會放行(σ = 2 px 時比值超過 1e-2)。新比值修正了這兩點。

• essential_8point → 分解為 4 個候選 (R, ±t) → 對每個候選做 triangulate,取兩台相機中深度 > 0 的點數最多的候選(數量相同時取前面的候選)。

回傳值:R (3,3)、t (3,) 單位向量、points3d (N,3)。慣例為 cam1 = K1[I|0]、cam2 = K2[R|t],X2 = R X1 + t。points3d 在 cam1 座標系中,尺度為 |t|=1。視線平行的對應為 NaN 列。

• 省略 K2 時兩張影像都用 K1。

• 對離群值毫無防備(不做 RANSAC)。請在前段去除誤對應。

• 決定性。GT 驗證用 pose_error,殘差用 sampson_distance。

背景知識指南(該運算子背後的物理與規範)

• depth_sensors — 深度感測器知識 —— 測距原理、實機數值、缺測的表現

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• two_view_pose — py -3.11 examples_3d/two_view_pose.py

型別可銜接的下一個運算子(可接受 pose 作為輸入)

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

同類別(two_view)

fundamental_8point · essential_8point · triangulate · sampson_distance


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

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