Structure-from-motion over an overlapping [Image] batch of one static scene, emitting a deploy-time-resolved oneof: per-registered-image [CameraPose] extrinsics, per-image [CameraIntrinsics], or the sparse coloured PointCloud of the reconstruction.
Typical backends
A directory of overlapping stills is decoded into frames, batched through the reconstruction, and the resolved arm (poses or sparse points) is shipped to an HTTP sink for downstream training or inspection.
Frames decoded from a recorded clip are accumulated into one batch for a single offline reconstruction pass, then emitted over HTTP.
Caveats
- I/O contractThe connected sink fixes which oneof arm is produced when the graph deploys; one input batch then yields exactly one output of that arm. There is no per-image streaming output and the arm cannot change at runtime.
- Hard constraintReconstruction shells out to the external COLMAP feature-extraction, feature-matching, and incremental-mapping stages. A stage crash or a run that exceeds the timeout is downgraded to an empty reconstruction (every arm emits its empty value) so the output is never dropped; only a genuinely empty `[Image]` input raises.
- AccuracyA batch with too few well-overlapping views routinely registers no images and yields the empty value on every arm (empty pose/intrinsics lists, an empty point cloud) rather than a degenerate scene; upstream frame selection must guarantee dense frame-to-frame overlap of a static subject for a useful reconstruction.
- Parameter interactionLong captures can be capped to a frame budget that is applied before feature extraction; the thinning policy either keeps the leading frames in capture order or spreads the kept frames evenly across the whole list.
- Parameter interactionThe
PointCloud arm can be capped to a point budget, and a thinning policy decides whether that budget keeps the leading points or spreads the selection across the reconstruction. - FallbackWhen several disjoint reconstructions are allowed, only the model with the most registered images (ties broken by point count) is emitted; the rest are dropped silently.
- CompatibilityRunning SIFT on GPU needs a CUDA-enabled COLMAP build at runtime; the component neither detects a CPU-only build nor falls back to CPU.
- LatencyA global timeout bounds the entire subprocess chain end-to-end; leaving it at zero disables the cap, so a large batch can run unbounded.
- I/O contractColours on the
PointCloud arm are normalised to the 0..1 range; consumers expecting 0..255 byte colours must rescale. - I/O contractEach
CameraIntrinsics carries fx, fy, cx, cy, a zero skew (COLMAP cameras have no axis skew), and the lens distortion the chosen camera model estimated, remapped into the OpenCV canonical coefficient order (k1, k2, p1, p2, k3, k4, k5, k6). A pinhole model leaves the distortion vector empty; OPENCV emits four coefficients and FULL_OPENCV eight, so the selected camera model fixes the distortion length.