Scanner di codici a barre codice 39


10

Il codice 39 , sviluppato nel 1974, è una delle simbologie o tipi più comunemente usati di codici a barre, sebbene sia il sistema UPC / EAN che viene spesso visto nelle vendite al dettaglio. I codici a barre del codice 39 possono codificare lettere maiuscole, numeri e alcuni simboli e sono banali per stampare dal software del computer utilizzando un font speciale. Ciò ha portato al loro ampio uso commerciale e industriale (ad es. Badge identificativi dell'azienda, tracciabilità delle risorse, automazione di fabbrica).

Crea il programma o la funzione più breve per leggere un codice a barre Code 39 in qualsiasi orientamento da un'immagine in scala di grigi 512x512 pixel; il codice a barre potrebbe non essere allineato orizzontalmente o verticalmente.

  • Il programma deve accettare un formato di file immagine standard e produrre i dati codificati nel codice a barre come output standard o valore di ritorno (senza includere alcun carattere di avvio / arresto).
  • Nessuna immagine contiene più di un codice a barre Codice 39 valido e nessun codice a barre codifica un carattere spazio (ASCII 32).
  • Se nell'immagine non viene visualizzato alcun codice a barre Codice 39 valido, il programma deve generare un singolo punto interrogativo ( ?).

Ho preparato un'implementazione di riferimento JavaScript e testato una suite di immagini in formato PNG, sia con codici a barre validi che senza. L'implementazione di riferimento, che non supera solo 3 dei 46 casi di test nei browser Web più recenti, ha lo scopo di mostrare un possibile algoritmo di decodifica, non conforme rigorosamente alle specifiche di cui sopra.

Un invio valido supera almeno l'80% di questi test (37/46) e non richiede più di un minuto per farlo per ogni immagine su una CPU ragionevolmente veloce (ad esempio quad-core a 2,6 GHz). La mia implementazione di riferimento supera il 93% dei test ed elabora ogni immagine entro 10 secondi (sul mio PC desktop con Google Chrome).

(Questa domanda è stata proposta su Meta il 28 maggio 2011.)


Sembra che ci sia un bug nel tuo generatore di codici a barre: mette un ampio spazio tra i caratteri anziché uno stretto.
Keith Randall,

@Keith: l'intercapedine tra i caratteri (I) non deve essere uguale alla larghezza di una barra stretta (X), sebbene spesso lo sia. Gli invii validi dovrebbero essere in grado di leggere codici a barre con I ≤ 3X. Il mio generatore di test case randomizza intenzionalmente il divario tra i caratteri. adams1.com/39code.html
PleaseStand

un codice a barre Code 39 con un intervallo di caratteri tra 1X e 3X può essere letto dagli scanner più comuni? Lo testimonierò e vedrò se funziona in questo modo . A proposito, ai miei occhi, l'intergap può solo ingrandire la dimensione della stampa del codice 39, quindi perché dovremmo espandere il suo gap intercharacter?

Risposte:


5

Python, 899 caratteri

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

Questo codice accetta un'immagine in formato pnm come input, quindi normalmente lo eseguo come:

pngtopnm s01.png | ./barcode.py

Il codice stesso seleziona solo molte linee di scansione casuali e cerca di abbinare le esecuzioni in bianco e nero su quella linea di scansione ai modelli di codice39. È randomizzato, quindi a volte non riesce a trovare codici a barre. (Ottengo una percentuale di errori falsi negativi di circa il 20% sulle immagini di prova.) Quando fallisce, impiega circa un minuto per l'esecuzione, quando ha successo spesso fa molto più velocemente di così. Non ho mai visto un falso positivo.


M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))
ugoren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.