Код 39 Сканер штрих-коду


10

Код 39 , розроблений у 1974 році, є однією з найбільш часто використовуваних символогій або типів штрих-кодів, хоча саме система UPC / EAN найчастіше спостерігається в роздрібних продажах. Штрих-коди коду 39 можуть кодувати великі літери, цифри та деякі символи і є дрібницею для друку з комп'ютерного програмного забезпечення за допомогою спеціального шрифту. Це призвело до їх широкого комерційного та промислового використання (наприклад, значки компанії ID, відстеження активів, автоматизація фабрики).

Створіть найкоротшу програму або функцію для зчитування штрих-коду коду 39 у будь-якій орієнтації із зображення зображення в градаціях сірого 512x512 пікселів; штрих-код може бути вирівняний не горизонтально, ні вертикально.

  • Ваша програма повинна приймати стандартний формат файлу зображень і виробляти дані, закодовані у штрих-коді, як його стандартне значення виводу або повернення (не враховуючи жодного символу початку / зупинки).
  • Жодне зображення не містить більше одного дійсного штрих-коду коду 39, а жоден штрих-код не кодує символу пробілу (ASCII 32).
  • Якщо на зображенні не відображається дійсний штрих-код Code 39, програма повинна вивести єдиний знак питання ( ?).

Я підготував реалізацію посилань на JavaScript та тестовий набір зображень у форматі PNG, як із дійсними штрих-кодами, так і без них. Референтна реалізація, яка не дає лише 3 з 46 тестових випадків в останніх веб-браузерах, має на меті показати один можливий алгоритм декодування, не суворо відповідати вищевказаній специфікації.

Дійсне подання проходить щонайменше 80% цих тестів (37/46) і займає не більше однієї хвилини для кожного зображення на досить швидкому процесорі (наприклад, чотирьохядерний ядро ​​2,6 ГГц). Моя контрольна реалізація проходить 93% тестів і обробляє кожне зображення протягом 10 секунд (на моєму настільному ПК, на якому працює Google Chrome).

(Це питання було запропоновано в Meta 28 травня 2011 р.)


У вашому генераторі штрих-кодів виявляється помилка - він розміщує широкий простір між символами замість вузького.
Кіт Рендалл

@Keith: Міжчастовий зазор (I) не повинен бути рівним ширині вузької смуги (X), хоча це часто так і є. Дійсні матеріали повинні мати можливість читати штрих-коди, де I ≤ 3X. Мій генератор тестових випадків навмисно рандомізує міжзоряний проміжок. adams1.com/39code.html
Будь

штрих-код Code 39 з проміжком інтервального символу між 1X та 3X може бути прочитаний найпоширенішими сканерами? Я засвідчу це і побачу, чи працює він таким чином . До речі, на моїх очах інтергап може лише збільшити розмір роздруківки коду 39, то чому б нам розширити його інтерхарактерний розрив?

Відповіді:


5

Пітон, 899 символів

import sys,random
raw_input()
X,Y=map(int,raw_input().split())
input()
I=[' x'[v<'~']for v in sys.stdin.read()]
M={196:' ',168:'$',148:'*',388:'.',52:'0',97:'2',49:'4',112:'6',292:'8',73:'B',25:'D',88:'F',268:'H',28:'J',67:'L',19:'N',82:'P',262:'R',22:'T',193:'V',145:'X',208:\
'Z',42:'%',138:'+',133:'-',162:'/',289:'1',352:'3',304:'5',37:'7',100:'9',265:'A',328:'C',280:'E',13:'G',76:'I',259:'K',322:'M',274:'O',7:'Q',70:'S',385:'U',448:'W'\
,400:'Y'}
N=500
for w in' '*30000:
 a,b,c,d=eval('random.random(),'*4);A=''.join(I[int((a+(c-a)*i/N)*X)+X*int((b+(d-b)*i/N)*Y)]for i in range(N)).lstrip();T=A.count(' x')+1;K=A.count('x')/T;L=A.count\
(' ')/T;s='';z=c=0
 while A:
  z*=2;y=A.find(' ')
  if y<0:y=len(A)
  z+=y>K;A=A[y:]
  z*=2;y=A.find('x')
  if y<0:y=len(A)
  z+=y>L;A=A[y:];c+=2
  if c>9:
   if z/2in M:s+=M[z/2];z=c=0
   else:break
 if s and'*'==s[0]and'*'==s[-1]and'*'!=s:print s[1:-1];break

Цей код приймає зображення в форматі pnm як вхідний, тому я зазвичай запускаю його так:

pngtopnm s01.png | ./barcode.py

Сам код просто вибирає безліч випадкових ліній і намагається співставити чорно-білі пробіги на цій лінії сканування з моделями коду 39. Він рандомізований, тому не може знайти штрих-коди при нагоді. (Я отримую приблизно 20% помилкових негативних відмов на тестових зображеннях.) Коли це не вдається, для запуску потрібно близько хвилини, коли це вдається, це часто робить набагато швидше, ніж це. Я ніколи не бачив хибного позитиву.


M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))
ugoren
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.