Stretching an already-embedded thermal folder (e.g. Streifen_exif/thermal,
which has tagged PNGs but no .json sidecars) produced bare 8-bit PNGs: the
old code skipped frames with no sidecar, so nothing was embedded.
_embed_exif now always copies the source image's EXIF/XMP via -tagsFromFile
and overlays JSON-sidecar tags when available, so metadata transfers whether
you stretch the raw session (sidecars) or already-embedded PNGs (source EXIF).
GPS verification only fires when there was metadata to embed; otherwise it
logs a clear note instead of a false "full disk" error.
Verified: raw session and embedded-no-sidecar both yield 0 frames missing GPS.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
On a (near-)full disk, exiftool's temp-copy write partially fails, producing
stretched thermal PNGs with most tags but no GPS. The stretch step was
ignoring exiftool's exit code, so this happened silently.
stretch_thermal._embed_exif now verifies GPS landed (spot-checks first/middle/
last frames), retries once on a transient miss, and otherwise raises a clear
"free up disk space and re-run" error (the pixels are written; only metadata
is missing). embed_metadata.embed_session's exit-code error gets the same hint.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
EXIF/GPS embedding, session-wide thermal stretch, and an OpenStreetMap
view of trigger points and image footprints, wrapped in a Tkinter GUI.
- embed_metadata.py: write JSON sidecars into image EXIF/XMP, with true
camera orientation (aircraft attitude + platform roll + mounting offset)
- stretch_thermal.py: rescale 16-bit thermal frames to a session-wide
window (8-bit palettes), embedding GPS/orientation EXIF in the output
- session_map.py: shared camera geometry (orientation + oblique footprints)
- firemapper_gui.py: GUI with Embed / Thermal Stretch / Map tabs
Includes CLAUDE.md and an end-user manual (manual.html). Capture data and
derived outputs (tens of GB) are git-ignored.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>