triangulate — 3D two_view op

• Data kinds: image2d × image2d → points

• Call: import fullseye as fs; fs.ledger.triangulate(pts1, pts2, P1, P2) (implementation को सीधे call करना हो तो import twoview; twoview.triangulate(pts1, pts2, P1, P2), registry से लेना हो तो ops3d.get("triangulate"))

उपयोग

DLT triangulation: 2 views के corresponding points + projection matrices → 3D points। → (N,3)।

अनंत पर स्थित points NaN के रूप में लौटते हैं (±inf नहीं)। homogeneous coordinate का चौथा (4) घटक 0 होना = 2 lines of sight समानांतर हैं, और वह correspondence कोई finite 3-D point तय नहीं करता। पहले सीधे भाग देकर ±inf निकलता था, लेकिन तब आगे का cheirality परीक्षण depth > 0 inf को "camera के सामने" गिन लेता है (inf > 0 True है)। recover_pose 4 (R, t) candidates में से सामने के सबसे अधिक points वाला चुनता है, इसलिए अनंत वाले points को वोट मिलें तो candidate का चयन चुपचाप बिगड़ जाता है। NaN हो तो तुलना False होती है, और वे गिने नहीं जाते (2026-09-02, chain_fuzz के वहाँ पहुँचने पर पता चला)।

लगभग समानांतर पर पूरी तरह समानांतर न होने वाले correspondence बड़े finite मान के रूप में लौटते हैं। इसे NaN से नहीं पकड़ा जा सकता, इसलिए caller को दूरी की उचितता जाँचनी होगी।

Raises ValueError: points (N,2) न हों / non-finite हों / correspondence की संख्या मेल न खाए।

पूरक:

• P1, P2 (3,4) के projection matrix (K[R|t]) हैं। correspondence points उसी P वाले pixel coordinate system के (N,2) हैं। cam1 को आधार मानें तो P1 = K1[I|0]।

• हर point के लिए 4×4 coefficient matrix का SVD करने वाला Python loop (points की संख्या के अनुपात में)। return value float64 (N,3) है।

• depth के धन/ऋण (cheirality) की जाँच नहीं होती। आगे/पीछे का निर्णय चाहिए तो परिणाम का z और R X + t का z देखें (recover_pose यह अंदर करता है)।

• हल की इकाई P के translation t जैसी ही है। recover_pose से आए P के लिए scale |t|=1 है।

• deterministic। (N,2) न होना, non-finite, या points की संख्या में बेमेल ValueError देता है।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• depth_sensors — Depth sensors — ranging के सिद्धांत, असली devices के आँकड़े, dropouts कैसे दिखते हैं

संदर्भ (sample data, साहित्य)

• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।

• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• sfm_recon — py -3.11 examples_3d/sfm_recon.py

वे अगले ops जिनसे type जुड़ता है (points को input के रूप में लेते हैं)

points_to_voxel · gaussians_to_voxel · estimate_point_normals · to_points · match_points_ncc · match_pca · moment_axes · icp_point2point_3d

इसी category के (two_view)

fundamental_8point · essential_8point · recover_pose · sampson_distance


*Provenance: twoview.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

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