Checkerboard calibration board generator
Generate a printable checkerboard calibration board with vector output and physical dimensions defined in millimetres. Every sheet carries a 100 mm scale check: measure it with a ruler and you know immediately whether your printer silently rescaled the page. Everything runs locally in your browser — nothing is uploaded, no sign-up.
- Squares
- 8×6
- Inner corners
- 7×5 (35)
- Board size
- 160×120 mm
- Paper
- A4 portrait
- Sheets
- 1
What is different here
- Vector, not bitmap. Every square in the PDF and SVG is a vector rectangle, and the physical size is defined in millimetres — no bitmap rescaling. Bitmaps interpolate their edges when enlarged, and that blur directly degrades sub-pixel corner localisation.
- A 100 mm scale check. Almost every "my calibration is off" story starts with a printer that output the page at 96%. The ruler is on the same sheet, so one measurement tells you whether to reprint.
- Corners vs. squares, made explicit. The form only accepts inner-corner counts and shows you the resulting square count and total corners, so nobody types 8×6 into
patternSize. - Parameters you can paste.
patternSizeandsquareSize(in metres) are emitted as code you can copy — no more hand-converting20mm → 0.02.
Print checklist
- Download the PDF and open it in Adobe Acrobat or your system PDF viewer — do not print from the browser, that adds another scaling layer.
- Set scaling to 100% / actual size and turn off "Fit to page" or "Shrink to fit printable area".
- Match the paper: the paper selected in the dialog must be the paper actually in the tray, or the driver re-lays out the page.
- Measure the scale bar as soon as it comes out. More than 0.5 mm off? Reprint — do not rationalise it.
- Mount it flat: tape the sheet to a rigid board (aluminium, acrylic) and flatten all four corners. A warped sheet breaks the z=0 plane assumption, and that is the second-largest error source after scaling.
Do not laminate or coat it. A glossy surface blows out highlights near corners and blurs the black/white boundary, and the laminate film itself adds thickness and warp. If you need durability, print on matte stock or mount it on a rigid board.
Common mistakes
- Entering square counts as corners: an 8×6-square board has
patternSize(7, 5). Entering (8, 6) means detection never succeeds. - Printer scaling: shows up as every calibration result being uniformly too large or too small, independent of the camera. Measure the scale bar first.
- Corners not covering the frame edges: if every corner sits near the image centre, the distortion terms (k1, k2, p1, p2) are extrapolated badly — the reprojection error looks fine while the real distortion is unmodelled.
- Using one board for both intrinsics and hand-eye: hand-eye needs widely spread poses and large orientation changes, which is a different capture strategy from "fill the frame" intrinsic capture.
- Calibrating at a single distance: focal length and principal point are strongly coupled with range. Capture at least two or three distances.
Frequently asked questions
What is the difference between "inner corners" and "squares"?
Squares are the little black and white cells on the board. Inner corners are the interior intersections shared by four cells. An 8×6-square checkerboard has 7×5 = 35 inner corners. OpenCV findChessboardCorners and calibrateCamera take the corner count, i.e. patternSize = (7, 5) — this is the single most commonly mistyped value.
The printed scale bar is not 100 mm. What now?
Your printer scaled the page. In the print dialog, turn off "Fit to page" and set scaling to 100% (actual size), and make sure the selected paper matches the paper physically loaded. Browser defaults are often around 96%, which shrinks the whole board by about 4% — your square size is then no longer what you specified.
What square size should I choose?
For intrinsics, 20–30 mm is typical, and the board should cover the full image, especially the edges. For hand-eye or narrow fields of view, 10–15 mm works, but the camera must still resolve at least a 5×5 corner grid at the closest working distance. Squares that are too small vanish at range; too large and you cannot fill the frame edges. Around 20 mm is a good default for A4.
Why is the text inside the PDF in English?
The PDF is generated in your browser with jsPDF, whose built-in fonts have no CJK glyphs — writing Chinese directly produces garbage. To keep this sheet geometrically correct with zero risk, the annotations in the PDF stay in English while the interface is fully localised. Embedding a CJK font subset is a planned improvement.
Does the generated file get uploaded anywhere?
No. The whole thing is generated in your browser. This page has no backend, and your parameters only ever appear in your own address bar (so you can share a configuration). Nothing is sent to any server.
Do you support ChArUco and AprilTag boards?
Not yet, but they are planned. ArUco and AprilTag depend on the exact bit patterns of the official dictionaries; a single wrong bit fails silently at detection time. So the dictionaries have to be integrated and cross-verified against a decoder before shipping — not generated from memory.
Can I use this board for LiDAR–camera calibration?
It works for camera intrinsics, and as an initial estimate for LiDAR–camera extrinsics using the board as a planar reference. But LiDAR is sensitive to target material and reflectivity, and a plain printed sheet returns a poor point cloud — ChArUco boards or dedicated targets are a better fit for joint calibration. An online LiDAR–camera tool is on the roadmap.