Refractive multi-camera calibration for underwater arrays with Snell's law modeling
Project description
AquaCal
Refractive multi-camera calibration for underwater arrays. AquaCal calibrates cameras in air viewing through a flat water surface, using Snell's law to achieve accurate 3D reconstruction in refractive environments.
Features
- Snell's law refractive projection — Accurate ray-tracing through air-water interfaces
- Multi-camera pose graph — BFS-based extrinsic initialization for camera arrays
- Joint bundle adjustment — Simultaneous optimization of extrinsics, interface distances, and board poses
- Sparse Jacobian optimization — Scalable to 10+ cameras with column grouping
- ChArUco board detection — Robust corner detection for calibration targets
- Validation diagnostics — Holdout reprojection, 3D triangulation checks, and per-camera error breakdowns
- Active re-calibration (beta) —
refine_calibration()updates an existing calibration from point correspondences collected in the field; not yet fully tested
Installation
pip install aquacal
Quick Start
-
Install AquaCal:
pip install aquacal
-
Generate a configuration file from your calibration videos:
aquacal init --intrinsic-dir videos/intrinsic/ --extrinsic-dir videos/extrinsic/
-
Run calibration:
aquacal calibrate config.yaml
Results are saved to output/calibration.json with camera intrinsics, extrinsics, interface distances, and diagnostics.
Documentation
Full documentation is available at aquacal.readthedocs.io:
- Overview — What is refractive calibration and when do you need it?
- User Guide — Theory, methodology, and coordinate conventions
- API Reference — Detailed module and function documentation
- Tutorials — Interactive Jupyter notebook examples
- Configuration Reference — YAML config schema and options
Citation
If you use AquaCal in your research, please cite:
@software{aquacal,
title = {AquaCal: Refractive Multi-Camera Calibration},
author = {Lancaster, Tucker},
year = {2026},
url = {https://github.com/tlancaster6/AquaCal},
version = {1.2.0},
doi = {10.5281/zenodo.18644658}
}
See CITATION.cff for full citation metadata.
Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
License
MIT License. See LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aquacal-1.6.0.tar.gz.
File metadata
- Download URL: aquacal-1.6.0.tar.gz
- Upload date:
- Size: 112.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b853f58347706298d573425d6ecada3dd87a03ba776f3b3228c747b899c05dc
|
|
| MD5 |
f6ba4b7c55bc9f5c6cb398314f649c23
|
|
| BLAKE2b-256 |
940f45bb6a7b5876fb2319c055e2579a3312bb01e1c7c4898f3beea84ed3f559
|
Provenance
The following attestation bundles were made for aquacal-1.6.0.tar.gz:
Publisher:
publish.yml on tlancaster6/AquaCal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aquacal-1.6.0.tar.gz -
Subject digest:
6b853f58347706298d573425d6ecada3dd87a03ba776f3b3228c747b899c05dc - Sigstore transparency entry: 1440142103
- Sigstore integration time:
-
Permalink:
tlancaster6/AquaCal@672e024abfd26783526d69d23cb24f5750268c23 -
Branch / Tag:
refs/tags/v1.6.0 - Owner: https://github.com/tlancaster6
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@672e024abfd26783526d69d23cb24f5750268c23 -
Trigger Event:
push
-
Statement type:
File details
Details for the file aquacal-1.6.0-py3-none-any.whl.
File metadata
- Download URL: aquacal-1.6.0-py3-none-any.whl
- Upload date:
- Size: 131.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e404881794580e12d4ea331498b30ce369698cbecc5ce2dd3bd26a82c7c3058
|
|
| MD5 |
6ed65e1862e9ca471a10b03b4656d291
|
|
| BLAKE2b-256 |
369204e9a6b48cc9d5cd612e472506559beace9ea41598a1d13f3faae3782495
|
Provenance
The following attestation bundles were made for aquacal-1.6.0-py3-none-any.whl:
Publisher:
publish.yml on tlancaster6/AquaCal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aquacal-1.6.0-py3-none-any.whl -
Subject digest:
2e404881794580e12d4ea331498b30ce369698cbecc5ce2dd3bd26a82c7c3058 - Sigstore transparency entry: 1440142107
- Sigstore integration time:
-
Permalink:
tlancaster6/AquaCal@672e024abfd26783526d69d23cb24f5750268c23 -
Branch / Tag:
refs/tags/v1.6.0 - Owner: https://github.com/tlancaster6
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@672e024abfd26783526d69d23cb24f5750268c23 -
Trigger Event:
push
-
Statement type: