Що означає перша цифра у штрих-коді

Що означає перша цифра у штрих-коді



Що означає цифри на штрих-коді?

Перші дві цифри позначають код країни, де виготовлена ​​продукція.

Наступні п'ять цифр позначають код підприємства, на якому виготовлена ​​продукція.

Наступні п'ять цифр позначають код товару, в якому: 1 цифра – найменування товару, 2 цифра – споживчі властивості, 3 цифра – розміри, вага, 4 цифра – інгредієнти, склад, 5 цифра – колір.

Тринадцята цифра - контрольна, вона необхідна при зчитуванні штрих-коду сканером.

Дуже рідко, але може траплятися і чотирнадцята цифра - вона позначає знак товару, який виготовлено за спеціальною ліцензією.

Як влаштований штрих-код?

Зі штрихкодами сучасна людина стикається щодня, навіть не замислюючись про це. Коли ми купуємо у супермаркеті продукти, їх коди зчитуються саме за допомогою штрих-коду. Також посилки, товари на складах, та інше та інше. Проте, мало хто знає, як реально це працює.

Як влаштований баркод, і що закодовано на цій картинці?

Спробуємо розібратися, заразом напишемо декодер таких кодів.

Вступ

Використання штрих-кодів має давню історію. Перші спроби автоматизації починалися ще в 50-х, патент на пристрій зчитування кодів було отримано в 1952р. Інженер, який займався сортуванням вагонів на залізниці, схотів спростити процес. Ідея була очевидною — кодувати номер за допомогою смуг та зчитувати їх за допомогою фотоелементів. У 1962 році коди стали офіційно використовуватися для ідентифікації вагонів на американській залізниці (система KarTrak), в 1968 році прожектор замінили лазерним променем, що дозволило підвищити точність і зменшити розмір зчитувача. У 1973 р. з'явився формат «універсального коду продукту» (Universal Product Code), й у 1974 з використанням сканера кодів продали перший продукт (жувальна гумка Wrigley's — це США) у супермаркеті.У 1984 третину магазинів використовували штриходи, у Росії вони почали використовуватися приблизно з 90-х років.

p align="justify"> Різних кодів під різні завдання зараз використовується досить багато, наприклад, послідовність «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» за тим самим принципом. Бажаючі можуть порівняти стартовий код на картинці, щоб переконатися, що правило виконується.

Тепер можна розпочинати програмування.

Отримуємо бітову послідовність

У принципі це найскладніша частина, і зрозуміло, алгоритмічно її можна реалізувати по-різному. Не впевнений, що наведений алгоритм оптимальний, але для навчального прикладу його цілком достатньо.

Для початку завантажимо зображення, розтягнемо його по ширині, візьмемо із середини зображення горизонтальну лінію, перетворимо її на ч/б і завантажимо у вигляді масиву.

від PIL import Image import numpy np import matplotlib.pyplot as plt image_path = "barcode.jpg" img = Image.open(image_path) width, height = img.size basewidth = 4*width img = img.resize((basewi height), Image.ANTIALIAS) hor_line_bw = img.crop((0, int(height/2), basewidth, int(height/2) + 1)).convert('L') hor_data = np.asarray(hor_line_bw, dtype="int32")[ 0]

На штрих-коді чорному відповідає «1», а в RGB навпаки, 0, так що масив потрібно інвертувати. Заодно обчислимо середнє значення.

hor_data = 255 - hor_data avg = np.average(hor_data) plt.plot(hor_data) plt.show()

Запускаємо програму, щоб переконатися, що баркод завантажений коректно:

Тепер слід визначити ширину одного «біта». І тому ми виділимо початок стартової послідовності «1101», записуючи моменти переходу графіка через середню лінію.

pos1, pos2 = -1, -1 bits = "" for p in range(basewidth - 2): if hor_data[p] < avg and hor_data[p + 1] -1: pos1 = p if bits == "101": pos2 = p break if hor_data[p] > avg and hor_data[p + 1] < avg: bits += "0" bit_width = int((pos2 - pos1)/3)

Ми записуємо лише переходи через середину, так що код «1101» буде записаний як «101», але нам цього достатньо, щоб дізнатися його ширину в пікселах.

Тепер власне декодування. Знаходимо черговий перехід через середину, і визначаємо кількість бітів, що потрапили до інтервалу. Оскільки збіг не абсолютний (код може бути трохи вигнутий або розтягнутий), використовуємо округлення.

bits = "" for p in range(basewidth - 2): if hor_data[p] > avg and hor_data[p + 1] < avg: interval = p - pos1 cnt = interval/bit_width bits += "1"*int( round(cnt)) pos1 = p if hor_data[p] < avg and hor_data[p + 1] >avg: interval = p - pos1 cnt = interval/bit_width bits += "0" * int(round(cnt)) pos1 = p

Не впевнений, що це оптимальний варіант, можливо, є спосіб кращий, бажаючі можуть написати в коментарях.

Якщо все було зроблено правильно, ми отримуємо на виході приблизно таку послідовність:

11010010000110001010001000110100010001101110100011011101000111011011
01100110011000101000101000110001000101100011000101110110011011001111
00010101100011101011

Декодування

Тут жодних складнощів у принципі немає. Символи Code-128 кодуються 11-бітним кодом, який має 3 різновиди (А, В і С) і може зберігати або різні кодування символів, або цифри від 00 до 99.

У нашому випадку початок послідовності 11010010000, що відповідає «Code B». Було моторошно влом вбивати вручну всі коди з Вікіпедії, тому таблиця була просто скопійована з браузера і її парсинг теж був зроблений на Python (hint: на продакшені так робити не треба).

CODE128_CHART = """ 0 _ _ 00 32 S 11011001100 212222 1! !01 33! 11001101100 222122 2 "" 02 34" 11001130 # 10010011000 121223 . 93 GS > 93 125 > 10100011110 111341 94 RS ~ 94 126 ~ 10001011110 131141 103 Start Start A 208 SCA 11010000100 214 11010010000 211214 105 Start Start C 210 SCC 11010011100 211232 106 Stop Stop - - - 11000111010 233111""".val | CODE128_CHART[6::8]] VALUESB = [value for value in CODE128_CHART[2::8]] CODE128B = dict(zip(SYMBOLS, VALUESB))

Тепер залишилося найпростіше. Розбиваємо нашу бітову послідовність на 11-символьні блоки:

sym_len = 11 symbols = [bits[i:i+sym_len] for i in range(0, len(bits), sym_len)]

Нарешті формуємо рядок і виводимо його на екран:

str_out = "" для символів в symbol: if CODE128A[sym] == 'Start': continue if CODE128A[sym] == 'Stop': break str_out += CODE128A[sym] print(" ", sym, CODE128A[sym] ]) print("Str:", str_out)

Відповідь на те, що закодовано в таблиці, наводити не буду, нехай це буде домашнім завданням для читачів (використання готових програм для смартфонів вважатиметься читерством:).

У коді також не реалізовано перевірку CRC, бажаючі можуть зробити це самостійно.

Зрозуміло, алгоритм неідеальний і був написаний за півгодини. Для професійних цілей є готові бібліотеки, наприклад pyzbar.Код із використанням такої бібліотеки займе всього 4 рядки:

від pyzbar.pyzbar import decode img = Image.open(image_path) decode = decode(img) print(decode)

(попередньо потрібно встановити бібліотеку, ввівши команду "pip install pyzbar")

Доповнення: про підрахунок CRC написав в коментарях користувач vinograd19:

Цікава історія контрольної цифри. Вона виникла еволюційно.
Контрольна цифра потрібна для того, щоб уникнути неправильного декодування. Якщо штрих-код був 1234, а його розпізнали як 7234, то потрібна валідація, яка попередить заміну 1 на 7. Валідація може бути неточна, щоб хоча б у 90% невалідні номери.

1-й підхід: Давайте просто візьмемо суму, щоб у залишку від розподілу на 10 був 0. Ну, тобто перші 12 символів несуть інформаційне навантаження, а остання цифри підбирається так, щоб сума цифр ділилася на 10. Декодуємо послідовність, якщо сума не ділиться на десять - значить декодували з багом і потрібно зробити це ще раз. валідний.

Це дозволяє уникнути проблем з автоматикою. Однак у момент створення штрих-кодів був фолбек у вигляді набивання номер на клавішах. вбито як 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-коди.

Подібні статті

Останні статті

Категорії