space_carving op• 資料種類:images → voxel
• 呼叫: 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'(要直接呼叫實作,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';從台帳取用則 ops3d.get("visual_hull"))
把多視角輪廓的 visual hull 作為體素佔據回傳(carve 的別名)。
參數、回傳值、例外與 carve 完全相同(內部只是直接呼叫 carve)。
• silhouettes: 將各相機的前景遮罩 (H,W) bool 排成 M 個的串列(尺寸可以因相機而不同)。
• Ks/Rs/ts: 各相機的內部矩陣 (3,3)、旋轉 (3,3)、平移 (3,)。投影慣例為 X_cam = R @ X_world + t,pixel = (K @ X_cam)[:2] / Z(OpenCV 風格)。像素四捨五入到最近鄰。
• bounds: ((xmin,xmax),(ymin,ymax),(zmin,zmax)) 的雕刻區域(各軸必須 max > min)。
• res: 各軸的 voxel 分割數(正整數)。voxel 總數 res**3。
回傳值為 (res,res,res) bool。indexing='ij' 時軸為 (x,y,z),vox[i,j,k] 的中心為 (xmin+(i+.5)dx, ymin+(j+.5)dy, zmin+(k+.5)dz)。voxel 保留的條件是,在所有相機中都滿足「在相機前方(Z>0)、在影像內、該像素為剪影前景」(AND)。只要有 1 台不滿足就會被削去。
fail-closed(失敗即拒絕): 串列長度不一致、相機 0 台、res <= 0、退化 bounds 全部為 ValueError (0 台時不會把「全部 voxel 佔據」偽裝成重建結果回傳)。
注意: visual hull 是物體的超集,任何相機都看不到的凹陷會保持填滿。若把剪影做成像 synthesize_silhouette 那樣膨脹 1 像素的覆蓋遮罩,就能避免因離散化誤差削掉物體 voxel 的遺漏。結果可用 voxel_to_mesh 網格化,也可直接用作 esdf 的佔據輸入。
• blender_interop — 與 Blender 搭配使用 —— 在 Blender 中建形、用 fullseye 量測(座標軸、單位、真值資料的陷阱)
• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。
• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。
• space_carving — py -3.11 examples_3d/space_carving.py
voxel 作為輸入)voxel_to_mips · voxel_to_mesh · signed_distance_field · to_points · sobel3d · hessian3d · curvature_maps · edt_jfa
space_carving)carve · synthesize_silhouette · carve_look_at
*Provenance: visualhull.py — 3D 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.