Skip to content

Releases: chordee/colmap-camera-tracking

v0.2.3

Choose a tag to compare

@chordee chordee released this 03 Jun 18:11

Highlights

  • JPG sequence input (#14): autotracker.py now accepts JPG sequences in addition to video files and EXR sequences, using the same layout rules — a subfolder of *.jpg/*.jpeg per sequence, or loose frames passed directly as <input_dir>.
    • Frames are renumbered to a contiguous frame_%06d.jpg. With --scale 1.0 they are copied byte-for-byte (no JPEG recompression); other scales resize with INTER_AREA.
    • No colour management — JPGs are already display-referred; --acescg / --lut are ignored for JPG input.

Other changes

  • Case-insensitive sequence detection: extension matching now handles .JPG / .JPEG / .EXR (common camera/export outputs) via a shared _list_frames helper. 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

Choose a tag to compare

@chordee chordee released this 02 Jun 14:57

Highlights

  • EXR sequence input (#13): autotracker.py now 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 *.exr per sequence (<input_dir>/shotA/*.exr), or a directory of loose *.exr frames 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.jpg so downstream naming matches the video path.
    • --acescg applies an exact ACEScg (AP1, D60) → linear Rec.709 (D65, Bradford) matrix before the sRGB transfer for ACES-linear sources. (--lut is FFmpeg-only and ignored for EXR.)

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 --acescg colour-accuracy difference between the EXR and video paths.

Full changelog: v0.2.1...v0.2.2

v0.2.1

Choose a tag to compare

@chordee chordee released this 30 May 06:55

Highlights

  • COLMAP/OpenCV → Houdini coordinate conversion (#12): build_houdini_scene.py now converts both the camera and the point cloud into Houdini's Y-up world via an Rx(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.py cleanups: dropped the unused global_scale / cam_name parameters, guarded missing transform_matrix frames, switched the headless early-exit from hou.ui.displayMessage to print, 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-cams flag is retained.
  • README: documents the new coordinate conversion.

Full changelog: v0.2.0...v0.2.1

v0.2.0

Choose a tag to compare

@chordee chordee released this 21 May 21:04

Highlights

  • PySide6 GUI (gui_autotracker.py) — tabbed UI wrapping run_autotracker.py with 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_mm for the physical sensor) so COLMAP is locked to the known intrinsics instead of estimating them. The pixel focal length is written into EXIF, used as ImageReader.camera_params, and pinned via a bundle_adjuster pass.
  • Robust resume detection — incomplete scene folders are now detected by the absence of sparse/0/cameras.bin and 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_model default changed from auto to SIMPLE_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_path renamed to --original_json for consistency with restore_distortion.py. Any external scripts calling it directly need updating.

Bug fixes

  • COLMAP camera_params strings emitted for SIMPLE_RADIAL were missing the trailing k value (3 of 4 params), and SIMPLE_PINHOLE fell through to the 8-value OPENCV default. Each supported model now emits the exact parameter count COLMAP expects (caught by CodeRabbit on PR #9).
  • restore_distortion.py no 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.py now creates the point-cloud geo inside the same NeRF_Import subnet as the camera, destroys any prior Scene node before recreating it (so re-runs don't accumulate Scene1, Scene2, …), wires its input to the subnet's indirect input, and guards against the missing-subnet case when create_animated_camera bails out early.
  • run_autotracker.py no longer copies colmap2nerf.py into the output directory or mutates the global cwd — invokes the script in place via an absolute path with cwd=output_path.

Repo hygiene

  • 9 MB vocab_tree_faiss_flickr100K_words32K.bin removed from version control and replaced with a download note pointing at https://demuc.de/colmap/.
  • pyproject.toml description / authors / license / repository URL filled in.
  • README.md documents the batch_run.py folder 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

v0.1.0

Choose a tag to compare

@chordee chordee released this 27 Mar 16:37
0ad9aa7

Initial release.