Which ArUco dictionary should you use?
A dictionary fixes three things at once: how far away a marker can be read, how many different markers you can have, and how much damage a marker can take before it stops being read. You cannot have all three.
Fewer bits read from further away
A marker is a grid of cells. A 4x4 marker carries 16 bits inside a black border, so the printed marker is six cells wide. A 7x7 marker is nine cells wide.
At the same printed size, the cells of a 4x4 marker are half again as wide as the cells of a 7x7 marker. The camera has to resolve a cell to read a bit, so the 4x4 marker keeps working at a greater distance, in worse light, and under more motion blur.
More bits hold more IDs and take more damage
The extra bits buy two things. The dictionary can hold more markers that still look different from each other, and the decoder can repair bits that were read wrongly.
OpenCV reports the repair budget as maxCorrectionBits. The table below gives the real value for every dictionary.
Take the smallest count that fits
Each family comes in sizes of 50, 100, 250 and 1000 markers. The markers are the same; the larger dictionary simply keeps more of them. Keeping more means the markers sit closer together, so the decoder can repair fewer bits.
If you need twelve markers, ask for the 50 marker dictionary, not the 1000 marker one. The difference is real: DICT_6X6_50 repairs six bits, and DICT_6X6_1000 repairs four.
Avoid DICT_4X4_1000
One dictionary stands out. DICT_4X4_1000 packs a thousand markers into sixteen bits, and OpenCV reports a correction budget of zero. A single misread bit cannot be repaired, so the marker is either dropped or read as a different ID.
If you need a thousand markers, move to 5x5 or 6x6. If you need the range that 4x4 gives, keep the count low.
ArUco or AprilTag
AprilTag families were designed for the AprilTag detector and are common in ROS. OpenCV carries them, so a board printed here can be read with cv2.aruco or with an AprilTag detector.
Pick AprilTag when the rest of your stack already speaks it. 36h11 is the usual default and holds 587 markers. Pick an ArUco family otherwise.
Every dictionary, side by side
Bits, marker count and repair budget come from OpenCV. Range is for a 100 mm marker on a reference camera of 1920 px wide, 60 degree horizontal field of view.
| Dictionary | Bits | Markers | Bits repaired | Range, 100 mm marker |
|---|---|---|---|---|
| 4x4_50 | 4×4 | 50 | 1 | 2.3 m |
| 4x4_100 | 4×4 | 100 | 1 | 2.3 m |
| 4x4_250 | 4×4 | 250 | 1 | 2.3 m |
| 4x4_1000 | 4×4 | 1000 | 0 | 2.3 m |
| 5x5_50 | 5×5 | 50 | 3 | 2.0 m |
| 5x5_100 | 5×5 | 100 | 3 | 2.0 m |
| 5x5_250 | 5×5 | 250 | 2 | 2.0 m |
| 5x5_1000 | 5×5 | 1000 | 2 | 2.0 m |
| 6x6_50 | 6×6 | 50 | 6 | 1.7 m |
| 6x6_100 | 6×6 | 100 | 5 | 1.7 m |
| 6x6_250 | 6×6 | 250 | 5 | 1.7 m |
| 6x6_1000 | 6×6 | 1000 | 4 | 1.7 m |
| 7x7_50 | 7×7 | 50 | 9 | 1.5 m |
| 7x7_100 | 7×7 | 100 | 8 | 1.5 m |
| 7x7_250 | 7×7 | 250 | 8 | 1.5 m |
| 7x7_1000 | 7×7 | 1000 | 6 | 1.5 m |
| AprilTag 16h5 | 4×4 | 30 | 2 | 2.3 m |
| AprilTag 25h9 | 5×5 | 35 | 4 | 2.0 m |
| AprilTag 36h10 | 6×6 | 2320 | 4 | 1.7 m |
| AprilTag 36h11 | 6×6 | 587 | 5 | 1.7 m |
| ArUco MIP 36h12 | 6×6 | 250 | 5 | 1.7 m |