Pipelines
This section documents each target’s complete, end-to-end detection pipeline — one page per target type. Where the Algorithms section describes each building block in isolation, a pipeline page shows how a particular target composes those blocks from a grayscale image (or a pre-detected corner cloud) to a labelled, ID-carrying detection.
Each pipeline page narrates and links the canonical stage map that
lives next to the code. The crate-level docs/PIPELINE.md files are the
source of truth; these pages mirror them and must not diverge.
The shared front-end
Every detector shares the same first three steps:
┌───────────┐ ┌───────────┐ ┌───────────┐ ┌───────────┐
│ Image │ -> │ ChESS │ -> │ Target- │ -> │ Labelled │
│ (u8 gray) │ │ corners │ │ specific │ │ grid out │
└───────────┘ │ (front- │ │ detector │ │ │
│ end) │ │ │ │ │
└───────────┘ └───────────┘ └───────────┘
- Input image —
image::GrayImageor aGrayImageView. The facade helpers incalib_targets::detectaccept either. - Corner front-end — the ChESS X-junction
detector via the
chess-cornerscrate produces a raw corner cloud (sub-pixel position + two undirected axes, each with a 1σ angular uncertainty + astrengthresponse magnitude). The workspace default iscalib_targets::detect::default_chess_config(). - Grid recovery — every target then runs the same grid stack: axis clustering → the topological grid finder → recovery & validation. This is the chessboard pipeline, and it is the shared spine of all the others.
- Target-specific decode + IDs — self-identifying targets add their own decoder (ArUco bits, PuzzleBoard edge codes) and ID assignment on top of the recovered grid.
- Output — every detector produces a
TargetDetectionwrapping aVec<LabeledCorner>; higher-level detectors wrap that in their own result struct with extra metadata (marker decodes, alignment, IDs). See Understanding Results.
The pages
| Pipeline | Composes | Source of truth |
|---|---|---|
| Regular grid | clustering + topological grid + validation | docs/algorithms/topological-grid-detection.md |
| Chessboard | the full grid stack, precision-anchored | crates/calib-targets-chessboard/docs/PIPELINE.md |
| PuzzleBoard | chessboard grid + edge-code decode | crates/calib-targets-puzzleboard/docs/PIPELINE.md |
| ChArUco | chessboard grid + ArUco decode + alignment | crates/calib-targets-charuco/docs/PIPELINE.md |
| Marker board | chessboard grid + 3-circle anchoring | crates/calib-targets-marker/docs/PIPELINE.md |
One builder, everywhere
There is no grid-builder choice or selector to configure: the topological grid finder is the sole builder for every target, including ChArUco. Legacy config keys for removed builder selectors are rejected as unknown fields.
Output types
Output types are standardised in calib-targets-core as TargetDetection
with LabeledCorner values. The chessboard layer’s labelling carries the
precision contract every target inherits: wrong (i, j) labels are
unrecoverable for downstream calibration, so the grid stage may fail to
detect a corner but must never deliver a wrong label. Higher-level crates
enrich that output with additional metadata (marker detections, rectified
views, per-corner IDs).