A dense, multi-scale field of Gaussian blobs and a feature-based pipeline for joint detection, identification, and pose estimation.

All 25 BlobBoards in a cluttered scene, detected, identified and registered

All 25 BlobBoards in the image are detected, identified, and registered against a 50-board gallery — 25 of its entries are absent confusers, and identification is still perfect. Colour distinguishes detections; the overlaid pattern shows registration accuracy across large variations in scale, distance, and obliquity.

Abstract

We propose BlobBoards, a fiducial marker system comprising a dense, multi-scale field of Gaussian blobs and a feature-based pipeline for joint detection, identification, and pose estimation. Each board is registered from hundreds of blob features whose dense spatial coverage constrains pose, while multiple scales preserve detectability across large changes in focal length, distance, and obliquity. Learned local descriptors are matched to the reference pattern and spatially verified, so the correspondences determine pose and certify identity. Against motion-capture ground truth, BlobBoards achieve median translation errors of 3.6–5.0 mm, reducing AprilTag's median translation error by 89% on small boards and 70% on large ones. They also produce far fewer large-rotation failures than state-of-the-art tag systems. BlobBoards achieve the highest detection rate, 80% versus 74% for AprilTag and 58% for ArUco, with the largest margin on the smallest markers. Under 50% occlusion, they still detect 69% of boards with essentially unchanged median translation error, while AprilTag and ArUco detect none.

Install

BlobBoards requires Julia 1.12 or later. Until the General registrations of BlobBoards and LocalOptimizationDoneRight merge, add CauRegistry first:

pkg> registry add https://github.com/prittjam/CauRegistry.jl

The example below finds a board on the CPU:

pkg> add BlobBoards VisualGeometryToolkitCore

Finding boards on a GPU, plotting, training and the Python package each have their own line: see Install for your task, which gives the line and a runnable example for each.

Getting started

Render a board as an image, then find it in that image with no camera (one homography per board). Getting Started authors, prints and loads a first board; Authoring boards covers every board option and printing; Detecting boards covers find_boards, pose estimation and GPU acceleration. The Overview introduces patterns, boards and the coordinate conventions.

# Install row: find boards on the CPUusing BlobBoardsusing VisualGeometryToolkitCore: is_map_inlier# A small board rendered at 100 pixels per inch: the image to searchdir = mktempdir()blob_board("A5"; blob_sizes = (4.0mm, 0.2short_side), seed = 0xBEEF, dir, output = Png(100dpi))board_json = only(filter(endswith(".json"), readdir(dir; join = true)))scene = load_board(board_json)                 # the board's uid and bundle_, image = BlobBoards.load(board_json)         # the rendered sheet, a grey imagenetwork = DescriptorNetwork(descriptor_network_path(); execution_provider = :cpu)gallery = BoardGallery(joinpath(dir, "board_features.jld2"), network)boards  = Dict(insert!(gallery, [board_json], network))   # uid => the board's described blobsbundles = Dict(scene.uid => scene.bundle)config   = FindBoardsConfig(geometry = HomographyGeometry())accepted = find_boards(boards, network, image; board_bundles = bundles, config)uid, H, quality, csponds = only(accepted)      # the board's uid, its board → image homographyn_inliers = count(is_map_inlier, csponds.weights)uid == scene.uid                               # true

For Python, the blobboards package runs in a clone of the repository: pixi run -e py python (see Use from Python).

Method

A board is registered from hundreds of blob features, not from four corners — that is where the accuracy and the occlusion robustness come from.

(a)(b)(c)(d)
Affine blob detectionsDetections adapted to anisotropic ellipsesInliers as 64×64 log-polar patchesReference pattern projected under the recovered pose

(a) Detect: affine detections from the ASIFT scale space. (b) Adapt: IRLS adaptation to anisotropic ellipses; the twelve pose inliers are coloured individually. (c) Canonicalize: those inliers mapped to 64×64 log-polar patches. (d) Match & verify: descriptors matched and spatially verified; the pattern projected under the recovered pose, with reference blob centres in green at opacity proportional to their geometric consistency.

  • Generate. A seeded pattern packs blobs from several octaves of scale into one field. The same seed reproduces the same board, in Julia or Python.
  • Adapt and register. Each detected blob gets a fitted elliptical frame, is canonicalized into a patch, and described by a learned log-polar network. Matches to the reference pattern are spatially verified, so the correspondences determine pose and certify identity.
  • Evaluate. Poses are scored against motion-capture ground truth on a rig of boards at a range of sizes, distances, and angles, alongside AprilTag and ArUco.

Results

Against motion-capture ground truth, compared with AprilTag and ArUco on the same rig:

80%boards detected — AprilTag 74%, ArUco 58% — with the largest margin on the smallest markers
3.6–5.0 mmmedian translation error, small to large boards
−89%AprilTag's median translation error on small boards (−70% on large ones)
69%boards still detected at 50% occlusion, with essentially unchanged median translation error; AprilTag and ArUco detect none

Data & models

Everything BlobBoards hosts lives in one Zenodo record, doi:10.5281/zenodo.21998310 (the concept DOI; it always resolves to the latest version): the paper's data, the descriptor network weights and the example data the package ships.

  • Reproducing the BMVC results. Everything the paper's numbers were computed from is archived at doi:10.5281/zenodo.21998311: the absolute-pose captures with camera calibrations, motion-capture ground truth and hand-eye calibrations; the AprilTag and ArUco baseline detections; the 0–90% occlusion series; the frozen descriptor training set; and the network the reported poses were produced with. It is packaged as sha256-pinned Julia artifact tarballs that bmvc2026/Artifacts.toml fetches lazily.
  • Network weights and example data. The same record holds the ONNX descriptor networks and the boards, still image and video the bundled examples run on. The package's Artifacts.toml is an add-only, hash-pinned catalog of them, each entry fetched lazily from a numbered version of the record.

Part of the Visual Geometry Toolkit, Julia packages for robust visual geometry from Kiel University:

Citation

BlobBoards is described in BlobBoards: Robust Markers for Accurate Pose, BMVC 2026 (PDF, with supplementary material). If you use this project for your research, please cite:

@inproceedings{pritts2026blobboards,
  author    = {Pritts, James and Sittart, Till and Sauer, Hendrik and
               Jan{\ss}en, Silja and Seegr{\"a}ber, Felix and
               Nakath, David and K{\"o}ser, Kevin},
  title     = {{BlobBoards}: Robust Markers for Accurate Pose},
  booktitle = {British Machine Vision Conference (BMVC)},
  year      = {2026},
  eprint    = {2608.28830},
  archivePrefix = {arXiv},
}

The default homography path needs no additional citation. The opt-in calibrated P3P path of find_boards (PoseGeometry) runs the published solver of Ding et al. (CVPR 2023); if you use it, please also cite:

@inproceedings{ding2023p3p,
  author    = {Ding, Yaqing and Yang, Jian and Larsson, Viktor and
               Olsson, Carl and {\AA}str{\"o}m, Kalle},
  title     = {Revisiting the {P3P} Problem},
  booktitle = {IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
  pages     = {4872--4880},
  year      = {2023},
}

Support

Please use the GitHub issue tracker for bug reports, questions, and feature requests. The repository's examples/ directory has runnable Julia scripts for generation, detection, tracking and building training tracks; python/examples/ covers the Python package.

Contributors

BlobBoards is developed by James Pritts, with contributions from Hendrik Sauer and Till Sittart.

Acknowledgments

James Pritts is funded by Kiel Training for Excellence, an EU Horizon Europe programme under the Marie Skłodowska-Curie Actions (MSCA), grant agreement No. 101081480, and by KMS Kiel Marine Science – Centre for Interdisciplinary Marine Science at Kiel University. The motion-capture setup was funded through the project OP der Zukunft as part of the REACT-EU program and provided by the Kurt Semm Centre for laparoscopic and robot-assisted surgery at the University Hospital of Schleswig-Holstein.