Mã 39 Máy quét mã vạch


10

Mã 39 , được phát triển vào năm 1974, là một trong những ký hiệu hay loại mã vạch được sử dụng phổ biến nhất, mặc dù đó là hệ thống UPC / EAN thường thấy nhất trong bán lẻ. Mã 39 mã vạch có thể mã hóa chữ hoa, số và một số ký hiệu và không đáng kể để in từ phần mềm máy tính bằng phông chữ đặc biệt. Điều này dẫn đến việc sử dụng rộng rãi trong thương mại và công nghiệp (ví dụ: phù hiệu ID công ty, theo dõi tài sản, tự động hóa nhà máy).

Tạo chương trình hoặc chức năng ngắn nhất để đọc mã vạch Code 39 theo bất kỳ hướng nào từ hình ảnh thang độ xám 512x512 pixel; mã vạch có thể không được căn chỉnh theo chiều ngang hoặc chiều dọc.

  • Chương trình của bạn phải chấp nhận định dạng tệp hình ảnh tiêu chuẩn và tạo dữ liệu được mã hóa trong mã vạch dưới dạng giá trị đầu ra hoặc trả về tiêu chuẩn của nó (không bao gồm bất kỳ ký tự bắt đầu / dừng).
  • Không có hình ảnh nào chứa nhiều mã vạch Mã 39 hợp lệ và không có mã vạch nào mã hóa ký tự khoảng trắng (ASCII 32).
  • Nếu không có mã vạch Mã 39 hợp lệ được hiển thị trong hình ảnh, chương trình phải xuất một dấu hỏi duy nhất ( ?).

Tôi đã chuẩn bị một bộ triển khai tham chiếu JavaScript và bộ thử nghiệm hình ảnh ở định dạng PNG, cả mã vạch hợp lệ và không có. Việc triển khai tham chiếu, chỉ thất bại 3 trong 46 trường hợp thử nghiệm trong hầu hết các trình duyệt Web gần đây, nhằm hiển thị một thuật toán giải mã có thể, không tuân thủ nghiêm ngặt các đặc điểm kỹ thuật trên.

Một lần gửi hợp lệ vượt qua ít nhất 80% các thử nghiệm này (37/46) và mất không quá một phút để thực hiện điều đó cho mỗi hình ảnh trên CPU có tốc độ khá cao (ví dụ như lõi tứ 2,6 GHz). Việc triển khai tham chiếu của tôi vượt qua 93% các thử nghiệm và xử lý mỗi hình ảnh trong vòng 10 giây (trên máy tính để bàn của tôi chạy Google Chrome).

(Câu hỏi này đã được đề xuất trên Meta vào ngày 28 tháng 5 năm 2011).


Dường như có một lỗi trong trình tạo mã vạch của bạn - nó đặt một khoảng trống rộng giữa các ký tự thay vì hẹp.
Keith Randall

@Keith: Khoảng cách giữa các vi khuẩn (I) không phải bằng chiều rộng của một thanh hẹp (X), mặc dù nó thường như vậy. Các bài nộp hợp lệ sẽ có thể đọc được mã vạch trong đó tôi ≤ 3X. Trình tạo trường hợp thử nghiệm của tôi cố ý ngẫu nhiên khoảng cách giữa các vi khuẩn. adams1.com/39code.html
Vui lòng khởi động

Mã vạch mã 39 có khoảng cách anintercharacter giữa 1X và 3X có thể được đọc bởi hầu hết các máy quét phổ biến? Tôi sẽ làm chứng nó và xem liệu nó hoạt động theo cách này . Nhân tiện, trong mắt tôi, intergap chỉ có thể phóng to kích thước bản in Code 39, vậy tại sao chúng ta phải mở rộng khoảng cách giữa các vi khuẩn?

Câu trả lời:


5

Python, 899 ký tự

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

Mã này lấy hình ảnh định dạng pnm làm đầu vào, vì vậy tôi thường chạy nó như sau:

pngtopnm s01.png | ./barcode.py

Bản thân mã chỉ chọn rất nhiều đường quét ngẫu nhiên và cố gắng khớp màu đen và trắng chạy trên đường quét đó với các mẫu mã39. Nó được chọn ngẫu nhiên để đôi khi không thể tìm thấy mã vạch. . Tôi chưa bao giờ thấy một dương tính giả.


M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))
ugoren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.