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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
skycam-0.1.0.tar.gz
(18.2 MB
view details)
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
skycam-0.1.0-py3-none-any.whl
(19.5 kB
view details)
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
|