Работая в крупном разработчике и интеграторе решений для маркировки - заметил, что многие участники оборота (т.е. типографии, производители и магазины) не знают об особенностях распознавания маркировки и мало понимания как она распознается, и какие трудности могут быть при ее не правильном нанесении.  Правильность маркировки как раз проверяется ее верификацией на специальных лабораторных приборах - верификаторах 2D кода. О важности верификации для успешной продаже товара на кассе и хочу рассказать.  Маркировка системы Честный знак - это логическое продолжение цифровизации ритейла. Она позволит сделать продажу товаров прозрачной, и избежать продажи подделки или, того хуже, просрочки. Я намеренно не буду рассказывать о политике и как это все вводится - кому интересно, многие истории гуглятся. Расскажу лишь о технической стороне вопроса - как теперь жить с маркировкой и какие новые термины она нам принесла в жизнь. Сейчас, на момент января 2022 г. уже вся скоропортящаяся молочная продукция обзавелась кодами DataMatrix GS1, позволяющими заменить штрихкод товара на кассе. Вы можете самостоятельно попробовать "пробить" товар на кассах самообслуживания в Пятерочке, Ашане, ВкусВилл и других супермаркетах - Зачастую, товар без проблем пробьется, как и по обычному штрих-коду EAN-13... Но, иногда он все же не распознается. Вот как с этим быть, как этого избежать - я и хочу рассказать в данной статье.  Если штрих-код пришел к нам из азбуки Морзе, где ширина линий как раз и означает "длину" импульса для счета - привет аналоговый мир, то 2D DataMarix уже более современен и представляет собой скорее Эксель таблицу с нулями и единицами в графическое исполнение в виде черных и белых квадратов, заключенных между неким постоянным шаблоном, как на Изображение ниже:  В чем сложность распознавать? Одна из основных проблем - что мы имеем дело с объектами реального мира, где снять код идеально бинарно - трудно, напечатать его ровно и качественно - трудно, а сохранить его в целости и сохранности от производства до кассы, не испачкав и не стерев по дороге - тоже не тривиальная задача. Для наглядности, я дошел до ближайшего супермаркета и нашел пару образцов кода, с которым на кассах придется "попотеть":  1ый пример: каплеструйная печать непосредственно на линии. При даже не большой вибрации продукта - сбивается геометрия кода. Разглядеть тут хоть какую-то вменяемую сетку для распознавания кода не так просто. Осложняет все еще и место нанесения, код нанесен на прозрачную крышку, без белой подложки. Его контраст будет не большим - разница между черным и "белым" квадратом (модулем DataMatrix) сетки не велика. 2ой образец - когда код инвертированный. А именно, нанесен с помощью лазерной маркировки. Эта технология выжигает из уже нанесенных черных чернил пигмент, делая модули белыми. Распознается не трудно, нужно лишь инвертировать изображение, как показано далее.  Если программно инвертировать изображение с лазерной маркировки - мы получим весьма качественный код с хорошим контрастом, НО многие OpenSource-распознавалки не умеют самостоятельно инвертировать снимки, необходимо дорабатывать их. 3ий образец мне не удалось найти в торговых сетях, но такая проблема также присутствует - это нанесение кода маркировки без соблюдения "Тихой зоны".  Тихая зона - особая граница возле DataMatrix кода, с рекомендованной толщиной от 3-х модулей кода, такая зона обеспечивает поиск и надежное считывание фиксированного шаблона кода. В этой области не должно быть ничего, кроме белого или, в случае инверсного кода, черного фона.  Если вам интересна внутренняя сторона распознавания кода, рекомендую прочитать статью. Я же продолжу про особенности распознавания: Перед вами пара кодов, имеющих свои особенности распознавания. На кассе встроенная в сканер или саму кассу камера (а 2D коды распознает зачастую именно смарт камера или смарт-модуль, на AliExpress можно найти отдельно модули именно для распознавания маркировки, которые и ставятся в некоторые кассы)  делает снимок нашего кода, и честно пытается превратить его в строку символов, и в этом есть особенностей, трудностей и тонкостей:  Чем подсветить датаматрикс, чтобы его лучше увидела камера?  Это строго регламентировано ГОСТом, необходимо либо красной подсветкой, либо белой.  Но так как эпоха 1D штрих кодов не закончилась - а они требуют красного света, то зачастую красную подсветку и используют. Как ни странно, допускается ИК (инфракрасная) подсветка и с ней распознавание работает все несколько надежнее. Парадокс в том, что многие цветные чернила в ИК диапазоне становятся не видимыми, и сканер видит только черную краску на белом фоне, найти код становится легче. Такой вот аппаратный фильтр изображения.  Разрешение съемки Для съемки Хорошего кода необходимо иметь разрешение минимум 3 пикселя на модуль кода. В случае с искаженным изображением - требования возрастают, так как алгоритмам нужно большее разрешение для восстановления искаженной геометрии кода.  Условия съемки Направленный точечный свет в сканер кассы может значительно испортить надежность распознавания кода из-за бликов и пересвета, несмотря на применяемые поляризационные фильтры Солнечный свет, попадающий на сканер и товар, также может повлиять на распознавание кассой маркировки Пред обработка кадра Если есть доступ к связке железо + ПО, и оно не является единым модулем, то зачастую его можно настроить или даже перепрошить, добавив свои требования. Так можно реализовать то же инвертирование изображения для лазерной маркировки.  Алгоритм распознавания Тут кто что использовал - тот и молодец. Есть пара OpenSource алгоритмов, требующих хороший снимок на вход. Есть готовые модули распознавания кодов, выдающие сразу строку в com порт. И вот с такими особенностями маркировки сталкивается Ритейл сейчас при выбытии товаров на кассах.  Верификация позволяет убедиться в том, что произведенный продукт отвечает всем требованиям к маркировке и гарантированно будет распознаваться даже модулем с Aliexpress. Тем самым производитель будет уверен, что магазин ему не вернет товар, кассир сможет его пробить, а сам производитель не "упадет" своей репутацией в глазах покупателя из-за плохой маркировки.  Как она происходит:  Верификация может быть как 100% поточной, непосредственно на линии производства, так и выборочной -  в лаборатории на специальном девайсе - Верификаторе. Стандарт оценки кода, как и требования к верификатору описаны в ГОСТ 15415-2012 и ГОСТ 16022-2008. Основной задачей верификатора является не распознать код, а дотошно проверить его структуру, и происходить это по 7и параметрам:  контраст символа  модуляция запас по коэффициенту отражения повреждение фиксированных шаблонов осевая неоднородность  неоднородность сетки  неиспользованное исправление ошибок Каждый из этих параметров имеет буквенную величину, называемую Грейдами, ABCDF, где А - самая высокая оценка, F - самая низкая. Коды начиная с "троечников" - с оценки "С", маркировка уверенно распознаются всем оборудованием на кассах, складах и т.д. Все что ниже - могут иметь проблемы.  Пример поточной верификации на Типографии в один ручей:  Если контраст кода не достаточный, алгоритм может "не заметить" фиксированные шаблоны кода и код может не найтись, даже несмотря на автояркость в модулях и камерах. Поэтому, блеклый код или напечатанный на цветном фоне (например, бежевом) и уж тем более на прозрачном может стать проблемой на кассе. Чтобы преобразовать матрицу черных и белых модулей в таблицу нулей и единиц необходимо использовать фильтрацию изображения для его разложения на черное и белое. Кто хоть раз запускал OpenCV - точно знает параметр Threshold, или Порог чувствительности, все модули, которые Ниже (темнее) этого порога - становятся "черными" Единицами в двоичном коде таблицы, а те модули, что Выше (светлее) порога - "белыми" Нулями. Этот параметр показывает нам на сколько идеально напечатан каждый модуль кода. Если модуляция будет низкой - некоторые модули скорее всего не распознаются. Но небольшие повреждения кода не так страшны - у кода есть запас прочности. Близкая по смыслу к контрасту величина, но проверяется не весь код целиком, а каждый модуль в отдельности относительно черного (0) и белого (255) значения в 8и битном изображение. Показывает, может ли небольшая потертость кода стать причиной его не распознавания, если запас не большой - то даже грязь или термоусадочная пленка будет способна испортить распознавание кода. Фиксированные шаблоны уже показывал ранее в статье, по ним алгоритм находит сам код, состоит из двух частей: так называемых L линий - они показывают ориентацию кода, и двух пунктирных линий - по ним в последующем строится сетка для распознавания точек (модулей) DataMatrix.  Фиксированный шаблон - один из самых важных параметров кода, если он нарушен, алгоритмы могут попросту не найти код на изображение. Если код будет не квадратным - а DataMatrix должен быть всегда квадратным. Это может также пагубно повлияет на его нахождение на снимке и распознавание.  Распознавание 2D кода построено на наложение на него сетки по центрам модулей, в последующем именно центры каждого квадрата (модуля) преобразовываются в двоичный код. Область преобразования называется аппертурой, и варьируется от 0.8 до 0.6 от размера модуля.  Если сетка имеет значительные искажения, а ровно и сам код не квадрат - это значительно усложняет алгоритм распознавания такого кода, не каждая OpenSoure библиотека имеет алгоритмы для корректировки искажений. Из-за искажения кода вы можете получить NoRead на кассе. Товар невозможно будет приобрести, даже если он будет полностью годным к употреблению. DataMatrixк код - это не просто набор двоичного кода по ASCII таблице, иначе бы потеря одного модуля ломала все распознавание кода.  Для обеспечения надежности хранящейся информации применяется алгоритм Рида-Соломона. Он обеспечивает максимальную безопасность кода DataMatrix: даже поврежденный на 25% код может быть прочитан без каких-либо трудностей. Первый, кого видят роботы. Прогр. машинного зрения