5.29. Штрихові коди та коди Data Matrix¶
Ще два сімейства кодів доповнюють декодери камери. Одновимірні штрихові коди – смуги на боці коробки пластівців, лікарняного браслету, транспортного ярлика – є найстарішими машиночитаними символами, що досі використовуються щодня. Коди Data Matrix – двовимірні, як QR-коди, але щільніші при тому ж обсязі корисних даних і орієнтовані на промислове маркування – знак виробника, вигравіруваний лазером на платі, а не постер на стіні. Модуль image має окремий декодер для кожного типу, що охоплює промислові, роздрібні та інвентарні застосування, яких споживчі 2D-коди так і не охопили повністю.
5.29.1. 1D штрихові коди¶
Одновимірний штриховий код кодує корисні дані у вигляді послідовності вертикальних смуг різної ширини, що зчитуються зліва направо (або зверху вниз для вертикально орієнтованих кодів). Ширина квантується до одного з невеликого набору значень, а послідовність ширин визначає символи в тій системі кодування, яку обрав принтер: цифрові для UPC-коду продукту, буквено-цифрові для артикула деталі на складі, або довільний текст для ярлика Code 128.
find_barcodes() сканує кадр у пошуку 1D штрихових кодів будь-якої підтримуваної системи кодування та повертає список об’єктів результатів BarCode:
codes = img.find_barcodes()
for c in codes:
img.draw_rectangle(c.rect, color=(0, 255, 0))
print(c.payload, c.type, c.quality)
Декодер сканує кадр горизонтально і вертикально в одному виклику, тому штриховий код, надрукований під будь-яким кутом, знаходиться за один прохід без необхідності обертати вхідне зображення. roi обмежує зону пошуку; інших параметрів налаштування не існує – декодер самодостатній.
Підтримувані системи кодування охоплюють поширені споживчі та промислові сімейства. Роздрібний набір: image.EAN2, image.EAN5, image.EAN8, image.UPCE, image.UPCA, image.EAN13 (числові коди фіксованої довжини на більшості споживчих упаковок), image.ISBN10 та image.ISBN13 (ті самі сімейства, адаптовані для книг). Набір загального призначення: image.I25 (Interleaved 2 of 5, поширений на транспортних ярликах), image.CODABAR (використовується в бібліотеках і банках крові), image.CODE39, image.CODE93 та image.CODE128 (буквено-цифрові системи кодування змінної довжини для довільного тексту). Сімейство полицевих цін image.DATABAR (RSS-14) та image.DATABAR_EXP (RSS-Expanded) завершують перелік.
Кожне виявлення містить словник обмежувального прямокутника – x, y, w, h, rect, corners – та декодований payload у вигляді рядка. type – це константа системи кодування з наведеного вище списку, яку програма перевіряє, коли їй важливо, яке саме сімейство було декодоване (наприклад, приймати лише EAN13 для програми сканера в продуктовому магазині).
Два поля, що мають значення для фільтрації – це rotation та quality. rotation – кут нахилу штрихового коду в площині зображення у радіанах: декодер справляється з довільними поворотами, але downstream-код, який хоче коректно відобразити виявлення, може захотіти відфільтрувати коди, що повертаються нахиленими понад певний поріг.
quality – це лічильник декодувань: кількість рядків сканування, які успішно декодували той самий корисний вміст. Декодер проходить по кожному рядку (і стовпцю) кадру, що перетинає штриховий код, і збільшує лічильник щоразу, коли декодування вдається. Чітко сфокусований і добре освітлений друкований штриховий код дає quality у десятках; частково перекритий або розмитий штриховий код може бути декодований лише на одному-двох рядках сканування з quality 1 – 2. Фільтрація виявлень нижче quality > 5 відкидає тимчасові помилкові декодування одного рядка без втрати справжніх виявлень.
Програма для 1D штрихових кодів невелика. Захопіть кадр, викличте find_barcodes(), пройдіть по поверненому списку, відфільтруйте за c.type та c.quality, та передайте c.payload через UART або USB на подальший етап, який записує або реєструє сканування.
5.29.2. Data Matrix¶
Код Data Matrix – це 2D-символ, що кодує корисні дані у вигляді сітки чорних і білих комірок, так само як QR-код. Він відрізняється від QR-коду двома практичними аспектами: він менший при тому ж обсязі корисних даних (кодування щільніше) і орієнтований на промислове використання, а не споживче (де домінують QR-коди). Патерни, вигравіровані лазером на металевих деталях на заводському конвеєрі, мітки на мікросхемах, маркування на медичних шприцах – все це зазвичай коди Data Matrix, а не QR-коди.
find_datamatrices() сканує кадр у пошуку кодів Data Matrix та повертає список об’єктів результатів DataMatrix:
codes = img.find_datamatrices()
for c in codes:
img.draw_rectangle(c.rect, color=(0, 255, 0))
print(c.payload, c.rows, c.columns)
roi обмежує зону пошуку звичайним чином. Єдиний специфічний для декодера параметр – effort, ціле число, що контролює інтенсивність роботи декодера з пошуку збігу. Більші значення покращують виявлення слабких, пошкоджених або похилих кодів ціною частоти кадрів; менші значення працюють швидше, але можуть пропускати коди, які знайшла б більша інтенсивність. Значення нижче приблизно 160 фактично не виявляють кодів; значення вище приблизно 240 дають незначне покращення. Значення за замовчуванням 200 є розумним балансом для чіткого зображення, а правильною відправною точкою для нової програми є це значення плюс-мінус 20, залежно від того, чи цілі чисті (менше) чи пошкоджені (більше).
Кожне виявлення містить словник обмежувального прямокутника та чотири виявлені кути, декодований payload та rotation у площині зображення в радіанах. Метадані компонування описують розмір і щільність прочитаного символу: rows та columns – це кількість комірок у сітці даних; capacity – максимальна кількість символів корисного навантаження, яку символ може нести при такому розмірі; padding – скільки з цих позицій залишились невикористаними (capacity - len(payload)).
Поля компонування корисні для програм, яким потрібно перевірити формат вигравіруваної мітки, а не її вміст. Система відстеження деталей може вимагати, щоб усі мітки були кодами 12×12 з не більш ніж двома символами заповнення; виявлення, що повернулося як 8×8 (символ меншого розміру, ніж передбачає специфікація) або з 10 символами заповнення (переважно порожній), позначається для повторного маркування.
5.29.3. Коли що обирати¶
Якщо вибір між QR та AprilTag залежить від типу корисних даних (довільні дані проти малого ідентифікатора), то вибір між штриховими кодами та кодами Data Matrix залежить від фізичної щільності та галузі.
Коли програма орієнтована на споживача і коди вже існують у обігу – продукти, книги, транспортні ярлики, бібліотечні книги – правильний детектор – find_barcodes(). Коди, які читає програма, були надруковані для зчитування іншою системою, і стандартизовані роздрібні системи кодування – це те, чого та система очікувала.
Коли програма промислова і коди друкуються для неї – відстеження запасів на заводському конвеєрі, коди партій на деталях, мітки відстежуваності на медичних виробах – правильний детектор – find_datamatrices() або find_qrcodes(), залежно від того, чи потрібна програмі більша щільність Data Matrix або більш широка підтримка інструментів QR.
Деякі програми поєднують усі чотири детектори в одному конвеєрі. Камера перевірки пакетів може виконати прохід find_barcodes() для друкованого UPC, прохід find_qrcodes() для транспортного QR-коду на тій же коробці, та прохід find_datamatrices() для вигравіруваного коду деталі – все на одному захопленому кадрі; три списки результатів корелюються за положенням обмежувального прямокутника та повідомляються як один запис виявлення. Витрати кожного детектора додаються, тому програми, що роблять це, зазвичай звужують кожен прохід відповідним roi, а не шукають по всьому кадру кожен тип коду.