Franck Garnier acd22d41dc feat: incremental assembly for large panoramas
Replace parallel chunk strategy with sequential incremental assembly:
1. Start with first 20 images, full cpfind + optimize
2. Add 5 new images at a time with 5-image bridge to existing set
3. cpfind only on bridge+new group (small, fast)
4. Remap CPs to global indices and accumulate

This ensures spatial coherence: each new batch is constrained by
the already-stable panorama, preventing orientation flips that
occurred with the parallel chunk approach.

Images are sorted by azimuth, so consecutive indices = spatial
neighbors (guaranteed contiguity).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:28:38 -04:00

Mars Panorama Pipeline

Automated panorama stitching for NASA Mars rovers (Perseverance, Curiosity) using Hugin CLI tools in Docker.

Quick Start

# Build the image
docker build -t mars-panorama-pipeline .

# Run a NavCam panorama (sol 1813)
docker run --rm \
  -v /mnt/astro/mars_rovers:/data \
  -v /mnt/astro/mars_rovers/images/panorama/perseverance:/output \
  mars-panorama-pipeline \
  --sol 1813 --camera NAVCAM_LEFT

# Run a Mastcam-Z panorama (sol 1817)
docker run --rm \
  -v /mnt/astro/mars_rovers:/data \
  -v /mnt/astro/mars_rovers/images/panorama/perseverance:/output \
  mars-panorama-pipeline \
  --sol 1817 --camera MCZ_LEFT

# List available sequences for a sol
docker run --rm \
  -v /mnt/astro/mars_rovers:/data \
  mars-panorama-pipeline \
  --sol 1813 --camera NAVCAM_LEFT --list-only

With Docker Compose

docker compose run panorama --sol 1813 --camera NAVCAM_LEFT

Pipeline Steps

  1. Find sequence — Query MySQL for panorama-capable image sequences
  2. Combine tiles — NavCam tiles 01+04 with 16px overlap blending
  3. CLAHE preprocessing — Vignette correction + contrast normalization (for cpfind only)
  4. cpfind — Feature matching on CLAHE images (aggressive params)
  5. cpclean — Remove outlier control points
  6. Swap to originals — Replace CLAHE images with originals in PTO
  7. autooptimiser — Geometry-only optimization (NO photometric -m flag)
  8. nona + verdandi — Remap and blend final panorama (verdandi eliminates overexposure at seams)
  9. Export PNG — Convert TIFF output to PNG

Supported Cameras

Camera Rover FOV Tile combining
NAVCAM_LEFT/RIGHT Perseverance 82.17° (combined) Yes (01+04, 16px overlap)
MCZ_LEFT/RIGHT Perseverance 25.6° (wide zoom) No

Configuration

Environment variables (or .env file):

  • MYSQL_HOST — MySQL server (default: 192.168.1.42)
  • MYSQL_PORT — MySQL port (default: 3306)
  • MYSQL_USER — MySQL user (default: soldan)
  • MYSQL_PASSWORD — MySQL password
  • MYSQL_DATABASE — Database name (default: mars_rovers)
Description
Automated Mars rover panorama stitching pipeline - Docker + Hugin + Python
Readme 100 KiB
Languages
Python 96.4%
Dockerfile 3.6%