कोड 39 बारकोड स्कैनर


10

कोड 39 , जिसे 1974 में विकसित किया गया था, सबसे अधिक इस्तेमाल की जाने वाली सहजीवन, या प्रकार, बारकोड में से एक है, हालांकि यह यूपीसी / ईएएन प्रणाली है जो खुदरा बिक्री में सबसे अधिक बार देखी जाती है। कोड 39 बारकोड्स अपरकेस अक्षर, संख्याओं और कुछ प्रतीकों को सांकेतिक शब्दों में बदलना कर सकते हैं और एक विशेष फ़ॉन्ट का उपयोग करके कंप्यूटर सॉफ्टवेयर से प्रिंट करने के लिए तुच्छ हैं। इससे उनका व्यापक वाणिज्यिक और औद्योगिक उपयोग हुआ (जैसे कंपनी आईडी बैज, परिसंपत्ति ट्रैकिंग, कारखाना स्वचालन)।

एक 512x512 पिक्सेल ग्रेस्केल छवि से किसी भी अभिविन्यास में कोड 39 बारकोड को पढ़ने के लिए सबसे छोटा कार्यक्रम या फ़ंक्शन बनाएं; बारकोड को क्षैतिज या लंबवत रूप से संरेखित नहीं किया जा सकता है।

  • आपके प्रोग्राम को एक मानक छवि फ़ाइल प्रारूप को स्वीकार करना चाहिए और बारकोड में एन्कोड किए गए डेटा को उसके मानक आउटपुट या रिटर्न वैल्यू (किसी भी स्टार्ट / स्टॉप कैरेक्टर सहित नहीं) के रूप में उत्पन्न करना चाहिए।
  • किसी भी छवि में एक से अधिक मान्य कोड 39 बारकोड नहीं होता है, और कोई भी बारकोड एक अंतरिक्ष वर्ण (ASCII 32) को एनकोड नहीं करता है।
  • यदि कोई वैध कोड 39 बारकोड छवि में नहीं दिखाया गया है, तो प्रोग्राम को एक एकल प्रश्न चिह्न ( ?) का उत्पादन करना होगा ।

मैंने पीएनजी प्रारूप में मान्य बारकोड और बिना, दोनों के साथ जावास्क्रिप्ट संदर्भ कार्यान्वयन और छवियों का परीक्षण सूट तैयार किया है । संदर्भ कार्यान्वयन, जो कि हाल के वेब ब्राउज़रों में केवल 46 परीक्षण मामलों में से 3 में विफल रहता है, का उद्देश्य एक संभव डिकोडिंग एल्गोरिदम दिखाना है, जो उपरोक्त विनिर्देश के अनुरूप कड़ाई से नहीं है।

एक वैध सबमिशन इन परीक्षणों (37/46) में से कम से कम 80% गुजरता है और प्रत्येक छवि के लिए यथोचित तेजी से सीपीयू (जैसे 2.6 गीगाहर्ट्ज़ क्वाड-कोर) पर ऐसा करने में एक मिनट से अधिक नहीं लगता है। मेरा संदर्भ कार्यान्वयन 93% परीक्षण पास करता है और प्रत्येक छवि को 10 सेकंड के भीतर (Google डेस्कटॉप पर चलने वाले मेरे डेस्कटॉप पीसी पर) संसाधित करता है।

(यह सवाल 28 मई, 2011 को मेटा में प्रस्तावित किया गया था ।)


आपके बारकोड जनरेटर में एक बग दिखाई देता है - यह एक संकीर्ण के बजाय वर्णों के बीच एक विस्तृत स्थान रखता है।
कीथ रान्डेल

@ कीथ: इंटरचैकर गैप (I) को एक संकीर्ण बार (X) की चौड़ाई के बराबर नहीं होना चाहिए, हालांकि यह अक्सर होता है। मान्य सबमिशन को बारकोड को पढ़ने में सक्षम होना चाहिए जहां मैं। 3X है। मेरा परीक्षण केस जनरेटर जानबूझकर इंटरचैकर अंतर को यादृच्छिक करता है। adams1.com/39code.html
PleaseStand

1X और 3X के बीच इन्टरचैकर गैप के साथ कोड 39 बारकोड को सबसे आम स्कैनर द्वारा पढ़ा जा सकता है? मैं इसकी गवाही दूंगा और देखूंगा कि क्या यह इस तरह से काम करता है वैसे, मेरी नजर में, इंटरगैप केवल कोड 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

यह कोड इनपुट के रूप में एक पीएनएम प्रारूप छवि लेता है , इसलिए मैं सामान्य रूप से इसे चलाता हूं:

pngtopnm s01.png | ./barcode.py

कोड ही बहुत सारे यादृच्छिक स्कैनलाइन को चुनता है और उस स्कैनलाइन पर काले और सफेद रन को कोड39 पैटर्न से मिलाने की कोशिश करता है। यह यादृच्छिक होता है इसलिए यह बारकोड को मौके पर खोजने में विफल हो सकता है। (मैं परीक्षण छवियों पर लगभग 20% झूठी नकारात्मक विफलता दर प्राप्त करता हूं।) जब यह विफल होता है तो इसे चलाने में लगभग एक मिनट लगता है, जब यह सफल होता है तो यह अक्सर इससे बहुत तेज होता है। मैंने कभी झूठा सकारात्मक नहीं देखा।


M=dict(zip('UK.-RQA+HGYXON*TEDJ1/87$%540WVML SCBIZPF3296',[385,259,...]))
ugoren
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.