two_view opimage2d × image2d → pointsimport fullseye as fs; fs.ledger.triangulate(pts1, pts2, P1, P2) (実装を直接呼ぶなら import twoview; twoview.triangulate(pts1, pts2, P1, P2)、台帳から引くなら ops3d.get("triangulate"))DLT 三角測量: 2 視点の対応点 + 射影行列 → 3D 点。→ (N,3)。
無限遠点は NaN で返す(±inf にはしない)。同次座標の第 4 成分が 0 =
2 本の視線が平行で、その対応は有限の 3-D 点を決めない。以前はそのまま割って
±inf を出していたが、それだと下流の cheirality 判定 depth > 0 が
inf を「カメラ前方」として数える(inf > 0 は True)。
:func:recover_pose は 4 つの (R, t) 候補のうち前方点が最多のものを選ぶので、
無限遠点が票を持つと候補選択が静かに歪む。NaN なら比較が False になり、
数えられずに済む(2026-09-02、chain_fuzz が到達して発覚)。
ほぼ平行だが厳密には平行でない対応は、大きな有限値として返る。これは NaN では拾えないので、呼び手側で距離の妥当性を見る必要がある。
Raises ValueError: 点が (N,2) でない/非有限/対応数不一致。
補足:
P1, P2 は (3,4) の射影行列(K[R|t])。対応点はその P と同じ画素座標系の (N,2)。cam1 を基準にするなら P1 = K1[I|0]。R X + t の z を見る(recover_pose が内部で行う)。解の単位は P の並進 t と同じ。recover_pose 由来の P なら |
t | =1 のスケール。 |
ValueError。py -3.11 examples_3d/sfm_recon.pypoints を入力に取れる)points_to_voxel · gaussians_to_voxel · estimate_point_normals · to_points · match_points_ncc · match_pca · moment_axes · icp_point2point_3d
two_view)fundamental_8point · essential_8point · recover_pose · 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.