Kod 39 Barkod Tarayıcı


10

1974 yılında geliştirilen Kod 39 , barkodların en yaygın kullanılan sembolojilerinden veya türlerinden biridir, ancak perakende satışlarda en sık görülen UPC / EAN sistemidir. Kod 39 barkodlar, büyük harfleri, sayıları ve bazı simgeleri kodlayabilir ve özel bir yazı tipi kullanarak bilgisayar yazılımından yazdırmak için önemsizdir. Bu, yaygın ticari ve endüstriyel kullanımlarına yol açtı (örneğin, şirket kimliği rozetleri, varlık takibi, fabrika otomasyonu).

512x512 piksel gri tonlamalı bir görüntüden herhangi bir yönde bir Kod 39 barkodu okumak için en kısa programı veya işlevi oluşturun; barkod yatay veya dikey olarak hizalanmamış olabilir.

  • Programınız standart bir görüntü dosyası biçimini kabul etmeli ve barkodda kodlanan verileri standart çıktısı veya dönüş değeri olarak üretmelidir (herhangi bir başlatma / durdurma karakteri içermez).
  • Hiçbir görüntü birden fazla geçerli Kod 39 barkodu içermez ve hiçbir barkod boşluk karakterini kodlamaz (ASCII 32).
  • Resimde geçerli bir Kod 39 barkodu gösterilmiyorsa, program tek bir soru işareti ( ?) vermelidir .

Hem geçerli barkodlu hem de içermeyen PNG formatında bir JavaScript referans uygulaması ve test paketi hazırladım . En son Web tarayıcılarında 46 test vakasından sadece 3'ünü başarısız olan referans uygulamasının, yukarıdaki spesifikasyona kesinlikle uymaması için olası bir kod çözme algoritması göstermesi amaçlanmıştır.

Geçerli bir gönderim, bu testlerin en az% 80'ini (37/46) geçer ve makul bir hızlı CPU'daki (ör. 2,6 GHz dört çekirdekli) her görüntü için bunu yapmak bir dakikadan fazla sürmez. Referans uygulamam testlerin% 93'ünü geçiyor ve her görüntüyü 10 saniye içinde (Google Chrome çalıştıran masaüstü bilgisayarımda) işliyor.

(Bu soru Meta'da 28 Mayıs 2011 tarihinde önerilmiştir .)


Barkod oluşturucunuzda bir hata var gibi görünüyor - dar bir karakter yerine karakterler arasında geniş bir boşluk bırakıyor.
Keith Randall

@Keith: Karakterler arası boşluğun (I), sık sık olmasına rağmen, dar bir çubuğun (X) genişliğine eşit olması gerekmez. Geçerli gönderimler I ≤ 3X olan barkodları okuyabilmelidir. Test senaryo oluşturucum, karakterler arası boşluğu kasıtlı olarak rastgele seçer. adams1.com/39code.html
Lütfen

1X ve 3X arasındaki karakter aralığı boşluğuna sahip bir Kod 39 barkodu en yaygın tarayıcılar tarafından okunabilir mi? Tanıklık edeceğim ve böyle çalışıp çalışmadığını göreceğim . Bu arada, gözlerimde, ara boşluk sadece Kod 39 çıktı boyutunu büyütebilir, neden karakter arası boşluğunu genişletmeliyiz?

Yanıtlar:


5

Python, 899 karakter

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

Bu kod giriş olarak bir pnm biçiminde görüntü alır , bu yüzden normalde şöyle çalıştırın:

pngtopnm s01.png | ./barcode.py

Kodun kendisi çok sayıda rastgele tarama çizgisi seçer ve bu tarama çizgisindeki siyah beyaz çalışmaları kod39 desenleriyle eşleştirmeye çalışır. Rasgele hale getirilir, böylece zaman zaman barkod bulamaz. (Test görüntülerinde yaklaşık% 20 yanlış negatif hata oranı elde ederim.) Başarısız olduğunda, çalışması yaklaşık bir dakika sürer, başarılı olduğunda genellikle bundan çok daha hızlıdır. Hiç yanlış bir pozitif görmedim.


M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))
ugoren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.