Какое разрешение камеры нужно для DataMatrix: считаем от размера модуля
Разрешение камеры считают не в мегапикселях, а в пикселях на модуль — сколько пикселей сенсора приходится на одну клетку кода. Рабочий минимум — 2 пикселя, надёжный запас — 3. Отсюда и из ширины поля зрения считается, сколько пикселей нужно сенсору.
Сколько пикселей на модуль
- 1,5 пикселя — читается только при идеальной печати, свете и геометрии, или если код снимается несколько раз.
- 2 пикселя — рабочий минимум для линии при хорошем декодере.
- 3 пикселя и больше — запас на расфокус, блики и слабую печать.
Эти пороги — отраслевая практика машинного зрения (VA Imaging). Реальный порог зависит от декодера. На нашей конвейерной выборке (камера 704×450, символ около 100 пикселей, около 2,4 пикселя на модуль) бесплатная libdmtx прочитала 64 кадра из 300 (21 %), а декодер, рассчитанный на такую съёмку, — 295 (98 %). Поэтому проверяйте декодер на своих кадрах, а не по паспорту.
Мелкий модуль не страшен, страшен мелкий модуль с расфокусом
На резком синтетическом кадре код читается и при 1,4 пикселя на модуль. Ограничивает размытие оптики: граница — расфокус σ около 0,4–0,5 модуля при любом размере модуля. Доля прочитанных синтетических кадров, %:
| Расфокус σ, px \ пикселей на модуль | 1,6 | 2,0 | 2,5 | 3,0 | 4,0 |
|---|---|---|---|---|---|
| 0,5 | 100 | 100 | 100 | 100 | 100 |
| 1,0 | 0 | 33 | 91 | 100 | 100 |
| 1,5 | 0 | 0 | 0 | 75 | 91 |
Вывод для выбора камеры: на 2 пикселях на модуль фокус и глубина резкости важнее лишних мегапикселей. Если высота коробок на линии меняется, закрывайте диафрагму или берите 3 пикселя на модуль.
Размер модуля и кода
Модуль (X-размер) — сторона одной клетки. Оператор рекомендует не меньше 0,255 мм; меньший допустим, если качество печати в норме (markirovka.ru). Число модулей зависит от длины кода: длинный код с полями 91 и 92 (76–85 символов) при обычном ASCII-кодировании занимает 36×36 модулей, короткий с полем 93 — 20×20 или 22×22.
Итого при модуле 0,33 мм длинный код — квадрат около 12 мм, короткий — около 7 мм, без учёта свободной зоны.
Формула
Ширина сенсора в пикселях = ширина поля зрения × пиксели на модуль / размер модуля:
N(пикс.) = FOV × k / XЗдесь FOV — ширина поля зрения в мм, k — пиксели на модуль, X — размер модуля в мм. Поле зрения берите с запасом на разброс положения кода: смещение этикетки, неровная постановка коробки на конвейере.
Примеры
| Ситуация | Поле зрения, мм | Модуль, мм | Пикселей на модуль | Нужно пикселей по ширине |
|---|---|---|---|---|
| Код в фиксированном месте пачки | 60 | 0,33 | 3 | 545 |
| То же, на пределе | 60 | 0,33 | 2 | 364 |
| Этикетка с разбросом положения | 150 | 0,33 | 3 | 1 364 |
| Код в любом месте короба | 300 | 0,33 | 2 | 1 818 |
| То же, с запасом | 300 | 0,33 | 3 | 2 727 |
| То же, мелкий модуль | 300 | 0,255 | 3 | 3 529 |
На практике: для кода в известном месте хватает камеры на 1–1,3 Мп. Для поиска кода по всей ширине короба нужна камера на 5 Мп и выше (2448 пикселей по ширине) — или декодер, уверенно работающий на 2 пикселях. Разница между 2 и 3 пикселями — это разница в цене камеры и объёме данных на кадр.
Движение: выдержка и затвор
На движущемся конвейере размытие съедает пиксели не хуже низкого разрешения. Смаз за время выдержки = скорость × выдержка; держите его меньше половины модуля — это запас на расфокус и слабую печать. На резком кадре наш декодер в синтетических испытаниях читал все коды при смазе в 1,25 модуля, 83 % — при 1,5 и 25 % — при 2 модулях.
| Выдержка, мкс | Смаз при 0,5 м/с, мм | Доля модуля 0,33 мм |
|---|---|---|
| 50 | 0,025 | 0,08 |
| 100 | 0,05 | 0,15 |
| 200 | 0,1 | 0,3 |
| 500 | 0,25 | 0,76 — без запаса |
Короткая выдержка требует яркой импульсной подсветки. На движущейся линии нужен глобальный затвор: скользящий (rolling shutter) искажает геометрию кода и подходит только для неподвижных объектов.
Чек-лист выбора камеры
- Узнайте размер модуля по шаблону печати, а не по размеру кода в миллиметрах.
- Измерьте разброс положения кода на линии и добавьте запас — это поле зрения.
- Посчитайте пиксели по формуле для k = 3 и k = 2.
- Посчитайте выдержку по скорости линии и проверьте, хватит ли света.
- Проверьте декодер на настоящих кадрах с линии, а не на тестовой печати.
Попробовать
Библиотека чтения libscanner рассчитана на коды «Честного знака» при двух пикселях на модуль. На 12 315 кадрах с работающего конвейера прочитано 98,4 %, медиана времени на кадр — 11 мс, 90-й процентиль — 13 мс; поверхность — плоская или этикетка на цилиндре с дугой до 90°. Загрузите кадр со своей линии в онлайн-сканер, поставьте пакет для Python командой pip install libscanner-dmr или возьмите библиотеку на GitHub.
«Честный знак» — товарный знак ООО «Оператор-ЦРПТ», «GS1» — GS1 AISBL; продукт не связан с их владельцами и ими не сертифицирован.