SCARSatellite-based Calibration for Aerial Recordings |
SCAR refines the intrinsics of an aerial camera and its extrinsics relative to a GNSS/INS from the recording itself: it matches the images against georeferenced orthophotos, lifts the matches to 3D anchors with a surface model and optimizes a factor graph (GTSAM) over cameras, anchors and the calibration. No calibration target or ground control points are needed.
You provide images with timestamps, INS poses, an initial calibration and reference data:
- Germany: official orthophotos and DSMs of the federal states supported by georaffer (NRW, RLP, BW, BY, BB, ...) are downloaded on demand.
- Anywhere else: your own orthophoto and surface model as GeoTIFF/COG/VRT in any CRS (e.g. NAIP + 3DEP in the US, national mapping data, your own survey), or your own reference provider.
Frame cameras and event cameras (as reconstructed frames) are supported. The paper version is kept
frozen as the preset cvprw2026 and the tag v1.0.0-cvprw2026.
Installation
SCAR needs Python 3.11+.
git clone https://github.com/hlzmnhnry/scar.git && cd scar
pixi install # environment with GTSAM, pyproj, rasterio, georay; CPU only
pixi install -e gpu # + PyTorch/CUDA, learned matchers (vismatch), georaffer, rerun viewer
With pip: pip install -e ".[references,matching,viewer]" (add germany for German state data).
georay renders the reference views; the germany extra adds
georaffer.
Quick start
A complete run on a synthetic flight with local GeoTIFF reference data, CPU only and without downloads:
pixi run python examples/custom_region_geotiff/make_demo_data.py examples/custom_region_geotiff/demo
pixi run scar run examples/custom_region_geotiff/config.yaml
pixi run python examples/custom_region_geotiff/make_demo_data.py --compare examples/custom_region_geotiff/demo
For your own flight:
scar init my_flight.yaml --template csv # or: ltc, event
scar check my_flight.yaml --render # time coverage, CRS, reference availability, footprint overlays
scar run my_flight.yaml --viewer # collect anchors and optimize; live view in rerun
scar export runs/my_flight/calibration/calibration.yaml --format kalibr --output camchain.yaml
scar collect and scar optimize run the two steps separately; scar evaluate scores a calibration on
anchors of an independent test sequence (reprojection error, optionally visual localization). See
examples/ for an LTC campaign; scar init --template event starts an event camera setup.
Inputs
All inputs are described in one YAML file; the templates in
scar/config/templates document every option.
| Input | Format |
|---|---|
| Images | CSV with timestamp and path, a directory of files named by timestamp, or LTC camera.csv |
| Poses | CSV with geodetic (lat, lon, height) or projected positions in any CRS; quaternion or Euler orientation w.r.t. NED or ENU; optional per-sample accuracies |
| Calibration | SCAR YAML, Kalibr camchain or LTC camera.json/extrinsics.json; pinhole with radial-tangential distortion |
| Reference data | georaffer regions (Germany) or local orthophoto and DSM rasters |
Poses are interpolated to the image timestamps (linear position, SLERP rotation), optionally with a time offset. The conventions for frames, heights, datums and the meridian convergence are described in docs/coordinate_systems.md; please read it before using your own data.
Outputs
A run directory contains the anchors (anchors.json), the per-stage results (calibration/stages.json),
the final calibration with the marginal covariance of the intrinsics (calibration/calibration.yaml)
and, with --viewer, a rerun recording. scar export writes Kalibr, OpenCV and LTC formats.
Optimization presets
| Preset | Description |
|---|---|
default |
Staged schedule of the paper (rotation, translation, landmarks, calibration, full) followed by a least-squares fit of the extrinsics; use with the corrected pose processing (default of all templates) |
cvprw2026 |
Frozen paper configuration; together with paper/cvprw2026 it reproduces the published results |
joint |
Experimental: extrinsics as a variable of the factor graph instead of the least-squares fit |
Reproducing the paper
paper/cvprw2026 contains the scripts, campaign definitions and initial calibrations
of the CVPRW 2026 evaluation, the reproduction log and an ablation of geodetic corrections that were not
part of the paper version (float32 coordinates, meridian convergence, heights, interpolation).
The meridian convergence correction alone lowers the test reprojection error by 21 % on average over the
six LTC campaigns.
Development
pixi run test # unit, synthetic and system tests; regression tests need local LTC data
pixi run -e repro test # bit-exact paper regression with GTSAM 4.2.0
Citation
If you use SCAR in academic work, please cite:
@InProceedings{Holzemann_2026_CVPR,
author = {H\"olzemann, Henry and Schleiss, Michael},
title = {SCAR: Satellite Imagery-Based Calibration for Aerial Recordings},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) Workshops},
month = {June},
year = {2026},
pages = {987-996}
}
Reference data obtained through georaffer are subject to the licenses of the respective providers (e.g. NRW: dl-de/zero-2.0, RLP: dl-de/by-2.0); SCAR does not redistribute them.
Metadata
Release files for scar-calib 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| scar_calib-2.0.0.tar.gz | 69.2 kB | With provenance | Details for scar_calib-2.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| scar_calib-2.0.0-py3-none-any.whl | Python 3 | none | any | Details for scar_calib-2.0.0-py3-none-any.whl |
Total release size: 154.1 kB
Release files / scar_calib-2.0.0.tar.gz
| Download URL | scar_calib-2.0.0.tar.gz |
|---|---|
| Size | 69.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
98cae7f2ba444a7cc2328bb6c82eab028412a80542687f89362a81ae14b99927
|
|
BLAKE2b-256 checksum How to use checksums |
fbd72a5f40c6b37d537fe2e80ca28be71c24a7054554d3f74496306ec6c0e1af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logRelease files / scar_calib-2.0.0-py3-none-any.whl
| Download URL | scar_calib-2.0.0-py3-none-any.whl |
|---|---|
| Size | 84.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8a8c73392a72773f1e6189741824e649d3b8eb01030742f92c7f5e49e6f02fb0
|
|
BLAKE2b-256 checksum How to use checksums |
9381b93c7cca1f0625a1b482430ac441864da046b7751d83ddd89c96dba72cd2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logSecurity for scar-calib 2.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for scar_calib-2.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.