SHA256
2.1 KiB
2.1 KiB
Pipeline
The rewrite follows the original Python design but reorders the stages so cubemap runs before masks: masks run on the cube-face images directly, which avoids a wasteful equirect→cubemap→equirect round-trip.
Output layout
out/
01_frames/ selected sharpest equirect frames (multi-video → <stem> prefix)
02_masks/ (legacy; no longer written by `all`)
03_cubemap/
images/ {stem}_{FACE}.{ext} (equirect → 6 cube faces)
masks/ {stem}_{FACE}.{ext}.png (per-face masks)
04_colmap/
images/ {FACE}/{stem}.{ext} (nested COLMAP tree)
masks/ {FACE}/{stem}.{ext}.png
rig_config.json rig cameras / intrinsics
FACE ∈ {F, R, B, L, U, D}. The nested {FACE}/… tree is produced via
symlink / hardlink / copy (--rig-link-mode).
Stage details
- Extract — decodes the video(s) with ffmpeg, computes per-frame GPU
sharpness (variance-of-Laplacian), exposure, and contrast, optionally
filters out blurry / badly exposed / flat frames, checks inter-frame motion
(parallax), then selects the sharpest frame per chunk (or spreads them out).
Writes
_sharpness_metadata_<stem>.csvso the analysis is reused on subsequent runs. - Cubemap — projects each equirect frame to six square cube faces on the
GPU (a faithful port of
py360convert.e2c), batched for throughput. - Masks — runs YOLO11x-seg on each cube face, synthesizes a binary mask (COLMAP convention: black = excluded), and writes it next to the face image. See GPU.
- Rig — scans the cubemap images + masks, writes
rig_config.json(PINHOLE intrinsics + per-facecam_from_rig_rotation), and links the nested COLMAP tree.
Naming / mask convention
- Masks are named
<image_filename>.png(henceframe_00001_F.png.png). - In a mask, black pixels are excluded (movable objects); white pixels are kept (the static scene used for reconstruction). Masks mirror the image tree so COLMAP attaches them to the right cameras.