ArUco & ChArUco marker generator — printable boards, exact to the millimetre
This generator draws calibration targets at the exact size you type, as vector shapes in a PDF, and hands you the OpenCV code that reads them back. Everything runs in your browser.
The marker patterns are taken from OpenCV itself, and the output is
checked against OpenCV: a rendered ChArUco board matches
CharucoBoard.generateImage() pixel for pixel, and a printed
grid rasterised at 300 DPI fits the object points of
cv2.aruco.GridBoard to within a tenth of a millimetre.
Every pose a detector reports is scaled by the marker size you gave it.
cv2.aruco.GridBoard takes one marker length and one separation,
and assumes the gap is the same across and down. A generator that spreads
markers to fill the page breaks that assumption, and the error shows up in
every measurement without ever being reported.
This tool uses the numbers you type and never scales them. A grid too large for one sheet is split across pages rather than quietly shrunk. Each sheet carries a ruler so you can check the print, because a print dialogue set to "fit to page" will scale it.
Fewer bits read from further away. More bits hold more markers and
repair more misread cells. Within a family, take the smallest marker count
that covers the IDs you need, because a smaller dictionary repairs more
bits. One to avoid: DICT_4X4_1000, which OpenCV reports as
repairing zero.
Compare all 21 dictionaries, or read how to pick one.
Usually the border. A detector expects an ArUco marker to have a border
one cell wide. Print a wider one without setting
markerBorderBits to match and the detector finds nothing at
all, with no error. More on that.
Large enough to cover roughly four pixels per cell in the image, and about three times that in practice. For a 1920 pixel camera with a 60 degree field of view, a 6x6 marker wants around 100 mm at 3 m. The formula and a table.
No. The marker data ships with the page and the PDF is built in your browser. No board is sent anywhere or stored.
Yes. AprilTag 16h5, 25h9, 36h10, 36h11 and ArUco MIP 36h12 are all
available, and OpenCV reads them through cv2.aruco.