Releases: chordee/colmap-camera-tracking
Releases · chordee/colmap-camera-tracking
Release list
v0.2.3
Highlights
- JPG sequence input (#14):
autotracker.pynow accepts JPG sequences in addition to video files and EXR sequences, using the same layout rules — a subfolder of*.jpg/*.jpegper sequence, or loose frames passed directly as<input_dir>.- Frames are renumbered to a contiguous
frame_%06d.jpg. With--scale 1.0they are copied byte-for-byte (no JPEG recompression); other scales resize withINTER_AREA. - No colour management — JPGs are already display-referred;
--acescg/--lutare ignored for JPG input.
- Frames are renumbered to a contiguous
Other changes
- Case-insensitive sequence detection: extension matching now handles
.JPG/.JPEG/.EXR(common camera/export outputs) via a shared_list_frameshelper. This also fixes pre-existing lowercase-only matching in the EXR path that could skip/drop frames on case-sensitive filesystems. - Input discovery generalised from EXR-only to any image sequence (
_sequence_kind→"exr"/"jpg"/None), keeping the loose-frames-in-root handling and the mixed-content warning. - README documents JPG sequences across the intro, Features, Input types, arguments, masking, and pipeline sections.
Full changelog: v0.2.2...v0.2.3
v0.2.2
Highlights
- EXR sequence input (#13):
autotracker.pynow accepts linear EXR sequences in addition to video files, so EXR plates can be tracked without a manual pre-conversion step.- Two layouts: one subfolder of
*.exrper sequence (<input_dir>/shotA/*.exr), or a directory of loose*.exrframes passed directly as<input_dir>. - EXR frames are converted to JPG with OpenCV (linear → sRGB, highlights clipped); frames are renumbered to a contiguous
frame_%06d.jpgso downstream naming matches the video path. --acescgapplies an exact ACEScg (AP1, D60) → linear Rec.709 (D65, Bradford) matrix before the sRGB transfer for ACES-linear sources. (--lutis FFmpeg-only and ignored for EXR.)
- Two layouts: one subfolder of
Other changes
- Top-level input discovery is filtered to known video extensions, so stray files / loose EXR no longer get fed to FFmpeg.
- A
[WARN]is emitted when both loose EXR frames and EXR subfolders are present in the input directory (both are processed as separate scenes). - GUI: input field/validation reworded to reflect video + EXR input (the existing ACEScg checkbox already drives the EXR colour path).
- README: documents input types, EXR colour handling, mask auto-detection for EXR, and the
--acescgcolour-accuracy difference between the EXR and video paths.
Full changelog: v0.2.1...v0.2.2
v0.2.1
Highlights
- COLMAP/OpenCV → Houdini coordinate conversion (#12):
build_houdini_scene.pynow converts both the camera and the point cloud into Houdini's Y-up world via anRx(180)rotation (flip Y and Z). Previously the scene imported flipped/mirrored relative to the reference footage. Both halves use the same proper rotation (det = +1), so the result is upright and un-mirrored. Verified in Houdini against the demo footage.
Other changes
build_houdini_scene.pycleanups: dropped the unusedglobal_scale/cam_nameparameters, guarded missingtransform_matrixframes, switched the headless early-exit fromhou.ui.displayMessagetoprint, and fixed a shadowed variable name.- GUI: removed the "Treat each video as a separate camera (multi-cams)" checkbox — the backend behaviour isn't finished yet, so the option is hidden until it lands. The CLI
--multi-camsflag is retained. - README: documents the new coordinate conversion.
Full changelog: v0.2.0...v0.2.1
v0.2.0
Highlights
- PySide6 GUI (
gui_autotracker.py) — tabbed UI wrappingrun_autotracker.pywith real-time log streaming, path validation, and a Copy Command button that mirrors the current settings into a CLI invocation on the clipboard. - Per-video focal-length specification — pass
--focal_length_mm(with--sensor_width_mmfor the physical sensor) so COLMAP is locked to the known intrinsics instead of estimating them. The pixel focal length is written into EXIF, used asImageReader.camera_params, and pinned via abundle_adjusterpass. - Robust resume detection — incomplete scene folders are now detected by the absence of
sparse/0/cameras.binand surfaced as[WARN]instead of being silently re-skipped; downstream steps (PLY export / colmap2nerf / undistortion / Houdini) are gated on the same marker so a failed run no longer cascades into JSON corruption.
Behaviour changes (read before upgrading)
--camera_modeldefault changed fromautotoSIMPLE_RADIAL. Pipelines that relied on COLMAP picking the model should pass--camera_model OPENCV(or whatever their previous behaviour produced) explicitly. The GUI still exposes(auto).undistortionNerfstudioColmap.py --json_pathrenamed to--original_jsonfor consistency withrestore_distortion.py. Any external scripts calling it directly need updating.
Bug fixes
- COLMAP
camera_paramsstrings emitted forSIMPLE_RADIALwere missing the trailingkvalue (3 of 4 params), andSIMPLE_PINHOLEfell through to the 8-valueOPENCVdefault. Each supported model now emits the exact parameter count COLMAP expects (caught by CodeRabbit on PR #9). restore_distortion.pyno longer remaps frames whose size doesn't match the calibration's canvas — those frames are now skipped with a clear warning instead of producing garbled output. The expected size also correctly accounts for the K_orig canvas in expand-mode undistort.build_houdini_scene.pynow creates the point-cloudgeoinside the sameNeRF_Importsubnet as the camera, destroys any priorScenenode before recreating it (so re-runs don't accumulateScene1,Scene2, …), wires its input to the subnet's indirect input, and guards against the missing-subnet case whencreate_animated_camerabails out early.run_autotracker.pyno longer copiescolmap2nerf.pyinto the output directory or mutates the global cwd — invokes the script in place via an absolute path withcwd=output_path.
Repo hygiene
- 9 MB
vocab_tree_faiss_flickr100K_words32K.binremoved from version control and replaced with a download note pointing at https://demuc.de/colmap/. pyproject.tomldescription / authors / license / repository URL filled in.README.mddocuments thebatch_run.pyfolder discovery rules and the actual on-disk output layout.
Pull requests merged
- #4 — PySide6 GUI wrapper + untrack vocab tree binary
- #5 — Resume detection + downstream gating
- #6 — Resolution-mismatch skip in
restore_distortion.py - #7 — Houdini Scene node placement
- #8 — Stop copying colmap2nerf.py into output_path
- #9 — Code review cleanup (defaults / naming / metadata / docs)
Full changelog: v0.1.0...v0.2.0