Σάββατο 7 Οκτωβρίου 2023

ΥΠΑΡΧΕΙ, ΣΤΟ BARCODE, το 666;;;;

ΑΠΑΝΤΗΣΙ, ΣΤΗΝ ΓΡΗΓΟΡΙΑΚΗ ΜΕΛΕΤΗ, ΤΟΥ ΔΙΕΥΘΥΝΤΟΥ ΜΗΧΑΝΟΓΡΑΦΗΣΗΣ ΤΩΝ ΧΟΡΗΓΟΥΝΤΩΝ ΤΟ BARCODE 

ΣΤΗΝ ΕΛΛΑΔΑ.

ΕΑΝ 13
του κ. Ευστρατιου Νικελλη
Διευθυντου Μηχανογραφησης
της GS1ΕΛΛΑΣ Α.Ε.



Σας επισυνάπτω έγγραφο στο οποίο περιγράφω τον reference decode algorithm όπως αναφέρεται στην βιβλιογραφία καθώς και ένα επιπλέον τρόπο αποκωδικοποίησης των barcode UPC/EAN.
Ο τρόπος που παρουσιάζεται στο έγγραφο που μου στείλατε ( είναι η Γ΄Μελέτη του μοναχου Προδρομου, της μονής Γρηγοριου) ομοιάζει αλλά δεν είναι ο reference decode.
Στον reference decode
a) οι μετρήσεις S των χαρακτήρων δεν ορίζονται σαν είναι ίδιες με τις μετρήσεις S των guard bars.
b) για τους χαρακτήρες χρησιμοποιούνται οι μετρήσεις e1, e2, b1, b2) για τα left και right guards η μέτρηση e1 και για το center guard η μετρήσεις e1,e2,e3.
Αν κάποιος αρχίζει να αλλάζει ένα αλγόριθμο επίλυσης ενός προβλήματος ή να παρουσιάζει κάποιο νέο καλό θα είναι να τον παρουσιάζει ολοκληρωμένο.
O αλγόριθμος που περιγράφεται στην εν λόγω μελέτη, από το προηγούμενο email που σας έστειλα φαίνεται ότι δεν αντέχει στην βάσανο της επαλλήθευσης.

Δεν έχω πρόθεση να "αντικρούσω" κανένα. Εγώ μπορώ μόνο να περιγράψω το τεχνικό του θέματος, σύμφωνα με τις γνώσεις μου τουλάχιστον και αυστηρά μόνο αυτό.
Οι τεχνικές πληροφορίες δεν επιδέχονται αντικρούσεις κτλ. αλλά μόνο κριτική και αξιολόγιση της ακρίβειας και της αρτιότητας των.
Αν λοιπόν τα όσα αναφέρω πάσχουν από πλευράς αρτιότητας ή ακρίβειας με χαρά θα δεχθώ οποιοδήποτε σχετική παρατήρηση.


ΜΕΡΟΣ ΑΠεριγραφή του reference decode algorithm (GS1 General Specifications Section 5.2.3) για τον προσδιορισμό του decodability και του decode ενός ΕΑΝ-13 συμβόλου και τον έλεγχο (verification) σύμφωνα με το ISO 15416.
Η παρακάτω περιγραφή είναι καθαρά τεχνική, και απόλυτα ακριβής χωρίς απλοποιήσεις συντομεύσεις και ερμηνείες. Προϋποθέτει γνώση της δομής ενός EAN-13, και των απεικονίσεων των χαρακτήρων 0 έως 9 καθώς και των απεικονίσεων των guard bars.
Ορισμοί:
Ορίζουμε S = το μετρηθέν πλάτος του χαρακτήρα. Παρακαλώ προσέξτε ότι για την αποκωδικοποίηση χαρακτήρων (και όχι των guard bars τα οποία δεν αποκωδικοποιούνται) η μέτρηση του πλάτους S γίνεται πάντα ώς την αρχή του επόμενου χαρακτήρα.
Ορίζουμε e1 σαν το μετρηθέν πλάτος από την αρχή μιας μπάρας μέχρι την αρχή της αμέσως επομένης και e2 σαν το μετρηθέν πλάτος από το τέλος μιας μπάρας μέχρι το τέλος της επομένης (μετρήσεις "ομοίων άκρων" edge to similar edge). Για τα σύνολα χαρακτήρων Α και Β, εκλαμβάνεται σαν αρχή της μέτρησης το δεξί άκρο των μπαρών, ενώ, για το σύνολο χαρακτήρων C, αρχή θεωρείται το αριστερό άκρο των μπαρών.
Οι σχέσεις αυτές παρουσιάζονται στο σχήμα 1.
Η τιμή του S χρησιμοποιείται για να βρεθεί το "reference threshold" (οριακή τιμή αναφοράς) RT και κατόπιν συγκρίνονται οι μεμονωμένες μετρήσεις "ομοίων άκρων" (edge to similar edge) e1 και e2 με την τιμή αναφοράς για να βρεθούν οι τιμές Ε1 και E2 από τις οποίες προσδιορίζεται ο χαρακτήρας.
Οι τιμές αναφοράς RT1,RT2,RT3,RT4 και RT5 δίνονται από τις παρακάτω σχέσεις.
• RT1 = (1.5 / 7 ) S
• RT2 = (2.5 / 7 ) S
• RT3 = (3.5 / 7 ) S
• RT4 = (4.5 / 7 ) S
• RT5 = (5.5 / 7 ) S
Για κάθε χαρακτήρα, οι μετρήσεις e1 και e2 συγκρίνονται με τις τιμές αναφοράς RT1,RT2,RT3,RT4,RT5 και υπολογίζονται οι τιμές Ε1, Ε2 σύμφωνα με τις παρακάτω σχέσεις.
αν RT1 <= ei < style=""> τότε Ei = 2
αν RT2 <= ei < style=""> τότε Ei = 3
αν RT3 <= ei < style=""> τότε Ei = 4
αν RT4 <= ei < style=""> τότε Ei = 5
διαφορετικά ο χαρακτήρας είναι λάθος, ή το bacode δεν είναι ΕΑΝ-13 (Σημείωση αναφέρουμε για λόγους συντομίας το ΕΑΝ-13 επειδή το ίδιο συμβαίνει και στο UPC-Α).
Στον πίνακα 1, φαίνεται η χρήση των τιμών E1 και Ε2 για τον προσδιορισμό του χαρακτήρα.
* σημειώστε οτι b1 και b2 είναι το πλάτος των δύο σκούρων μπαρών.
Όπως βλέπουμε, στον προηγούμενο πίνακα 1, οι χαρακτήρες προσδιορίζονται μοναδικά σε όλες τις περιπτώσεις εκτός από τις παρακάτω τέσσερεις.
• Ε1 = 3 και Ε2 = 4 (χαρακτήρες 1 και 7 στο σύνολο χαρακτήρων Α.
• Ε1 = 4 και Ε2 = 3 (χαρακτήρες 2 και 8 στο σύνολο χαρακτήρων Α.
• Ε1 = 4 και Ε2 = 4 (χαρακτήρες 1 και 7 στα σύνολα χαρακτήρων Β και C.
• Ε1 = 3 και Ε2 = 3 (χαρακτήρες 2 και 8 στα σύνολα χαρακτήρων Β και C.
Σε αυτές τις περιπτώσεις απαιτείται ο έλεγχος των μετρήσεων πλάτους των μπαρών (b1 και b2) σύμφωνα με τις παρακάτω σχέσεις.
• Για E1 = 3 και Ε2 = 4:
Ο χαρακτήρας είναι ο 1 εαν 7(b1 + b2)/S <= 4
Ο χαρακτήρας είναι ο 7 εαν 7(b1 + b2)/S > 4
• Για E1 = 4 και Ε2 = 3:
Ο χαρακτήρας είναι ο 2 εαν 7(b1 + b2)/S <= 4
Ο χαρακτήρας είναι ο 8 εαν 7(b1 + b2)/S > 4
• Για E1 = 4 και Ε2 = 4:
Ο χαρακτήρας είναι ο 1 εαν 7(b1 + b2)/S >3
Ο χαρακτήρας είναι ο 7 εαν 7(b1 + b2)/S <=3
• Για E1 = 3 και Ε2 = 3:
Ο χαρακτήρας είναι ο 2 εαν 7(b1 + b2)/S >3
Ο χαρακτήρας είναι ο 8 εαν 7(b1 + b2)/S <=3
Αν δεν ικανοποιείται κάποια από τις παραπάνω σχέσεις ο χαρακτήρας είναι λάθος ή το bacode δεν είναι ΕΑΝ-13.
Σημείωση: Το 6 δεν τίποτε το ιδιαίτερο αλλά αποκωδικοποιείται όπως ακριβώς τα 0, 3, 4, 5, και 9.
Στο επόμενο σχήμα φαίνεται ο τρόπος υπολογισμού του S που απαιτείται για τον προσδιορισμό των τιμών αναφοράς RT1 και RT2 που είναι κατάλληλος για τα βοηθητικά patterns. Για κάθε σύμβολο ή ΗΜΙΣΥ του συμβόλου (θα αναφερθώ σε αυτό παρακάτω) οι τιμές ei συγκρίνονται με τις τιμές αναφοράς για να προσδιοριστούν οι τιμές Εi. Οι τιμές αυτές πρέπει να συμφωνούν με τo σχημα 2 για όλα τα βοηθητικά patterns διαφορετικά το barcode έχει λάθος ή δεν είναι EAN-13.
Μετρήσεις βοηθητιών pattern
Όπως βλέπουμε στον πινακα 2 το αριστερό και δεξί guard pattern υπάρχει MONO Η ΜΕΤΡΗΣΗ E1, για το center guard οι μετρήσεις Ε1, Ε2 αλλά και Ε3 ενώ για όλους τους χαρακτήρες, όπως είδαμε παραπάνω, απαιτούνται οι μετρήσεις E1 και Ε2. Επίσης το S, το οποίο σύμφωνα με τον reference decode algorithm είναι ΜΕΤΡΗΣΗ δεν είναι μέγεθος που ΥΠΟΛΟΓΙΖΟΥΜΕ (όπως π.χ. αναφέρεται με απλή μέθοδο των τριών) προκύπτει με διαφορετικό τρόπο από ότι το S των χαρακτήρων που αναφέρθηκε παραπάνω. Νομίζω ότι στα παραπάνω φαίνεται τι είναι ΜΕΤΡΗΣΗ τι υπολογίζεται και ποίοί είναι οι τύποι που χρησιμοποιούνται τόσο για την ανάγνωση όσο και για την απόρριψη ενος συμβόλου που διαβάζει ένας scanner. Σημειώστε ότι δεν χρειαζόμαστε μια "ερμηνεία" του τι διαβάζει ο scanner, χρειαζόμαστε ένα τρόπο (αλγόριθμο) αξιολόγισης των πληροφοριών που διαβάζει, αποτίμησης της συμφωνίας των με συγκεκριμένες προδιαγραφές και τέλος αποκωδικοποίησης της πληροφορίας που περιέχουν, αν περιέχουν.
Αυτά όσο αφορά το reference decode algorithm του ΕΑΝ-13. Ίσως είναι περιτό να τονίσω ότι σε έναν αλγόριθμό που κάποιος παρουσιάζει έχουμε τη δυνατότητα και το δικαίωμα να ελέξουμε την αξιοπιστία του, την αποτελεσματικότητά του, την ταχύτητά του ίσως, την αποδοτικότητά του, αλλά δεν έχει νόημα να παρουσιάζουμε αυθαίρετες "απλοποιήσεις" αν δεν αποδείξουμε ότι οι απλοποιήσεις αυτές:
α) ΔΟΥΛΕΥΟΥΝ και β) προσφέρουν πράγματι βελτίωση σε σχέση με τον αρχικό αλγόριθμο σε κάποιο τομέα. Δεν έχει νόημα να "ευφευρίσκουμε" ανύπαρκτους αλγόριθμους με "συμβολικές" ερμηνείες από την στιγμή που όλα τα παραπάνω είναι γραμμένα και δημόσια και διαθέσιμα στον καθένα να τα ελέγξει.
Για όσους ενδιαφέρονται τώρα για ορισμένα επιπλεόν τεχνικά θέματα.
1ο Οι εν λόγω συμβολογίες δεν κατασκευάσθηκαν για pens αλλά όσο και αν ακούγεται περίεργο για fixed laser scanners. Τα "πενάκια" ανάγνωσης barcode όπως και αργότερα οι συσκευές CCD και οι φορητοί laser scanners έρχονται πολύ αργότερα όπως και οι σημερινοί image scanners. Οι σταθεροί laser scanner είναι αυτοί που προϋπάρχουν και με βάση αυτούς σχεδιάζεται το επίμαχο barcode. Σε γενικές γραμμές ένα laser scanner λειτουργεί εκτρέποντας με τη χρήση κινούμενων κατόπτρων σε διάφορες γωνίες μια ακτίνα laser έτσι ώστε να μπορεί να σαρώσει σε πολλές κατευθύνσεις. Επειδή ο τρόπος με τον οποίο κρατάμε ένα προϊόν με barcode μπροστά από τον scanner είναι απροσδιόριστος (τυχαία κλίση γωνία, προσανατολισμός) το barcode είναι έτσι κατασκευασμένο ώστε να διευκολύνεται η ανάγνωση σε αυτές τις συνθήκες. Ο scanner έχει περισσότερες πιθανότητες να "σαρώσει" σε ένα πέρασμα το μισό barcode το οποίο, σύμφωνα με τις προδιαγραφές μεγέθους, είναι σχεδόν τετράγωνο παρά ολόκληρο το barcde. Η σχεδίαση του EAN-13 διευκολύνει την ανάγνωση σε δύο "περάσματα" των δύο "μισών" του barcode. Ένας fixed laser scanner θα έχει πολύ μεγάλο χρόνο απόκρισης ή δεν θα διαβάσει καθόλου ένα barcode που δεν έχει αυτά τα χαρακτηριστικά όπως π.χ. το ITF (Interleave 2 of 5).
2ο Οι διάφοροι τύποι barcode (μονοδιάστατων ή γραμμικών) που υπάρχουν χωρίζονται σε δυο βασικές κατηγορίες discrete και continous (μια μετάφραση θα ήταν διακριτές και συνεχείς) με τα εξής χαρακτηριστικά. Σε μια discrete συμβολογία ο κάθε χαρακτηρας είναι στην ουσία "αυτόνομος" αρχιζει και τελειώνει με "μπάρα", μπορεί να αποκωδικοποιηθεί χωρίς την χρήση στοιχείων του "γειτονικού" (διαδοχικού του) χαρακτήρα. Το κενό μεταξύ των χαρακτήρων χρησιμοποιείται μόνο για τον διαχωρισμό των χαρακτήρων και το "πλάτος" του κενού δεν είναι σημαντικό αρκεί να είναι μεταξύ κάποιων ορίων ώστε να είναι δυνατή η διάκριση των επιμέρους χαρακτήρων και η διαπίστωση του τέλους της ανάγνωσης. Αντίθετα, στις continous συμβολογίες, όπως η ΕΑΝ-13, δεν υπάρχει "κενό" ανάμεσα στους χαρακτήρες, τυχόν κενό εμπεριέχεται στο πλάτος του κάθε χαρακτήρα. Στις continous συμβολογίες, οι χαρακτήρες αν αρχίζουν με σκούρα μπάρα τελειώνουν σε ανοιχτόχρωμη και το αντίθετο αλλά ποτέ δεν αρχίζουν και τελειώνουν σε σκουρόχρωμη μπάρα και για την αποκωδικοποίησή τους απαιτείται τμήμα του επόμενου χαρακτήρα. Η συμβολογία ΕΑΝ-13 ορίζεται σε όλα τα τεχνικά εγχειρίδια ή αναφορές σαν continous συμβολογία. Στην "Γ' μελέτη της Μονής Οσίου Γρηγορίου" αν και αναφέρεται ΡΗΤΑ ότι πρόκειται για continous συμβολογία ο συγγραφέας φροντίζει να την περιγράψει όπως ακριβώς είναι ο ΟΡΙΣΜΟΣ μιας descrete συμβολογίας. Χαρακτήρες που αρχίζουν με μπάρα και τελειώνουν σε μπάρα και κενό διάστημα που το "πυκνώνουμε" ή το "αραιώνουμε" κατά βούληση. Λυπάμαι αλλά αυτό δείχνει είτε ότι μάλλον δεν κατανοεί τους όρους που χρησιμοποιεί.
3ο Στη ίδια μελέτη αναφέρεται ένας τρόπος decoding που δεν γνωρίζω αλλά που αν κάποιος δοκιμάσει να τον εφαρμόσει θα δεί ότι μεταξύ άλλων ΔΕΝ δίνει μονοσήμαντο αποτέλεσμα, πράγμα που με κάνει να τον απορρίψω σαν τεχνικά ορθό ή άξιο λόγου. Πέρα από τον reference decode που αναφέρω πιο πάνω υπάρχουν και άλλες τεχικές λύσεις (για όποιον ενδιαφέρεται παρουσιάζω μια από αυτές στο δεύτερο μέρος) και διαφορετικοί αλγόριθμοι, αλλά σε κανέναν από αυτούς τα patterns αρχής και τέλους δεν ερμηνεύονται ή αποκωδικοποιούνται σαν χαρακτήρες ή δεν εκφράζονται με το ίδιο τρόπο με τους χαρακτήρες. Σημειώστε ότι όλοι οι σύνδεσμοι στο internet που υπάρχουν στην ως άνω μελέτη είτε δεν λειτουργούν είτε εγώ δεν μπόρεσα να τους εντοπίσω, και έτσι δεν μπορώ να έχω γνώμη γι' αυτές τις αναφορές.
4ο Τεχνικές αιτίες και απαντήσεις στο γιατί δύο και όχι μία μπάρα αρχής τέλους ή μέσης στο γιατί η συμμετρία των συμβόλων των χαρακτήρων, γιατί η ύπαρξη των διαφορετικών συνόλων χαρακτήρων, γιατί ο διαχωρισμός σε δυο μισά τμήματα υπάρχουν αρκεί κάποιος να τις αναζητήσει επιζητώντας ακριβώς αυτο "τεχνικές" απαντήσεις σε τεχνικά προβλήματα.
5o Σημειώστε ότι ο reference decode αλγόριθμος του GS1, σε αντίθεση με μια πιο πρακτική εφαρμογή που θα περιγράφω παρακάτω, δεν προορίζεται απλά για decoding αλλά και στην διαδικασία ISO verification για εκτίμηση/βαθμολόγιση της “αναγνωσιμότητας” (decodability) ενός συμβόλου.
ΥΓ.
Η δική μου αντιμετώπιση στο θέμα είναι καθαρά τεχνική. Δεν μπορώ, δεν έχω τις γνώσεις δεν έχω τις δυνατότητες και δεν επιθυμώ να κάνω σημασιολογικές, θρησκευτικές ή άλλου τύπου αναφορές, ερμηνείες ή εξηγήσεις σε κανένα θέμα και πολύ περισσότερο σε τεχνικά θέματα. Από τεχνική πλευρά δεν υπάρχει θέμα 666 ή άλλου κρυφού αριθμού. Όσο τώρα για τα άλλα, αν και είναι προσωπικό, δεν διστάζω να δηλώσω ότι είμαι Χριστιανός Ορθόδοξος και κατά την δική μου προσωπική άποψή που κατά πάσα πιθανότητα δεν έχει σημασία και δεν θα πρέπει να έχει για κανέναν άλλο, αλλά δεν έχω πρόβλημα να την δηλώσω, είναι ότι τα θέματα πίστης δεν έχουν ανάγκη τεχνικής επιβεβαίωσης ή επαλήθευσης και δεν μπορούν να υπόκεινται σε διαδικασίες τεχνικής επιβεβαίωσης ή απόρριψης.
Για δε το θέμα των ταυτοτήτων κτλ δεν έχω ούτε τις τεχνικές γνώσεις για το αντικείμενο, ούτε τεχνικά με αφορά και γι' αυτό το λόγο, αν και μπορώ να έχω προσωπική άποψη όπως όλοι, δεν έχω την ικανότητα ούτε τις γνώσεις ούτε και την επιθυμία να ασχοληθώ με αυτό τεχνικά ή να εκφράσω άποψη που δεν μπορώ να τεμκηριώσω. Παρακαλώ λοιπόν η άποψή μου, αν χρειάζεται κάπου, αυτό να είναι μόνο για τεχνικά θέματα του barcode όσο με αφορούν, στα οποία πάντα είμαι πρόθυμος να σας απαντήσω, όσο αυτό είναι μέσα στις δυνατότητές μου, αν και νομίζω ότι δεν είναι εδω ο κατάλληλος τόπος για τεχνικά θέματα.

ΜΕΡΟΣ Β
ΤΕΧΝΙΚΑ ΘΕΜΑΤΑ - ΜΟΝΟ ΓΙΑ ΤΕΧΝΙΚΟΥΣ Η ΦΙΛΟΜΑΘΕΙΣ ΑΝΑΓΝΩΣΤΕΣ
BARCODE DECODER APPLICATION NOTES

Διευκρινήσεις:
1. Υλικό (σημειώσεις, reference υλικό και application documentation) από το προσωπικό μου αρχείο,.
2. Προσοχή πρόκειται για decoding και όχι ISO verification).
3. Δεν έχει σχέση με τον reference decode του GS1 που περιγράφεται παραπάνω
4. Και πάλι, μόνο για τεχνικούς.
Ένας τρόπος αποκωδικοποίησης (decoding) ενός κωδικού ΕΑΝ-13 (UPC-A)
Θα προσπαθήσω να τα γράψω όλα Ελληνικά αν και είναι αρκετά δύσκολο για μένα να αποδώσω με ακρίβεια αυτό που θέλω να πω σε ορισμένα τουλάχιστον σημεία.
Για να αποκωδικοποιήσουμε ένα barcode πρέπει πρώτα να καταλάβουμε τη δομή του. Μια εξαιρετική αναφορά σε αυτό, αν και δεν είναι πλέον διαθέσιμη στο internet, υπήρχε στο http://www.semiconductor.agilent.com/barcode/…/Misc/upc.html
Εδώ δεν θα αναπαράγω το περιεχόμενο του παραπάνω site που ίσως κάποιος μπορεί να βρεί σε mirrors ή cached pages αλλά θα προσπαθήσω να επισημάνω μερικά σημεία τα οποία νομίζω αξίζει να προσέξουμε.
Μια καλή αρχή για να κατασκευάσει κάποιος ένα barcode decoder είναι οι συμβολογίες UPC/EAN και αυτό επειδή είναι κατά τη γνώμη μου καλά σχεδιασμένες. Διάφορες άλλες συμβολογίες υπάρχουν με τις οποίες αν και είναι δυνατόν να έχεις "καλή" ανάγνωση υπάρχει περίπτωση να έχεις "λάθος" αποτέλεσμα. Δηλαδή ναι μεν το barcode αποκωδικοποιείται σωστά αλλά ο αριθμός, η πληροφορία που διαβάσαμε είναι λάθος. Αυτό, απ' όσο γνωρίζω δεν μπορεί να συμβεί με τις συμβολογίες UPC/EAN αν ακολουθείς τους κανόνες. Κατ' αρχή ας δούμε τη δομή ενος ΕΑΝ-13 (αν κάνουμε ενα decoder για ΕΑΝ-13 αυτός θα διαβάζει και UPC).
Δομή των συμβολογιών UPC/EAN
Κάθε barcode ΕΑΝ-13 (UPC) αποτελείται από σκούρα και ανοιχτόχρωμα "στοιχεία" που στο εξής για λόγους απλοποίησης θα αναφέρουμε σαν μαύρα και λευκά αντίστοιχα. Τα "στοιχεία" αυτά έχουν συγκεκριμένο πλάτος 1, 2, 3, ή 4 "μονάδες πλάτους". Η μονάδα αυτή ονομάζεται module.
Κάθε ψηφίο στο ΕΑΝ-13 αποτελείται από 4 "στοιχεία" που έχουν συνολικό πλάτος όλα μαζί 7 modules. Ποτέ έξι, ποτέ τρία, ποτέ οκτώ, ποτέ 7,5. Πάντα επτά.
Ο κωδικός αριθμός που "γράφεται" στο barcode, η πληροφορία δηλαδή, κωδικοποιείται σε δύο ομάδες των έξι χαρακτήρων (το 13ο ψηφίο κωδικοποιείται στο parity των ψηφίων του αριστερού μέρους αλλά αυτό δεν είναι του παρόντος).
Οι ομάδες αυτές των ψηφίων περικλείονται από μπάρες αναφοράς, πλάτους ενός module η κάθε μία. (Αυτές είναι οι μπάρες οι οποίες αναφέρονται σαν "κρυφή" κωδικοποίηση του 666, αλλά όπως θα δείτε παρακάτω, δεν υπάρχει δυνατότητα ερμηνείας τους με αυτό τον τρόπο).
Τα παρακάτω θα σας μοιάζουν λίγο πολύπλοκα αλλά θα γίνουν ευκολότερα στη συνέχεια.
Για κάθε ψηφίο από το 0 έως το 9 υπάρχουν τρείς τρόποι να το απεικονίσουμε. Δύο τρόποι για το αριστερό μέρος και ένας για το δεξί. Έτσι έχουμε τα παρακάτω character sets.
3ος Πίνακας με τα patterns της συμβολογίας EAN-13
Διαβάζοντας από αριστερά προς τα δεξιά (αν και η πραγματική ανάγνωση μπορεί να συμβαίνει αντίστροφα) και αντιστοιχίζοντας το 0 στο λευκό και το 1 στο σκούρο χρώμα, ο προηγούμενος πίνακας γίνεται ο πινακας 4:
Digit Set A Odd Set B Even Set C Even
0 0001101 0100111 1110010
1 0011001 0110011 1100110
2 0010011 0011011 1101100
3 0111101 0100001 1000010
4 0100011 0011101 1011100
5 0110001 0111001 1001110
6 0101111 000101 1010000
7 0111011 0010001 1000100
8 0110111 0001001 1001000
9 0001011 0010111 1110100
Μερικά που αξίζει να σημειώσουμε εδώ:
Οι συμβολογία UPC χρησιμοπιεί μόνο τα set Α και C, η ΕΑΝ-13 τα χρησιμοποιεί όλα.
Η UPC χρησιμοποιεί το set Α για το αριστερό μέρος και το set C για το δεξί.
H EAN-13 ξεκινά ΠΑΝΤΑ με χαρακτήρα από το set Α στο αριστερό μέρος αν πηγαίνουμε με φορά από τα αριστερά προς τα δεξιά και ΠΑΝΤΑ με χαρακτήρα από το C αν πηγαίνουμε από δεξιά προς τα αριστερά.
Παρατηρώντας τους χαρακτήρες βλέπουμε ότι τα set Α και C είναι bit inverse το ένα του άλλου. Με δεδομένη μια φορά ανάγνωσης είναι αδύνατο να ξεχωρίσουμε το Α από το C βασιζόμενοι μόνο στην πληροφορία πλάτους των μπαρών. Π.χ. από αριστερά προς τα δεξιά ο χαρακτήρας 0 στο Α και στο C δίνει ακριβώς τα ίδια πλάτη (3, 2, 1, 1) στα transitions με αποτέλεσμα αν χρησιμοποιήσουμε μόνο αυτή την πληροφορία να μη μπορούμε να διακρίνουμε αν διαβάζουμε χαρακτήρα του συνόλου Α ή του C. Εφόσον λοιπόν τα A και C είναι ταυτόσημα, δίνουν δηλαδή πληροφορία που δεν τα διαφοροποιεί, μπορούμε να αγνοήσουμε το ένα από αυτά.
Είναι επίσης προφανές ότι τα C και B είναι bit reverse το ένα του άλλου. Αν και τα C και B δεν χρησιμοποιούνται ποτέ μαζί, είναι εύκολο, σε δεδομένη φορά ανάγνωσης να διακρίνουμε μεταξύ του B και C. π.χ. με φορά από αριστερά προς τα δεξιά το 0 στο B δίνει διαφορετικά πάχη transitions (1, 1, 2, 3) από το 0 στο C (3, 2, 1, 1). Γι' αυτό το λόγο λοιπόν ΕΙΤΕ το charater set Β ΕΙΤΕ το C είναι ουσιώδη στην εξαγωγή της κωδικοποιημένης πληροφορίας.
Τα character set Α και B είναι bit reversed KAI inversed το ένα του άλλου. Μια μόνο λειτουργία είτε inverse είτε reverse δεν θα μας επέτρεπε να αγνοήσουμε το ένα ή το άλλο (επειδή π.χ. θα προέκυπτε ταυτότητα όπως στην περίπτωση A με C).
Από τα παραπάνω συμπεραίνουμε ότι το character set C μπορεί να αγνοηθεί και να χρησιμοποιήσουμε μόνο τα Α και B για την αποκωδικοποίηση του EAN-13.
Αυτό γινεται προφανές αν μετατρέψουμε τα παραπάνω bit patterns σε πλάτη, όπως θα εμφάνιζε π.χ. μια ιδανική ανάγνωση από ένα light pen.

Digit Left Odd
(ean only) Left Even Right
0 3 2 1 1 1 1 2 3 3 2 1 1
1 2 2 2 1 1 2 2 2 2 2 2 1
2 2 1 2 2 2 2 1 2 2 1 2 2
3 1 4 1 1 1 1 4 1 1 4 1 1
4 1 1 3 2 2 3 1 1 1 1 3 2
5 1 2 3 1 1 3 2 1 1 2 3 1
6 1 1 1 4 4 1 1 1 1 1 1 4
7 1 3 1 2 2 1 3 1 1 3 2 1
8 1 2 1 3 3 1 2 1 1 2 1 3
9 3 1 1 2 2 1 1 3 3 1 1 2
Παρατηρήστε στον πινακα 5 ότι τώρα πλεόν δεν δίνουμε σημασία στη "κατάσταση" της μπάρας αν είναι λευκή ή μαύρη αλλά μόνο στο πλάτος. Με όλη τη σημασία της λέξης "δεν μας ενδιαφέρει" αν είναι λευκό ή μαύρο. Αυτό που κοιτάμε πλεόν είναι μόνο το πάχος (σε modules) των "στοιχείων". (Όπως ίσως γνωρίζει ο αναγνώστης διάφορες πένες (light pens) διαφόρων κατασκευαστών δίνουν 1 στο λευκό και άλλες τόσες δίνουν 0 στο λευκό ανάλογα με το είδος του αισθητήρα και τις πύλες που χρησιμοποιούν χωρίς αυτό να έχει σημασία ή να χρειάζεται να προσδιοριστεί στο decoding software).
Για κάθε ψηφίο συγκεντρώνουμε μια ομάδα από τέσσερα στοιχεία χρονομέτρησης (για τον decoder πλάτος = διάρκεια παλμού = χρόνος) που θεωρητικά θα πρέπει να έχουν άθροισμα επτά modules και τα οποία πρέπει να ταιριάζουν με κάποιο από τα στοιχεία του παραπάνω πίνακα.
(Σημείωση: πέρα από το βασικό κωδικό EAN-13 υπάρχουν και οι μορφές με επιπρόσθετο τμήμα 5 ή 2 ψηφίων. Η αποκωδικοποίηση και εδώ είναι ίδια, αλλά ίσως θα πρέπει να προσέξει κάποιος κατασκευαστής decoder το θέμα της αντίστροφης φοράς η οποία μπορεί να προκαλέσει λανθασμένες ανάγνωσεις. Σε κάθε περίπτωση όμως το decoding των χαρακτήρων είναι και εδώ ίδιο).
Αν διαβάσουμε έστω και ένα χαρακτήρα even parity πρόκειται για EAN-13 και ο συνδιασμός odd/even δίνει το πρώτο ψηφίο σύμφωνα με τους πίνακες του GS1. Το parity το βρίσκουμε προσθέτοντας την δεύτερη και τέταρτη μέτρηση από την τετράδα μετρήσεων του κάθε χαρακτήρα.
Χρήσιμες Παρατηρήσεις
Στη βασική του μορφή ένα barcode UPC/EAN αποτελείται από τρία σύνολα από framing elements και δύο σύνολα data elements.
FFF DDDD DDDD DDDD DDDD DDDD DDDD FFFFF DDDD DDDD DDDD DDDD DDDD DDDD FFF
Είναι απαραίτητο να μπορέσουμε να προσδιορίσουμε το πλάτος του module, σε μια δεδομένη ανάγνωση, και εδώ παρατηρούμε ότι το εξωτερικό στοιχείο καθενός από τα framing elements είναι μπάρα π.χ. τα δύο εξωτερικά framing elements είναι μπάρα, διάστημα, μπάρα. Το πάχος όλων αυτών των μπαρών είναι ίδιο και έτσι δίνουν μια καλή βάση για την εκτίμηση του πόση παραμόρφωση υπάρχει στην διαδικασία εκτύπωσης ή του pen decoding. Μια μέθοδος βαθμονόμησης είναι να προσθέσουμε τις δύο μπάρες και να διαιρέσουμε με το δύο, μετά να αφαιρέσουμε το λευκό, να πάρουμε το μισό του υπολοίπου και να εφαρμόσουμε αυτή τη διόρθωση σε όλα τα δείγματα όπως λαμβάνονται.
Για να γίνει πιο κατανοητό θα χρησιμοποιήσω το εξής παράδειγμα. Έστω οι μετρήσεις πλάτους ακραίου framing element 22,20,22 έτσι έχουμε 22+22 = 44, 44 / 2 = 22, 22 - 20 = 2, 2 / 2 = 1, έτσι στο παράδειγμα αυτό όλες οι μπάρες θα έπρεπε να μειωθούν κατά ένα δείγμα και όλα τα spaces να αυξηθούν κατά 1 δείγμα.
Αν η προσέγγιση αποκωδικοποίησης που κάνουμε είναι post process, θα μπορούσαμε να εφαρμόσουμε τα παραπάνω στα δύο άκρα και στα δείγματα της μέσης (αφού μπορέσεις πρώτα να τα εντοπίσεις, πράγμα όχι εύκολο!!!). Αν η προσέγγιση είναι "On-the-fly" decode χρησιμοποιούμε ότι διαβάσαμε πρώτο και κάνουμε επαναβαθμονόμηση (recalibrate) στην μέση.
Επιπλέον έλεγχος με το ψηφίο ελέγχου μπορεί να εξασφαλίζει μεγαλύτερη αξιοπιστία της ανάγνωσης αλλά προσωπικά δεν έχω συναντήσει περίπτωση να γίνεται το decode σύμφωνα με τα παραπάνω και να δίνει λάθος αποτέλεσμα.

ΞΕΚΑΘΑΡΙΣΜΑ FIXING Μετρήσεων
Τώρα που έχουμε τα timing data ίσως κάποιος πιστέψει ότι μπορούμε να αποκωδικοποιήσουμε, σωστά;
Εν μέρει, ναι, αν ήταν σωστά τυπωμένα, αν η πένα τα διάβασε με ακρίβεια. Δυστυχώς, συχνότατα αυτό δεν συμβαίνει, και χρειάζεται να κάνουμε λίγο "ξεκαθάρισμα" πριν μπορέσουμε να αποκωδικοποιήσουμε.
Πρώτα πρώτα, ας πάρουμε τέσσερα δείγματα και να τα προσθέσουμε. Ας πάρουμε το ψηφίο 5 που κωδικοποιείται σαν 1,2,3,1 σαν παράδειγμα το 10,20,30,10 θα ήταν μια ιδανική ανάγνωση του ψηφίου 5 επειδή όλα τα στοιχεία είναι πολλαπλάσια ενός module πλάτους 10. Το 20,40,60,20 θα ήταν ακόμη καλύτερο λόγω της μείωσης της σημασίας των κουκίδων αλλά ας μείνουμε με το 10,20,30,10.
Ας σημειώσουμε εδώ ότι τα δεδομένα που "βλέπουμε" έχουν ήδη υποστεί διαδικασία ελαφράς μορφής διόρθωσης από τις ρουτινες interrupt του scanner. Ένα πιο ρεαλιστικό παράδειγμα δεδομένων θα ήταν: 12, 19, 27, 12.
Αν και είναι εύκολο στο ανθρώπινο μάτι να δει και εδώ τις αναλογίες του χαρακτήρα “5”, δεν συμβαίνει το ίδιο με τον επεξεργαστή. Ας το διορθώσουμε. Πρώτα, προσθέτουμε τα στοιχεία 12+19+27+12 = 70, διαιρούμε με το 7 για να πάρουμε το τυπικό πλάτος του module που για τα συγκεκριμένα δεδομένα είναι 10.
Τώρα προσπαθούμε να διορθώσουμε κάθε μέτρηση ώστε να εκφράζεται σαν πολλαπλάσιο αυτού του module, αλλά εδώ χρειάζεται προσοχή. Θυμηθείτε το μόνο πράγμα για το οποίο είμαστε σίγουροι είναι τα άκρα της ομάδας. Εφαρμόζουμε λοιπόν τη διόρθωση από έξω προς τα μέσα. Στην ομάδα των 4 αριθμών έχουμε τρία "άκρα" από τα οποία πρέπει να "μετακινήσουμε". Χωρίς να μπώ σε παραπάνω λεπτομέρειες παίρνουμε την κάθε μέτρηση, την στογγυλοποιούμε σε ακέραια modules, λαμβάνουμε το υπόλοιπο και το προσθέτουμε στο επόμενο εσωτερικό δείγμα για τα δύο άκρα από έξω προς τα μέσα.
Διόρθωση αριστερού μέρους. 12,19,27,12 γίνεται 10,21,27,12
Διόρθωση δεξιού μέρους. 10,21,27,12 γίνεται 10,21,29,10
Διόρθωση μέσου. 10,21,29,10 γίνεται 10,20,30,10
Απλό δεν είναι; Αυτό θα διορθώσει πολλά σφάλματα εκτύπωσης και σάρωσης. Το σημαντικό είναι να έχουμε διατηρήσει τα δείγματα. Αν προσπαθήσουμε να στρογγυλοποιήσουμε τα δείγματα σαν αριθμούς θα επέλθει η καταστροφή. Αν δεν με πιστεύετε δοκιμάστε το σε πραγματικά δεδομένα!!! Παρεπιπτόντως δοκιμάστε με το "6" που έχει modules πλατους 1 και 4 μόνο.
Στον παραπάνω τρόπο υλοποίησης ενός decoder νομίζω ότι φαίνεται η χρήση ή όχι του 6 ή 66 ή 666. Σημειώστε ότι ακόμα και το character set C στο οποίο ο χαρακτήρας 6 εμφανίζεται από διαφόρους να προσομοιάζει τις μπάρες αρχής και τέλους αγνοείται τελείως. Αυτά όσο αφορά το τεχνικό μέρος λυπάμαι αν σας κούρασα. Για οποιαδήποτε διευκρίνιση ή επιπλέον ερμηνεία στη διάθεσή σας.
με εκτίμηση
Σ. Ν.

3 σχόλια:

  1. Όλα αυτά τι σημαίνουν; Ότι δεν υπάρχει 666 στο Barcode!

    ΑπάντησηΔιαγραφή
    Απαντήσεις
    1. Ναι δεν υπαρχει ειναι ενα μεγαλο παραμυθι οτι υπαρχει. Οι τρεις γραμμωσεις δεν ειναι αριθμος στο barcodes αλλα βοηθητικοι χρακτηρες. Ολα εχουν τις ονομασιες τους και δεν μπορουμε να ταυτιζουμε τα αταυτιστα.

      Διαγραφή
    2. Ευχαριστώ για την απάντηση.

      Διαγραφή

Δημοφιλείς αναρτήσεις

Αναζήτηση αυτού του ιστολογίου