Camera-agnostic fisheye image projection library for ground-based sky observation
Project description
skycam
Camera-agnostic fisheye image projection library for ground-based sky observation
✨ Features
| Feature | Description |
|---|---|
| ⚡ Numba JIT | ~100x faster projection via compiled bilinear interpolation |
| 💾 Coordinate Cache | Sub-100ms init after first calibration load |
| 🏛️ Hexagonal Architecture | Clean separation of domain, adapters, and config |
| ✅ Pydantic v2 | Validated settings with environment variable support |
| 🔬 Scientific Accuracy | WGS84 geodesic calculations via GeographicLib |
🚀 Installation
uv add skycam
Or with pip:
pip install skycam
📖 Quick Start
from pathlib import Path
from skycam.adapters import JP2CalibrationLoader, load_jp2
from skycam.domain.models import ProjectionSettings
from skycam.domain.projection import ProjectionService
# Load calibration and create projector
loader = JP2CalibrationLoader(Path("calibration"))
calibration = loader.load("visible")
projector = ProjectionService(
calibration=calibration,
settings=ProjectionSettings(),
)
# Project fisheye → regular grid
projected = projector.project(load_jp2(Path("input.jp2")))
🏗️ Architecture
flowchart LR
subgraph Adapters["Adapters"]
CAL[JP2 Calibration]
IMG[Image I/O]
end
subgraph Domain["Domain"]
PROJ[ProjectionService]
INTERP[Numba Bilinear]
end
subgraph Config["Config"]
SETTINGS[SkycamSettings]
end
CAL --> PROJ
IMG --> PROJ
SETTINGS --> PROJ
PROJ --> INTERP
⚙️ Configuration
Environment variables (prefix: SKYCAM_):
| Variable | Default | Description |
|---|---|---|
SKYCAM_CALIBRATION_DIR |
calibration |
JP2 calibration files directory |
SKYCAM_CATEGORY |
visible |
Camera category (visible, infrarouge) |
SKYCAM_DATA_DIR |
data |
Input/output data directory |
🛠️ Development
git clone https://github.com/eurocontrol-asu/skycam.git
cd skycam
make install # uv sync --all-groups
make check # lint + audit + test
📚 Documentation
eurocontrol-asu.github.io/skycam
- 🚀 Tutorial — Project your first image in 5 minutes
- 🛠️ Guides — How-to recipes for common tasks
- 🧠 Concepts — Architecture and algorithm deep-dive
- 📚 Reference — Complete API documentation
🤝 Contributing
See CONTRIBUTING.md for guidelines.
📄 License
EUPL-1.2 — See LICENSE for details.
Project details
Release history Release notifications | RSS feed
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 skycam-0.1.0.tar.gz.
File metadata
- Download URL: skycam-0.1.0.tar.gz
- Upload date:
- Size: 18.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a967da60275b08e1b3ca43fe946f8e252ed9f432ce4670547f110394b767f3a
|
|
| MD5 |
9a15cbb4fd547baa3e87eb0382acef0b
|
|
| BLAKE2b-256 |
a7bbbe8f63a960f7edb37c7ff30a50d03f173771d1701db9eb56b9f26117913a
|
File details
Details for the file skycam-0.1.0-py3-none-any.whl.
File metadata
- Download URL: skycam-0.1.0-py3-none-any.whl
- Upload date:
- Size: 19.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd519a8d7c9d1a3c88b4112f1bd4626360513fd4a73c7b7c7483c39f314db24a
|
|
| MD5 |
65556417d9ddad9e3ca13c6bba205449
|
|
| BLAKE2b-256 |
3a2d2bbe862edb2339fa825fa3412aefda253b6324a97226d91c76e1ddfc2301
|