visual_hull — 3D space_carving op

• Data kinds: images → voxel

• Call: import fullseye as fs; fs.ledger.visual_hull(silhouettes: 'Sequence[np.ndarray]', Ks: 'Sequence[np.ndarray]', Rs: 'Sequence[np.ndarray]', ts: 'Sequence[np.ndarray]', bounds: 'Bounds', res: 'int') -> 'np.ndarray' (implementation को सीधे call करना हो तो import visualhull; visualhull.visual_hull(silhouettes: 'Sequence[np.ndarray]', Ks: 'Sequence[np.ndarray]', Rs: 'Sequence[np.ndarray]', ts: 'Sequence[np.ndarray]', bounds: 'Bounds', res: 'int') -> 'np.ndarray', registry से लेना हो तो ops3d.get("visual_hull"))

उपयोग

multi-view silhouettes का visual hull voxel occupancy के रूप में लौटाता है (carve का दूसरा नाम)।

arguments, return value और exceptions carve जैसे ही हैं (अंदर से यह सीधे carve को ही call करता है)।

• silhouettes: हर camera के foreground mask (H,W) bool की M वाली list (size हर camera में अलग हो सकता है)।

• Ks/Rs/ts: हर camera का intrinsic matrix (3,3), rotation (3,3) और translation (3,)। projection convention X_cam = R @ X_world + t, pixel = (K @ X_cam)[:2] / Z (OpenCV style) है। pixel को nearest neighbour पर round किया जाता है।

• bounds: ((xmin,xmax),(ymin,ymax),(zmin,zmax)) carving क्षेत्र (हर axis पर max > min ज़रूरी)।

• res: हर axis पर voxel divisions की संख्या (धनात्मक integer)। कुल voxels res**3।

return value (res,res,res) bool है। indexing='ij' में axes (x,y,z) हैं, और vox[i,j,k] का centre (xmin+(i+.5)dx, ymin+(j+.5)dy, zmin+(k+.5)dz) है। voxel तभी बचता है जब सभी cameras में "camera के सामने (Z>0), image के अंदर, और वह pixel silhouette foreground" पूरा हो (AND)। 1 camera में भी बाहर हो तो carve हो जाता है।

fail-closed: lists की लंबाई में बेमेल, 0 cameras, res <= 0 और degenerate bounds सभी पर ValueError (0 cameras पर "सभी voxels occupied" को reconstruction परिणाम बताकर नहीं लौटाता)।

ध्यान दें: visual hull object का superset है, और किसी भी camera से न दिखने वाले गड्ढे भरे ही रहते हैं। silhouettes को synthesize_silhouette की तरह 1 pixel मोटा किया हुआ coverage mask बनाने पर, discretisation error से object voxels के कट जाने की चूक से बचा जा सकता है। परिणाम को voxel_to_mesh से mesh बनाया जा सकता है, और esdf के occupancy input के रूप में भी सीधे इस्तेमाल किया जा सकता है।

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

• blender_interop — Blender के साथ उपयोग — shape बनाएँ, fullseye से मापें (सावधानियाँ: axes, units, ground truth)

संदर्भ (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 करते हैं)

• space_carving — py -3.11 examples_3d/space_carving.py

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

voxel_to_mips · voxel_to_mesh · signed_distance_field · to_points · sobel3d · hessian3d · curvature_maps · edt_jfa

इसी category के (space_carving)

carve · synthesize_silhouette · carve_look_at


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

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