что такое бар код товара
Как устроен штрихкод?
Со штрихкодами современный человек сталкивается каждый день, даже не задумываясь об этом. Когда мы покупаем в супермаркете продукты, их коды считываются именно с помощью штрихкода. Также посылки, товары на складах, и прочее и прочее. Однако, мало кто знает, как же реально это работает.
Как устроен баркод, и что закодировано на этой картинке?
Попробуем разобраться, заодно напишем декодер таких кодов.
Введение
Использование штрихкодов имеет давнюю историю. Первые попытки автоматизации начинались еще в 50х, патент на устройство считывания кодов был получен в 1952г. Инженер, занимавшийся сортировкой вагонов на железной дороге, захотел упростить процесс. Идея была очевидной — кодировать номер с помощью полос и считывать их с помощью фотоэлементов. В 1962г коды стали официально использоваться для идентификации вагонов на американской железной дороге (система KarTrak), в 1968 прожектор заменили лазерным лучом, что позволило повысить точность и уменьшить размер считывателя. В 1973г появился формат «универсального кода продукта» (Universal Product Code), и в 1974 с использованием сканера кодов был продан первый продукт (жевательная резинка Wrigley’s — это же США;) в супермаркете. В 1984 треть магазинов использовали штриходы, в России же они начали использоваться примерно с 90х годов.
Разных кодов под разные задачи сейчас используется довольно много, к примеру, последовательность «12345678» может быть представлена такими способами (и это еще не все):
Приступим к побитовому разбору. Далее, все ниженаписанное будет относиться к виду «Code-128» — просто потому, что его формат довольно простой и понятный. Желающие поэкспериментировать с другими видами, могут открыть онлайн-генератор и посмотреть самостоятельно.
На первый взгляд штрихкод кажется просто беспорядочной последовательностью линий, на самом деле, его структура четко фиксирована:
1 — Пустое место, нужное для четкого определения начала кода
2 — Стартовый символ. Для Code-128 возможны 3 варианта (называемых А, В и С): 11010000100, 11010010000 или 11010011100, им соответствуют разные кодовые таблицы (подробнее в Википедии).
3 — Собственно код, содержащий нужные нам данные
4 — Контрольная сумма
5 — Стоп символ. Для Code-128 это 1100011101011.
6(1) — Пустое место.
Теперь о том, как кодируются биты. Тут все очень просто — если взять ширину самой тонкой линии за «1», то линия двойной ширины даст код «11», тройная «111», и так далее. Пустое место будет «0» или «00» или «000» по тому же самому принципу. Желающие могут сравнить стартовый код на картинке, чтобы убедиться что правило выполняется.
Теперь можно начинать программировать.
Получаем битовую последовательность
В принципе, это самая сложная часть, и разумеется, алгоритмически ее можно реализовать по-разному. Не уверен, что приведенный ниже алгоритм оптимальный, но для учебного примера его вполне достаточно.
Для начала загрузим изображение, растянем его по ширине, возьмем из середины изображения горизонтальную линию, преобразуем ее в ч/б и загрузим в виде массива.
На штрихкоде черному соответствует «1», а в RGB наоборот, 0, так что массив нужно инвертировать. Заодно вычислим среднее значение.
Запускаем программу, чтобы убедиться, что баркод загружен корректно:
Теперь нужно определить ширину одного «бита». Для этого мы выделим начало стартовой последовательности «1101», записывая моменты перехода графика через среднюю линию.
Мы записываем только переходы через середину, так что код «1101» будет записан как «101», но нам этого достаточно чтобы узнать его ширину в пикселах.
Теперь собственно декодирование. Находим очередной переход через середину, и определяем число бит, попавших в интервал. Поскольку совпадение не абсолютное (код может быть слегка изогнут или растянут), используем округление.
Не уверен что это оптимальный вариант, возможно, есть способ лучше, желающие могут написать в комментариях.
Если все было сделано правильно, то мы получаем на выходе примерно такую последовательность:
11010010000110001010001000110100010001101110100011011101000111011011
01100110011000101000101000110001000101100011000101110110011011001111
00010101100011101011
Декодирование
Здесь никаких сложностей в принципе, нет. Символы в Code-128 кодируются 11-битным кодом, который имеет 3 разновидности (А, В и С) и может хранить либо разные кодировки символов, либо цифры от 00 до 99.
В нашем случае, начало последовательности 11010010000, что соответствует «Code B». Было жутко влом вбивать вручную все коды из Википедии, поэтому таблица была просто скопирована из браузера и ее парсинг был тоже сделан на Python (hint: на продакшене так делать не надо).
Теперь осталось самое простое. Разбиваем нашу битовую последовательность на 11-символьные блоки:
Наконец, формируем строку и выводим ее на экран:
Ответ на то, что закодировано в таблице, приводить не буду, пусть это будет домашним заданием для читателей (использование готовых программ для смартфонов будет считаться читерством:).
В коде также не реализована проверка CRC, желающие могут сделать это самостоятельно.
Разумеется, алгоритм неидеален, и был написан за полчаса. Для более профессиональных целей есть готовые библиотеки, например pyzbar. Код с использованием такой библиотеки займет всего 4 строчки:
(предварительно нужно установить библиотеку, введя команду «pip install pyzbar»)
Дополнение: о подсчете CRC написал в комментариях пользователь vinograd19:
Интересна история контрольной цифры. Она возникла эволюционно.
Контрольная цифра нужна для того, чтобы избежать неправильного декодирования. Если штрихкод был 1234, а его распознали как 7234, то нужна валидация, которая предупредит замену 1 на 7. Валидация может быть неточная, чтобы хотя бы в 90% невалидные номера определялись заранее.
1-й подход: Давайте просто возьмем сумму. Чтобы в остатке от деления на 10 был 0. Ну то есть первые 12 символов несут информационную нагрузку, а последняя цифры подбирается так, чтобы сумма цифр делилась на 10. Декодируем последовательность, если сумма не делится на десять — значит декодировали с багом и нужно сделать это еще раз. Например, код 1234 — валидный. 1+2+3+4 = 10. Код 1216 — тоже валидный, а вот 1218 — нет.
Это позволяет избежать проблем с автоматикой. Однако в момент создания штрихкодов был фоллбек в виде набивания номер на клавишах. И там есть плохой кейс: если поменять порядок следования двух цифр, то контрольная сумма не меняется, и это плохо. То есть если штрихкод 1234 был вбит как 2134, контрольная сумма сойдется, а вот номер мы вбили неправильный. Оказывается, неправильный порядок цифр — это распространенный кейс, если стучать по клавишам быстро.
2-й подход. Хорошо, давайте сумму сделаем чуть сложнее. Чтобы цифры на четных местах учитывались дважды. Тогда при изменении порядка, сумма точно не сойдется к нужной. Например код 2364 валидный (2 + 3+3 + 6 + 4+4 = 20), а код 3264 — невалидный (3+ 2+2 + 6 + 4+4 = 19). Но тут оказался еще один плохой пример вбития. Некоторые клавиатуры такие, что десять цифр располагаются в два ряда. первый ряд 12345 и под ним второй второй ряд 67890. Если вместо клавишы «1» нажать правее клавишу «2», то контрольная сумма предупредит неправильный ввод. А вот если вместо клавишу «1» нажать ниже клавишу «6» — то может не предупредить. Ведь 6=1+5, и в случае когда эта цифра стоит на четном месте при вычислении контрольной суммы, мы имеем 2*6 = 2*1 + 2*5. То есть контрольная сумму увеличилась ровно на 10, поэтому ее последняя цифра не изменилась. Например контрольные суммы кодв 2134 и 2634 одинаковые. Та же ошибка будет, если мы вместо 2 нажмем 7, вместо 3 нажмем 8 и тд.
3-й подход. Ок, давайте что ли возьмем опять сумму, только цифры, стоящие на четных местах будем учитывать… трижды. То есть код 1234565 — валидный, потому как 1 + 2*3 + 3 + 4*3 + 5 + 6*3 +5 = 50.
Описанный способ стал стандартом вычисления контрольной суммы EAN13 за небольшими правками: число цифр стало фиксированным и равно 13, где 13-ая — это та самая контрольная цифра. Цифры на нечетных местах считаются трижды, на четных — один раз.
Заключение
Как можно видеть, даже такая простая вещь как штрихкод, имеет в себе немало интересного. Кстати, еще один лайфхак для тех, кто дочитал до сюда — текст под штрихкодом (если он есть) полностью дублирует его содержание. Это сделано для того, чтобы в случае нечитабельности кода, оператор мог ввести его вручную. Так что узнать содержимое штрихкода обычно просто — достаточно посмотреть на текст под ним.
Как подсказали в комментариях, наиболее популярным в торговле является код EAN-13, битовое кодирование там такое же, а структуру символов желающие могут посмотреть самостоятельно.
Если у читателей не пропал интерес, отдельно можно рассмотреть QR-коды.
Штрих-код и его расшифровка
Штриховой код представляет собой вид информации, наносимой на упаковку товара, и дающей представление об основных свойствах того или иного товара. Наносится штрих-код либо в виде последовательно располагаемых черных и белых полос, являющихся продолжением идеи азбуки Морзе, либо в виде геометрических рисунков, расположенных в определенной последовательности.
Вопрос: Можно ли внести в форму товарной накладной N ТОРГ-12 такой дополнительный реквизит, как штрихкод?
Посмотреть ответ
Расшифровка и структура
Тринадцатизначный код EAN разделяется на отдельные структурные зоны:
Расчёт контрольной цифры в штрих-коде
Воспользуйтесь приведённым ниже алгоритмом:
Полученная цифра и есть контрольная. Если не совпала — товар может быть произведён незаконно.
Штрих-коды стран производителей
Код производителя | Страна | Национальная организация EAN/UCC |
---|---|---|
00-13 | США и Канада | UCC (U.S.A. & Canada) |
30-37 | Франция | GENCOD-EAN France |
380 | Болгария | BCCI (Bulgaria) |
383 | Словения | EAN Slovenia |
385 | Хорватия | EAN Croatia |
387 | Босния и Герцеговина | EAN-BIH (Bosnia-Herzegovina) |
400-440 | Германия | CCG (Germany) |
45-49 | Япония | Distribution Code Center — DCC (Japan) |
460-469 | Россия | UNISCAN / EAN RUSSIA (Russian Federation) |
471 | Тайвань | EAN Taiwan |
474 | Эстония | EAN Eesti (Estonia) |
475 | Латвия | EAN Latvia |
476 | Азербайджан | EAN Azerbaijan |
477 | Литва | EAN Lithuania |
478 | Узбекистан | EAN Uzbekistan |
479 | Шри-Ланка | EAN Sri Lanka |
480 | Филиппины | PANC (Philippines) |
481 | Беларусь | EAN Belarus |
482 | Украина | EAN Ukraine |
484 | Молдова | EAN Moldova |
485 | Армения | EAN Armenia |
486 | Грузия | EAN Georgia |
487 | Казахстан | EAN Kazakhstan |
489 | Гонконг | HKANA (Hong Kong) |
50 | Великобритания | E Centre UK |
520 | Греция | HELLCAN — EAN HELLAS (Greece) |
528 | Ливан | EAN Lebanon |
529 | Кипр | EAN Cyprus |
531 | Македония | EAN-MAC (FYR Macedonia) |
535 | Мальта | EAN Malta |
539 | Ирландия | EAN Ireland |
54 | Бельгия, Люксембург | ICODIF/EAN Belgium.Luxembourg |
560 | Португалия | CODIPOR (Portugal) |
569 | Исландия | EAN Iceland |
57 | Дания | EAN Danmark |
590 | Польша | EAN Poland |
594 | Румыния | EAN Romania |
599 | Венгрия | EAN Hungary |
600-601 | Южная Африка | EAN South Africa |
609 | Маврикий | EAN Mauritius |
611 | Марокко | EAN Maroc (Marocco) |
613 | Алжир | EAN Algeria |
616 | Кения | EAN Kenya |
619 | Тунис | TUNICODE (Tunisia) |
621 | Сирия | EAN Syria |
622 | Египет | EAN Egypt |
624 | Ливия | EAN Libya |
625 | Иордания | EAN Jordan |
626 | Иран | EAN Iran |
627 | Кувейт | EAN Kuwait |
628 | Саудовская Аравия | EAN Saudi Arabia |
629 | Объединенные Арабские Эмираты | EAN Emirates |
64 | Финляндия | EAN Finland |
690-693 | Китай | Article Numbering Centre of China — ANCC (China) |
70 | Норвегия | EAN Norge (Norway) |
729 | Израиль | Israeli Bar Code Association — EAN Israel |
73 | Швеция | EAN Sweden |
740 | Гватемала | EAN Guatemala |
741 | Сальвадор | EAN El Salvador |
742 | Гондурас | EAN Honduras |
743 | Никарагуа | EAN Nikaragua |
744 | Коста-Рика | EAN Costa Rica |
745 | Панама | EAN Panama |
746 | Доминиканская Республика | EAN Republica Dominicana |
750 | Мексика | AMECE (Mexico) |
759 | Венесуэла | EAN Venezuela |
76 | Швейцария | EAN (Schweiz, Suisse, Svizzera) |
770 | Колумбия | IAC (Colombia) |
773 | Уругвай | EAN Uruguay |
775 | Перу | EAN Peru |
777 | Боливия | EAN Bolivia |
779 | Аргентина | CODIGO — EAN Argentina |
780 | Чили | EAN Chile |
784 | Парагвай | EAN Paraguay |
786 | Эквадор | ECOP (Ecuador) |
789 | Бразилия | EAN Brazil |
80-83 | Италия | INDICOD (Italy) |
84 | Испания | AECOC (Spain) |
850 | Куба | Camera de Comercio de la Republica de Cuba (Cuba) |
858 | Словакия | EAN Slovakia |
859 | Чехия | EAN Czech |
860 | Югославия | EAN YU (Yugoslavia) |
867 | Северная Корея | EAN DPR Korea (North Korea) |
869 | Турция | Union of Chambers of Commerce of Turkey (Turkey) |
87 | Нидерланды | EAN Nederland (Netherlands) |
880 | Южная Корея | EAN Korea (South Korea) |
885 | Таиланд | EAN Thailand |
888 | Сингапур | SANC (Singapore) |
890 | Индия | EAN India |
893 | Вьетнам | EAN Vietnam |
899 | Индонезия | EAN Indonesia |
90-91 | Австрия | EAN Austria |
93 | Австралия | EAN Australia |
94 | Новая Зеландия | EAN New Zealand |
955 | Малайзия | Malaysian Article Numbering Council (MANC) |
958 | Макао | EAN Macau |
Назначение штрих-кода
Введение в действие штрихового кода имело место в 1974 году, хоть патент на его изобретение был выдан в 1962 году.
Изначально назначением штрих-кода было нанесение маркировочных признаков на товары потребления с целью упрощения процедуры передачи товаров на реализацию и их последующей продажи конечным потребителям.
В настоящее время штриховой код имеет и иные функции, а именно:
Местом нанесения штрихового кода является упаковка товара, а способом его нанесения – приклеивание ярлыков с нанесенными на них печатными штрих-кодами.
Виды штрих-кодов
Существует два вида штриховых кодов, дифференцируемых по типу наносимых на товар графических изображений: линейный и двумерный. Различие состоит в способе кодирования информации и в способе ее считывания.
Линейный код читается по горизонтали, то есть в одном направлении. К линейным штрих-кодам относятся следующие подвиды, различающиеся, в том числе, и по количеству включаемых в код символов. Например, код EAN имеет два варианта – восьмизначный и тринадцатизначный. Логично предположить, что 13-значный код включает в себя больший объем информации о товаре.
Однако по сравнению с двумерными кодами все линейные штриховые коды обладают относительно малой информативной емкостью.
Двумерные штриховые коды изначально создавались для включения в них большего объема информации. Для обеспечения желаемой цели была разработана система, позволяющая включать в штрих-код два направления для считывания – горизонтальное и вертикальное.
Дополнительно двумерные штриховые коды дифференцируются на:
Современные двумерные штриховые коды могут вмещать в себя, в зависимости от количества слоев, от 7 до 1900 байт информации о товаре.
Применение в штрих-кодов в РФ
В Российской Федерации наиболее распространенным видом штриховых кодов являются линейный 13-значный и линейный 8-значный.
Предполагается, что в ближайшее время в РФ будет введен в действие расширенный штриховой код, в который будет вноситься информация о дополнительных характеристиках товара. Например:
Считывание
Функциональная польза от штрих-кодов может быть только в случае применения сканеров, считывающих со штрих-кода информацию. То есть отсутствие сканера сделает из штрих-кода всего лишь более или менее красивую картинку.
В настоящее время существуют два вида сканеров – стационарные, то есть кассовые, и портативные, чаще всего выглядящие как небольшая трубка с читающим устройством на одном из ее концов.
Применение того или иного вида сканера обусловлено их разрешительной способностью при считывании информации, объемом товаров, товарооборотом и количеством покупателей.
Сканер, считывая информацию, находится в постоянном контакте с базой данных конкретного субъекта предпринимательской деятельности. То есть, считывая штриховой код, сканер передает в компьютерную сеть не только факт покупки или отгрузки, но одновременно запускает алгоритмы перерасчета остатков продукции на складе и выдает информацию о необходимости пополнения запасов.
Что касается EAN-8:
По сути это младший собрат EAN-13, был введён для малоразмерных упаковок, для таких, где нет достаточно места для нанесения символики EAN-13.
Эволюция баркода
Баркод, безусловно, относится к одному из тех изобретений человечества, которые изменили течение нашей жизни. Благодаря появлению штрихового кодирования и его последующей эволюции, многие обыденные действия не только значительно упростились и ускорились, но иногда и приобрели неожиданные формы. В процессе нашей деятельности по разработке и улучшению алгоритмов интеллектуального распознавания документов (IDR) и движка распознавания баркодов Smart BarcodeReader мы постоянно систематизируем знания в предметной области. Понимание того, как развивается технология, позволяет нам совершенствовать наши разработки, делать их более быстрыми, точными и эффективными. Сегодня мы расскажем о том, как эволюционировал (и продолжает эволюционировать) баркод от линейного черно-белого рисунка к многомерной конструкции.
Как и большинство изобретений, первое поколение баркодов — линейный одномерный штрих-код — появился, когда возникла острая необходимость автоматизировать достаточно простую, но рутинную и кропотливую работу по сортировке и учету товаров в процессе логистики и продажи: что поступает на склад, что уходит со склада, что отгружается клиентам и в каком ассортименте. Когда все эти процессы неизбежно сопровождаются ручным заполнением необходимых документов, поиском нужной полки на складе, формированием отчетности по логистике, то требуются значительные затраты времени сотрудника. Кроме того, ошибки при ручном заполнении документов неизбежны. Рост товарооборота требовал кардинального решения, которое бы позволило быстро и без ошибок решать задачи контроля и учета.
Идея кодирования товаров появилась одновременно с идеей организации работы “идеального супермаркета”, разработанной студентом Гарвардской школы бизнеса Уоллесом Флинтом в начале 1930-х годов. Предложенное техническое решение предполагало, что покупатель самостоятельно формирует перечень покупок на складе, делая проколы в специальной перфокарте покупателя. На кассе эта перфокарта по задумке должна была считываться специальным устройством, товары подавались при помощи специального транспортера, а процесс обслуживания был быстрым и для покупателя, и для продавца. Главная проблема заключалась в том, что на тот период технологии и оборудование для обслуживания подобных процессов практически отсутствовали: ЭВМ, которая требовалась бы для организации считывания и обработки информации подобного класса была бы слишком громоздка и дорога.
Следующий подход к кодированию товарного ассортимента был предпринят в 1948 году, когда аспирантами-энтузиастами из Дрексельского технологического института (США) началась проработка технологии сбора аналитической информации о покупках непосредственно на кассах в супермаркетах на основании маркировки товаров. Тогда группа исследователей создала “гибрид” технологии оптической звуковой дорожки (optical soundtrack) и азбуки Морзе. В классической технологии оптической звуковой дорожки по краю кинопленки наносится покрытие с неравномерной плотностью. Эта неравномерность приводит к тому, что интенсивность луча проектора, проходящего через него, также изменяется. Эти колебания яркости и преобразуются в звук.
Исследователи трансформировали точки и тире азбуки Морзе в неравномерные полосы как бы “вытянув” их вниз. В результате получилась последовательность широких вертикальных линий (тире) и узких (точка), разделенных пробелами. Считывание комбинаций темных линий и светлых пробелов и интерпретация отраженных лучей оказалось работоспособной идеей, на которую впоследствии был получен патент.
Впервые на практике штрихкод был применен выпускником инженерного факультета Массачусетского технологического института, когда тот начал работать на железнодорожной станции и занимался несложной, но рутинной сортировкой вагонов, требующей к тому же постоянного соблюдения точности выполнения операций, недопущения ошибок внесения данных в регистрационные бумаги. Для каждого вагона необходимо выяснить его номер, свериться с сопроводительными документами, уточнить маршрут, определить место в составе и так далее. Эта процедура была достаточно длительной, отнимала много времени и требовала остановки состава.
К середине 20 века технологии уже шагнули вперед, и существовала возможность автоматического считывания достаточно крупных номеров вагонов при помощи фотоэлементов. Но считывание номера, нанесенного в виде арабских цифр, — это достаточно простая задача для человека, знающего, как выглядят цифры, и что они означают. Для машины цифры — это последовательность линий, расположенных под определенным углом. Отсутствие одной или нескольких линий или неточное нанесение делает задачу распознавания цифры (при отсутствии технологии OCR) слабореализуемой. Поэтому было предложено для упрощения машинного распознавания записывать номера не только обычными арабскими “человекочитаемыми” цифрами, но и кодом в виде широких полос синего и красного цвета.
Этот код располагали непосредственно на борту вагона и сделали его достаточно крупным, чтобы фотоэлемент мог выхватывать и безошибочно распознавать ярко освещенный прожектором штрих-код на проходящем мимо стационарного сканера вагона. Испытания подтвердили эффективность работы распознающей системы на скорости до 100 км/ч. Это была уже совершенно работающая технология, полностью изменившая отдельно взятый процесс в целой отрасли.
Позже, с усовершенствованием технологии, на смену прожектору пришел лазер, который не только потреблял меньше энергии, чем мощная лампа накаливания, но и позволил сделать наносимые штрих-коды значительно меньше по размеру, а саму сканирующую установку значительно компактнее вплоть до создания ручных и настольных сканеров. Развитие технологий лазерного сканирования и компактизация стала шагом к повсеместному использованию штрих-кодов как универсального средства маркировки товаров не только на железнодорожном транспорте.
В конце 60-х годов в США началась разработка универсальной системы нумерации товаров как средства идентификации. Система штрихового кодирования, которую начали применять в торговле, была разработана в 1972 году и получила название UPC — Universal Product Code. Штрих-коды этой системы начали присваивать всем видам товаров, производимым и зарегистрированных в США и Канаде. Одноименная организация начала активную пропаганду и внедрение использования штрих-кодов в промышленность и торговлю. Первое историческое считывание штрих-кода стандарта UPC в рознице произошло в американском супермаркете в 1974 году.
С 1977 года в Западной Европе для идентификации потребительских товаров стала применяться аналогичная американской система под названием «Европейский артикул» (EAN — European Article Numbering). Сегодня именно эта ассоциация и занимается распределением штрих-кодов для производителей товаров. Чтобы избежать дублирования номеров, штрих-коды товарам выдаются централизованно международной ассоциацией, включающей 98 организаций из 100 стран мира. Производитель может получить штрих-код для своего товара, предварительно зарегистрировавшись в этой ассоциации.
Штрих-коды семейств UPC и EAN оперируют достаточно небольшим алфавитом, позволяющим закодировать достаточно ограниченный объем информации. UPC, используемый в США, состоит из 12 символов, EAN — из 13 цифр и является немного усовершенствованной модификацией кода UPC. Кодирующие символы — это вертикальные полосы различной ширины и пробелы между ними. В стандартных линейных кодах зашифрована информация о стране происхождения товара, организации-изготовителе, непосредственно код товара. Для проверки корректности кода в конце размещается контрольная цифра и специальный знак, указывающий на то, что товар производится по лицензии.
Теперь посмотрим на код с точки зрения структуры и принципов кодирования. Здесь мы подробно разберем только один — стандартизированный — штрих-код типа UPC-A, чтобы показать: принципы кодирования, которые применяются значительно сложнее, чем кажутся на первый взгляд. Эта сложность обеспечивает безошибочность распознавания за счет минимизации риска неверного считывания.
Штрих-код типа UPC-A код разделен на 2 равные части и отображается в виде темных (штрихов) и светлых (пробелов) полос, которые кодируют 12-значный номер UPC-A. Каждая цифра — это уникальный набор из 2 штрихов и 2 пробелов переменной ширины в 1, 2, 3 или 4 модуля (в данном случае — минимальная дискретная ширина полосы). При этом общая ширина кодирующих полос для каждой цифры остается неизменной — 7 модулей. Таким образом содержательная часть товарного кода UPC-A кодируется в 84 единицах.
Многие задавались вопросом, почему на разных штрих-кодах одинаковые цифры могут быть несколькими разными способами (некоторые даже строили на сей счет конспирологические теории). Дело в том, что алгоритм кодирования штрих-кода не совсем линейный. В правой и левой частях кода цифры кодируются неодинаково: чередование штрихов и пробелов в цифрах происходит по трем наборам последовательностей (A, B и С). В последовательности А темных модулей всегда нечетное количество, в наборах В и С — четное. При этом набор В — представляет собой инверсию набора а (штрихи заменены пробелами и наоборот), а набор С — зеркальное отражение набора В. Знаки символа в числовых наборах А и В всегда начинаются слева со светлого модуля и заканчиваются справа темным модулем, а в числовом наборе С начинаются слева с темного модуля и заканчиваются справа светлым модулем. В левой стороне при кодировании цифр используются наборы А или В в зависимости от позиции цифры в коде, правая сторона кодируется набором C. Алгоритмы кодирования подробно прописаны в стандартах. Например, в этом.
Кроме полос, кодирующих информацию, графический код содержит ограничительные паттерны начала кода, завершения кода и середину. Концевые паттерны имеют вид штрих-пробел-штрих, а центральный — пробел-штрих-пробел-штрих. Наличие ограничительных паттернов, а также “тихой зоны” вокруг штрих-кода позволяет устройству чтения более точно определять границы штрих-кода, увеличивая тем самым скорость и точность распознавания.
Форматы штрих-кодов постоянно совершенствуются и меняются. На сегодняшний день помимо принятых в международном товарообороте стандартных Universal Product Code и European Article Numbering существует более 300 стандартов штрих-кодирования.
С 2005 года принят международный стандарт, в котором используются три основные типа кодирования информации о товарах:
Главное преимуществом штрих-кода — это его простота, функциональность и помехозащищенность. Главный недостаток же — относительно малое количество информации, которую с помощью него можно закодировать.
Эра 2-D
С развитием технологий обработки информации, на смену одномерным (линейным) штрих-кодам пришли двумерные. Если в линейных (одномерных) кодах используются штрихи, то в двумерных (и многомерных) в качестве элементов кодирования могут выступать уже другие фигуры, поэтому для того, чтобы дифференцировать одни от других, здесь будем называть многомерные коды баркодами. Исследования и разработки двумерных кодов начались во многих странах мира в 1980-х годах, так как объема кодируемой в линейных кодах информации оказалось явно недостаточным. Их появление стало естественной эволюцией систем кодирования, и одновременно технологий распознавания, программных и аппаратных возможностей распознающих систем.
Кроме этого возникала необходимость маркировать кодами буквально все: не только, допустим, узлы агрегатов, но и отдельные детали. Поэтому возникала необходимость миниатюризировать код и повысить плотность кодируемой информации на единицу площади.
В двумерном коде, как и следует из названия, кодирование происходит не по одному направлению, а по двум. Действительно, если расположить несколько одномерных кодов в виде чередующихся фрагментов, получится простейший двумерный код типа Stacked Linear (составной линейный). Если мы “упакуем” модули в квадрат — получится матричный баркод (Matrix).
Пример составного линейного баркода — PDF417, появившийся в 1991 году и запатентованный в 1993. Код PDF417 состоит из строк, образуемых “словами” — набором из чередующихся штрихов и пробелов (4 штриха, 4 пробела — первое число из названия кода). Общая длина каждого слова — 17 модулей (второе число в названии кода).
Помимо собственно содержательных слов, каждая строка состоит из старт-паттерна (крайнего левого набора, ключевых слов (индикаторов — они занимают крайние позиции на строке), необходимых для коррекции ошибок, и стоп-паттерна (Впрочем, существует также и так называемый “усеченный PDF417” (truncated), где исключен индикатор правой строки и уменьшен шаблон остановки до одной линии. Таким образом, усеченные PDF417 занимают меньше места, но они более восприимчивы к неправильному прочтению. Такой вариант PDF417 используют только там, где риск повреждения изображение кода минимальный). Так как все слова имеют одинаковую длину, размещенные одна под другой строки образуют колонки. В самом коде PDF417 как количество строк, так и количество столбцов может варьироваться: код может содержать от 3 до 90 строк, и иметь ширину от 3 до 30 столбцов включительно, не считая столбцов со словами индикаторами. Подробная статья про кодирование PDF417 недавно выходила на Хабре здесь, а о возможности его “ручного” декодирования — здесь.
Особенность кода PDF417 заключается в возможности кодировать информацию в текстовом режиме, числовом режиме и режиме данных (байт-режиме).
Так как в PDF417 возросло количество кодируемой информации, для ее корректного считывания и декодирования в коде применены механизмы коррекции ошибок. Это достигается путем добавления ключевых слов, с помощью которых машина может восстановить потерянные или считанные с ошибкой данные. Возможность исправления ошибок является ключевым достоинством PDF417: при распознавании распознающему устройству будут не страшны возможные искажения.
Как и предшественник — линейный штрих-код, PDF417 создавался в тот период, когда мобильные телефоны представляли собой устройства чуть меньше чемодана, а о встроенных камерах, пожалуй, даже не задумывались. Поэтому его использование подразумевало наличие специализированных сканеров, предназначенных для считывания такого кода. Это объясняет сложность данного штрих-кода и повышенные требования к разрешению печати.
Баркоды PDF417 широко используются для маркировки медицинских препаратов, наносятся на документы в системах электронного документооборота, применяются на бланках налоговых деклараций и проездных билетов.
Код в матрице
Матричная структура позволяет кодировать информацию как по вертикали, так и по горизонтали, за счет чего объем кодируемых данных значительно увеличивается. Важное преимущество всех матричных кодов заключается в возможности кодировать большой объём информации на очень маленькой площади.
Код Data Matrix
Код Data Matrix был изобретен компанией International Data Matrix в середине 1980-х для программы Space Shuttle, где требовалась маркировка большого количества деталей. Data Matrix был разработан до PDF417, то есть PDF417 не мог предшествовать Data Matrix, как указывается в некоторых источниках. Важное преимущество кода — его компактность и простота нанесения. В настоящее время Data Matrix описывается соответствующими стандартами ISO.
DataMatrix — это двумерный штрих-код, который может хранить до 3116 цифр и до 2335 букв. Информация в баркоде Data Matrix кодируется черными и белыми квадратами (модулями) при этом минимальный линейный размер модуля — 0.255 мм.
Шаблон поиска (finding pattern) в виде буквы «L» — две сплошные линии на внешней стороне кода Data Matrix.Этот шаблон позволяет сканеру штрих-кода задать изображению правильную ориентацию и считать информацию в правильном порядке.
Второй важный шаблон, необходимый для понимания кода машиной, — шаблон синхронизации (clocking pattern, clock track). Он необходим для информирования системы считывания о количестве модулей в матрице и для правильного распознавания сетки, на которой размещены модули.
Зона тишины (quiet zone) — это область, отделяющая границу штрих-кода от фона и других изображений. Для Data Matrix ширина «зоны тишины» равна линейному размеру используемого модуля. Маленькие габариты для зоны тишины позволяют минимизировать площадь нанесения Data Matrix на поверхность.
Специфика Data Matrix позволяет читать его как в прямом так и отраженном свете (то есть при использовании инвертированного изображения, при котором светлые модули становятся темными).
Еще одно преимущество Data Matrix, что от квадратные модули могут быть заменены на круглые. Это дополнительно расширяет возможности использования различных технологий нанесения, например в виде тиснения или ударной гравировки. Впрочем, эта же технология замены квадратного модуля на круглый взята на вооружения и в других разновидностях кодов, например в QR-коде.
Стандартизированный код Data Matrix сегодня рассматривается как ключевое звено идентификации и маркировки фармацевтических товаров и медицинских изделий. С 1 июля 2020 года маркировка кодами Data Matrix станет обязательной для всех лекарств, находящихся в обороте в России.
Подробный процесс создания Data Matrix описан здесь.
Код AZTEC
Баркод типа Aztec появился в 1995 году, как пишут, в результате объединения лучших практик разработки баркодов предыдущих поколений. Вид и структура кода Azteс разработана таким образом, чтобы она была одинаково удобна как для нанесения и считывания. Символы в целом квадратные на квадратной сетке с квадратным центральным “прицелом” из концентрических темных и светлых квадратов типа «яблочка» мишени (в англоязычных описаниях используется термин “bull’s eye”).
Самый маленький символ Aztec Code имеет площадь 15 x 15 модулей, а самый большой — 151 x 151. Самый маленький символ Aztec Code кодирует 13 цифровых или 12 буквенных символов, тогда как самый большой символ Aztec Code кодирует 3832 цифровых или 3067 буквенных символов.
В этом материале мы не ставим своей задачей подробно разбирать каждый код в отдельности, тем более, что про Aztec великолепно написано во всех подробностях на Хабре здесь.
QR-код
Добрались до самых, пожалуй, распространенных кодов, которые встречаем на каждом шагу.
QR код это еще одна разновидность матричного кода. Его название происходит от английского «Quick Response» — «Быстрый Отклик». Он был создан компанией Denso-Wave в 1994 году в Японии для внутреннего рынка (отличие QR-кода от других двумерных баркодов в том, что этот код позволяет кодировать символы японского (вернее, пришедшего из Китая в Японию) письма кандзи. Также в QR коде может быть заложена избыточная информация, которая позволяет закодировать определенные действия для программы смартфона или сканера для считывания.
Принципы кодирования QR-кода описаны достаточно подробно и их можно легко найти. Алгоритм того, как читать штрих-код не сканером, а глазами, можно прочитать, например, здесь.
В таком QR-коде можно легко закодировать адрес интернет-страницы, которая будет открываться при наведении на нее мобильного телефона:
А в этом QR-коде содержится не только адрес интернет-страницы, но и номер телефона, адрес электронной почты, почтовый адрес. Для создания карточки контакта достаточно навести на QR-код мобильный телефон, и информация будет автоматически распознана, а данные внесены в систему.
При этом даже наличие логотипа нашей компании, закрывающего около 10% кода, не мешает корректно распознавать всю закодированную информацию.
Ниже пример QR-кода самой большой размерности, который позволяет закодировать до 1852 символов.
Перечисленные баркоды позволяют кодировать цифровые и текстовые данные примерно с одинаковой эффективностью. Согласно сравнению, приведенному на сайте РИТ-сервис, специализирующейся на обработке штрих-кодов, QR-код позволяет кодировать большие объёмы цифровых данных на меньшей площади при одинаковом размере модуля по сравнению с Aztec и Data Matrix кодировать большие объёмы цифровых данных. Код Data Matrix уступает QR коду при кодировании более 88 цифр, Aztec уступает QR-коду при кодировании более 170 цифр. Но по эффективности кодирования текста QR-код значительно уступает Aztec, а Data Matrix превосходит только при объёме текста большем 298 символов. Однако, при кодировании текста набранного прописными (заглавными) буквами эффективности QR-код и Aztec близки, а Data Matrix уступает QR-коду уже при кодировании 88 букв.
Что объединяет все эти коды?
Машине важно понимать, что перед ней код, где находится его “начало” и “конец”. Для этого используются “зоны тишины”, специальные пограничные паттерны и “прицелы”. Кроме этого, машине необходимо понимать, в каком формате записаны данные, то есть как производить декодирование — в виде цифр, цифро-буквенного текста, или в формате данных. Машина также должна иметь возможность скорректировать ошибки, чтобы случайное выпадение нескольких пикселов изображения баркода не приводило к его полной нечитаемости. Коррекция ошибок в кодах DataMatrix, Aztec, QR осуществляется с помощью кодов Рида-Соломона, исправляющих ошибки чтения и позволяющие распознавать данные даже в сильно “испорченных” кодах (вплоть до 30% поверхности).
Зачем вообще нужны баркоды?
Баркоды стали настолько привычным явлением, что мы даже не задумываемся о том, зачем они нужны и какую функцию выполняют. И на самом деле, ответ не так очевиден, как кажется. Важно понимать, что баркод относится к средствам автоматизации, то есть обеспечивает коммуникацию между машиной и человеком. Сам по себе баркод не является рабочим инструментом, а представляет ценность лишь при наличии качественной системы распознавания баркодов и интерпретации полученных результатов.
Внедрение системы распознавания баркодов в бизнес-процессы позволяют ускорить поиск, внесение и извлечение информации из баз данных, улучшить логистический контроль, сделать взаимодействие с клиентами более комфортным.
Внедрение баркодов в медицинские карты и внедрение систем распознавания в медицинских учреждениях увеличивает скорость обслуживания пациентов и делает работу регистратуры
более системной и упорядоченной.
Внедряемые баркоды на билетах ускоряют прохождение через пункты контроля и турникеты, делая бесконтактную проверку билета более удобным решением, чем физическая проверка контролёром. В этом случае баркод служит элементом защиты от подделки, точно также как и внедряемые баркоды на защищенных полиграфических изделиях и документах строгой отчетности.
Процессы проведения платежей сильно упростились с внедрением баркодов на квитанции оплаты коммунальных услуг, штрафов, налогов и прочих социальных платежей. Все реквизиты оказываются зашифрованными и для проведения платежа в банковском приложении достаточно навести на баркод мобильный телефон, а приложение с модулем распознавания баркодов самостоятельно внесет все реквизиты получателя в нужные поля.
В чем задача и проблемы распознавания баркодов?
Каждый баркод должен быть распознан. Если он не может быть распознан, то из баркода он превращается в нераспознаваемый художественный орнамент.
Три главных задачи, которые необходимо решить при распознавании баркода, — его детектирование, локализация, детектирование битовой матрицы и распознавание. Решению каждой из задач могут помешать разные проблемы, возникающие из-за повреждений непосредственно носителя баркода, так и недостатков программно-аппаратных решений.
Детектированию и локализации баркода мешают различные проективные и нелинейные искажения, плохое освещение, блики, ошибки в нанесении. Уровень искажений зависит как от того, как создан баркод, так и от устройства и программного обеспечения, при помощи которых этот баркод считывается. Исходное сообщение кодируется битовой матрицей (из единиц и нулей) по особым правилам (у каждой символогии свои), которая каким-либо образом наносится на носитель. При нанесении обычно единице соответствует темный модуль, а нулю — светлый. Проблема в том, что недостаточно просто локализовать границы кода на носителе, нужно из изображения восстановить оригинальную битовую матрицу. А это сопровождается рядом сложностей, что приводит к наличию специального этапа в чтении кодов.
Как сказано выше, у каждого баркода есть своя степень коррекции ошибок. Даже сильно потертый баркод с высокой степенью коррекции ошибок может быть корректно считан системой. Но при этом сама система при сканировании баркодов должна отличать прилипшую к баркоду песчинку от информационно значимого элемента. Точно также система при считывании должна точно определять границы баркода, устранять возможные искажения, вызванные наклонами, перекосами, оптической деформацией. Особенно это касается двумерных, несущих в себе значительный объем информации.
Важным качеством системы распознавания баркодов является возможность быстро и точно распознавать их под разными углами, при плохой освещенности, вибрациях, тряске, с частично закрытым полем, при наличии бликов и пятен на поверхностях.
А что дальше?
Где два измерения, там 3 и 4. В середине 2006 года Японская компания “Content Idea of ASIA” c гордостью заявили о том, что они изобрели первый в истории 3D-код. В PM-коде (от образовано от “paper memory” — “бумажная память” ) в качестве третьего измерения к двумерному QR-коду был добавлен цвет. Если в черно белом двумерном QR-коде можно зашифровать 3 кб информации, то в трехмерном — до 720 (то есть в 240 раз больше). Вместо ссылки на изображение, используя топологию цветного 3D-кода, можно зашифровать картинку целиком, а также небольшие видео и аудио фрагменты. Технология получила патенты в Японии и Европе. Судя по всему, проект развивался до 2013 года, а к настоящему моменту заморожен или закрыт. Сайт японской компании-изобретателя не обновляется с 2013 года, а скачать приложение в официальных магазинах приложений уже невозможно (при желании его можно скачать с некоторых зеркал в сети и на размещенных на сайте разработчика образцах посмотреть, как оно работает).
В 2010 году Microsoft пошла дальше — объявила о создании новой концепции высокоплотных цветных баркодов (High Capacity Color Barcode (HCCB)), где код был представлен уже в виде той же QR-подобной матрицы, однако в качестве элементов кода выступали не черные квадратные модули, а цветные (4 или 8 цветов) треугольники, каждый из которых занимал ⅔ ячейки.
Проект HCCB тоже просуществовал до 2013 года: тогда Microsoft объявила о том, что проект не будет поддерживаться и был закрыт в 2015.Недавно в сети появилась информация о том, что Apple разрабатывает новые типы кодов, которые будут доступны в будущих модификациях ОС. Речь идет о круглых баркодах, где информация кодируется в виде 4-х цветных “капель” размещенных по центру и по периметру круга.
Разумеется, исследования возможности создания и использования цветных баркодов ведутся и сегодня, однако широкого применения пока они не встречают. Причина здесь в том, что при увеличении “измерений” кодировки и росте объема кодируемой информации, растет и количество ошибок, которые требуется исправлять. В цветной код должен быть заложена большая избыточность, необходимая для исправления ошибок, которые обусловлены не только геометрическими, но и хроматическими искажениями, возникающими в процессе отображения штрих-кода на носителе (экране, бумаге или любой другой поверхности) и при считывании. Чем выше ожидаемый уровень ошибок, тем большая избыточность должна быть заложена в коде. И как следствие падает плотность кода, что делает процесс его создания, считывания и декодирования экономически нецелесообразным.
Логично предположить, что вслед за кодами с тремя параметрами, последуют четырехмерные коды, динамически изменяющиеся во времени. С точки зрения теории это очень интересные задачи, ставящие вопрос о необходимости одновременной разработки софта, позволяющего распознавать такого рода объекты. И здесь мы подходим к концепции 4D-распознавания, о котором мы расскажем позже.