triangulate_column — 3D structured_light op

• Data kinds: image2d → depth

• Call: import fullseye as fs; fs.ledger.triangulate_column(column, k_cam, k_proj, rot, trans) -> 'np.ndarray' (implementation को सीधे call करना हो तो import fringe; fringe.triangulate_column(column, k_cam, k_proj, rot, trans) -> 'np.ndarray', registry से लेना हो तो ops3d.get("triangulate_column"))

उपयोग

हर camera pixel के "projector column number" से depth Z को triangulate करता है (structured light का अंतिम stage)।

structured-light scanner की geometry ख़ुद: camera pixel (u,v) 1 line of sight बनाता है, और projector का column number u_p 1 plane बनाता है (projector center और उस column वाला plane)। line of sight और plane का intersection surface का 3D point है, और उसका camera-frame Z ही depth है। यह closed form है, इसलिए न iteration चाहिए न optimisation।

column: (H, W) projector column numbers (sub-pixel real values)। phase से निकाले गए मान सीधे

दिए जा सकते हैं। NaN = अनिर्धारित pixel (output भी NaN)।

k_cam: camera intrinsic matrix 3x3 (fx, fy, cx, cy[, skew])। pixel centers integer coordinates पर होते हैं

(render3d.render_mesh / camera.depth_to_points जैसा ही नियम)।

k_proj: projector intrinsic matrix 3x3। सिर्फ़ row 0 (column direction) और row 2 इस्तेमाल होती हैं।

rot: 3x3 rotation। camera frame → projector frame (X_proj = rot·X_cam + trans)।

trans: length 3 का translation (ऊपर जैसा, unit scene जैसी)। zero vector वर्जित है

(baseline 0 = camera और projector एक ही point पर। plane और line of sight नहीं कटते, और depth परिभाषित नहीं होती)।

return value: (H, W) float64 depth map (camera के सामने का Z, render_mesh के depth जैसी ही मात्रा)।

जिन pixels का intersection पीछे है (Z<=0) या जिनकी line of sight plane के समानांतर है, वे NaN होते हैं।

व्युत्पत्ति: X_cam = Z·d (d = K_cam⁻¹[u,v,1])। projector की तरफ़ column condition है (K_proj[0] − u_p·K_proj[2])·X_proj = 0। X_proj = rot·X_cam + trans रखकर Z के लिए हल करने पर Z = −(a·trans) / (a·(rot·d)), a = K_proj[0] − u_p·K_proj[2]।

Raises: गलत shapes या matrices, शून्य baseline, या singular camera matrix पर ValueError।

स्रोत (सार्वजनिक literature): ray और plane के intersection से structured-light triangulation — Hartley & Zisserman, *Multiple View Geometry* 2nd ed. §12 (projective geometry में intersections) / Salvi et al., *Pattern Recognition* 43 2010 (structured-light patterns का वर्गीकरण और decoding)।

पृष्ठभूमि 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 करते हैं)

• structured_light_scan — py -3.11 examples_3d/structured_light_scan.py

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

depth_to_points · tsdf_from_depth · to_points · fuse_to_voxel · depth_to_organized_points · normals_from_depth · occlusion_edges · bearing_angle_image

इसी category के (structured_light)

wrapped_phase · unwrap_phase_2d · graycode_decode · decode_fringe · synthesize_fringes · absolute_phase


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

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