Single-view calibration with GeoCalib over each Image, emitting the full `{intrinsics, gravity, roll, pitch}` record or, on demand, just the CameraIntrinsics, the unit gravity Point3d<Double>, or the `{roll, pitch}` tilt in radians.
Typical backends
A frame pulled over HTTP is calibrated and the intrinsics, gravity, and tilt record is published as JSON.
A live camera feed is monitored frame by frame for tilt and horizon, with each record published as JSON.
Caveats
- Parameter interactionThe distorted checkpoint is required for the distortion camera models; pairing a distortion model with the pinhole checkpoint produces wrong results.
- I/O contractThe output is a oneof resolved at deploy from the downstream connection: the full `{intrinsics, gravity, roll, pitch}` record, bare
CameraIntrinsics, the bare gravity Point3d<Double>, or the bare `{roll, pitch}` tilt. Every arm is a projection of the one calibration, so the fields agree across arms. - I/O contractRoll and pitch are emitted in radians, not degrees. Yaw is not observable from a single image and is not reported.
- LimitationIntrinsics and gravity are recovered per frame independently; there is no temporal smoothing across a video stream.
- FallbackSelecting a GPU on a host with no CUDA falls back to CPU, where per-frame latency climbs sharply.
- LatencyThe GeoCalib checkpoint loads once at startup; first-call latency on a fresh container is dominated by download and load, not inference.