รหัส 39 เครื่องสแกนบาร์โค้ด


10

รหัส 39 ที่พัฒนาขึ้นในปี 1974 เป็นหนึ่งในสัญลักษณ์หรือประเภทบาร์โค้ดที่ใช้กันมากที่สุดแม้ว่าจะเป็นระบบ UPC / EAN ที่พบเห็นได้บ่อยที่สุดในการขายปลีก บาร์โค้ด 39 รหัสสามารถเข้ารหัสตัวอักษรตัวพิมพ์ใหญ่ตัวเลขและสัญลักษณ์บางอย่างและพิมพ์เล็กน้อยจากซอฟต์แวร์คอมพิวเตอร์โดยใช้แบบอักษรพิเศษ สิ่งนี้นำไปสู่การใช้ในเชิงพาณิชย์และอุตสาหกรรมอย่างกว้างขวาง (เช่นป้าย ID บริษัท , การติดตามสินทรัพย์, ระบบอัตโนมัติในโรงงาน)

สร้างโปรแกรมหรือฟังก์ชั่นที่สั้นที่สุดเพื่ออ่านบาร์โค้ด Code 39 ในทิศทางใดก็ได้จากภาพระดับสีเทาขนาด 512x512 พิกเซล; บาร์โค้ดอาจไม่เรียงแนวนอนหรือแนวตั้ง

  • โปรแกรมของคุณต้องยอมรับรูปแบบไฟล์ภาพมาตรฐานและสร้างข้อมูลที่เข้ารหัสในบาร์โค้ดเป็นเอาต์พุตมาตรฐานหรือค่าส่งคืน (ไม่รวมอักขระเริ่มต้น / หยุด)
  • ไม่มีภาพที่มีบาร์โค้ดรหัส 39 ที่ถูกต้องมากกว่าหนึ่งและไม่มีบาร์โค้ดเข้ารหัสอักขระช่องว่าง (ASCII 32)
  • หากไม่มีบาร์โค้ดรหัส 39 ที่ถูกต้องแสดงในภาพโปรแกรมจะต้องส่งออกเครื่องหมายคำถามเดียว ( ?)

ฉันได้เตรียมการใช้งานอ้างอิง JavaScript และชุดทดสอบรูปภาพในรูปแบบ PNG ทั้งที่มีบาร์โค้ดและไม่มี การใช้งานอ้างอิงซึ่งล้มเหลวเพียง 3 จาก 46 กรณีทดสอบในเว็บเบราว์เซอร์ล่าสุดมีจุดประสงค์เพื่อแสดงอัลกอริธึมการถอดรหัสที่เป็นไปได้หนึ่งวิธีไม่ให้ปฏิบัติตามข้อกำหนดข้างต้นอย่างเคร่งครัด

การส่งที่ถูกต้องผ่านอย่างน้อย 80% ของการทดสอบเหล่านี้ (37/46) และใช้เวลาไม่เกินหนึ่งนาทีในการทำเช่นนั้นสำหรับแต่ละภาพบน CPU ที่เร็วพอสมควร (เช่น 2.6 GHz quad-core) การใช้งานอ้างอิงของฉันผ่านการทดสอบ 93% และประมวลผลแต่ละภาพภายใน 10 วินาที (บนเดสก์ท็อปพีซีของฉันที่ใช้ Google Chrome)

(คำถามนี้ถูกเสนอบน Metaเมื่อวันที่ 28 พฤษภาคม 2011)


ดูเหมือนว่ามีข้อบกพร่องในตัวสร้างบาร์โค้ดของคุณ - มันทำให้เกิดช่องว่างกว้างระหว่างตัวอักษรแทนที่จะเป็นตัวแคบ
Keith Randall

@ Keith: Intercharacter Gap (I) ไม่จำเป็นต้องเท่ากับความกว้างของแถบแคบ (X) แม้ว่ามันจะเป็นบ่อย การส่งที่ถูกต้องควรจะสามารถอ่านบาร์โค้ดได้ที่ I ≤ 3X เครื่องมือสร้างกรณีทดสอบของฉันตั้งใจสุ่มช่องว่างระหว่างอักขระ adams1.com/39code.html
โปรดยืน

บาร์โค้ด Code 39 ที่มีช่องว่างระหว่างตัวอักษร anintercharacter ระหว่าง 1X ถึง 3X สามารถอ่านได้โดยสแกนเนอร์ทั่วไป? ฉันจะเป็นพยานและดูว่ามันใช้งานได้ไหม ในสายตาของฉัน intergap สามารถขยายขนาดการพิมพ์รหัส 39 เท่านั้นดังนั้นทำไมเราควรขยายช่องว่างระหว่างอักขระ

คำตอบ:


5

Python 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

โค้ดนั้นเลือก scanlines สุ่มจำนวนมากและพยายามจับคู่การทำงานแบบขาวดำบน scanline นั้นกับรูปแบบโค้ด 39 มันเป็นแบบสุ่มดังนั้นจึงไม่สามารถหาบาร์โค้ดในบางโอกาส (ฉันได้รับอัตราความล้มเหลวติดลบประมาณ 20% จากภาพทดสอบ) เมื่อมันล้มเหลวจะใช้เวลาประมาณหนึ่งนาทีในการทำงานเมื่อสำเร็จก็มักจะเร็วกว่านั้นมาก ฉันไม่เคยเห็นข้อผิดพลาดที่เป็นบวก


M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))
ugoren
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.