recover_pose — 3D two_view op

• 資料種類:image2d × image2d → pose

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

用法

由對應點 + 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 的回傳值小於它即判定為退化)。

步驟:

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

• 平面度:以正規化 DLT 擬合單應性 H,求對稱轉移殘差的中位數除以兩張影像中點的散布(到質心的平均距離之和)的比值。若小於 planar_tol(預設 1e-2)則 ValueError。H 奇異時比值視為 0,同樣拒絕。

• 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.