two_view opimage2d × image2d → poseimport 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 の戻り値がこれ未満なら退化と判定)。
手順:
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 を両画像に使う。pose_error、残差は sampson_distance。py -3.11 examples_3d/two_view_pose.pypose を入力に取れる)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 operator registry. この per-op ノートは tools/opdocs.py md が自動生成(手編集しない)。
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.