| Operatoren |
set_bar_code_param — Setzen ausgewählter Parameter des Barcode-Modells.
set_bar_code_param( : : BarCodeHandle, GenParamNames, GenParamValues : )
Der Operator set_bar_code_param erlaubt es, Parameter, welche Eigenschaften des Barcodes beschreiben oder das Verhalten des Modells bei der Symbolsuche steuern, zu verändern. Damit kann auf Besonderheiten des Barcodes oder dessen Abbildung durch den Bildsensor eingegangen werden. Alle Parameter können auch direkt beim Anlegen des Modells mit create_bar_code_model übergeben werden. Die aktuelle Konfiguration kann mit Hilfe von get_bar_code_param ausgelesen werden.
Es folgt eine Übersicht über die verschiedenen generischen Parameter mit den jeweiligen Wertebereichen und Defaultwerten:
Größe der Barcode Elemente:
Die beiden ersten Parameter, 'element_size_min' und 'element_size_max', beeinflussen die Suche nach Kandidatenregionen und die Dekodierung der Barcodes. Sie werden aber nicht strikt als Grenzen für die Größe der Elemente gefundener Barcodes verwendet. D.h. es können auch Barcodes gefunden werden, deren Elemente schmaler als 'element_size_min' oder breiter als 'element_size_max' sind.
Die minimale Größe eines Elements, d.h. die minimale Dicke aller Striche und Zwischenräume. Der Wert dieses Parameters ist in Pixel definiert. Für Barcodes mit niedriger Auflösung sollte der Wert auf 1.5 reduziert werden, ggf. sogar auf bis zu 1.2. Für sehr große Barcodes kann der Wert entsprechend vergrößert werden, was kürzere Laufzeiten mit sich bringt.
Typischer Wertebereich: [1.2 .. 10.0]
Standardwert: 2.0
Die maximale Größe eines Elements, d.h. die maximale Dicke aller Striche und Zwischenräume. Der Wert dieses Parameters ist in Pixel definiert. Er sollte groß genug sein, damit für das komplette Symbol die Kandidatenregion gefunden wird. Anderseits darf er nicht so groß gewählt werden, dass zwei benachbarte Barcodes zu einem einzelnen Kandidaten verschmelzen.
Typischer Wertebereich: [4.0 .. 60.0]
Standardwert: 8.0
In manchen Barcodeaufnahmen variiert die Breite des kleinsten Elements über den Bereich des Barcodes. Diese Veränderungen entstehen durch perspektivische Projektion oder durch Deformation der Oberfläche, auf welcher der Barcode gedruckt ist (z.B. eine Tonnenverzerrung auf einer Flasche). Standardmäßig kann der Barcodeleser solche Verzerrungen nicht ausgleichen. Sollte die Einstellung 'element_size_variable' auf 'true' gesetzt sein, wird versucht, solche Deformationen lokal bei der Dekodierung auszugleichen. Dies kann dazu führen, dass Barcodes auch unter solche Bedingungen gelesen werden können. Man beachte, dass nicht alle Deformationen ausgeglichen werden können.
Der Parameter 'element_size_variable' ist nur für folgende Barcodetypen implementiert:
GS1 DataBar Limited
GS1 DataBar Expanded
GS1 DataBar Expanded Stacked
Bei anderen Barcodetypen hat dieser Parameter keinen Effekt.
Werte: 'false', 'true'
Standardwert: 'false'
Die minimale Höhe des Barcodes. Der Wert dieses Parameters ist in Pixel definiert. Die Voreinstellung mit -1 bedeutet, dass intern die Höhe des Barcodes automatisch entsprechend den anderen Einstellung gewählt wird. Bei sehr flachen Barcodes mit einer Höhe von weniger als 16 Pixeln ist es sinnvoll die Höhe manuell einzustellen, damit der Barcode gefunden und gelesen werden kann. Die minimale Höhe beträgt 8 Pixel. Bei sehr hohen Barcodes, z.B. mit 70 Pixeln und mehr, kann das manuelle Setzen auf die entsprechende Höhe zu einer Beschleunigung beim Lesen führen.
Typischer Wertebereich: [-1, 8 .. 64]
Standardwert: -1
Scanparameter:
Die maximale Anzahl von Scanlinien, die während des Scannens eines (Kandidat-)Symbols benutzt werden. Wenn 'num_scanlines' nicht gesetzt ist (der Parameter hat einen Wert von 0), wird die Anzahl der Scanlinien nach einer internen Regel bestimmt: 10 für alle einzeiligen Barcodes, 20 für GS1 DataBar Stacked beziehungsweise GS1 DataBar Stacked Omnidirectional und 55 für GS1 DataBar Expanded Stacked. Durch diesen Parameter kann die Geschwindigkeit in zwei Fällen gesteigert werden. Im ersten Fall beinhaltet das Bild viele falsche Kandidaten. Während der Barcode selbst normalerweise nach ein oder zwei Scanvorgängen dekodiert werden kann (außer gestapelte Barcodes, siehe unten), wird ein falscher Kandidat mit dem Defaultwert von 10 Scanlinien gescannt, was die Laufzeit unnötig verlängert. Folglich kann die Geschwindigkeit durch eine reduzierte Anzahl der Scanlinien erhöht werden. Generell lässt sich sagen, dass Bilder höherer Qualität weniger Scanlinien benötigen als Bilder von niedrigerer Qualität. Für ein durchschnittliches Bild sollte ein Wert zwischen 2 und 5 ausreichend sein. Sollte ein Barcode jedoch nach Verringerung der Scanlinien nicht mehr gefunden werden, so muss die Anzahl der Scanlinien wieder erhöht werden. Der zweite Fall betrifft gestapelte Barcodes (derzeit GS1 DataBar Stacked, GS1 DataBar Stacked Omnidirectional und GS1 DataBar Expanded Stacked). Hier werden alle Scanlinien bewertet - im Gegensatz zu einzeiligen Barcodes (z.B. Code 128, EAN 13 oder GS1 DataBar Limited), wo das Scannen nach erfolgreicher Dekodierung des Codes beendet wird. Der Scanvorgang ist eine der zeitaufwändigsten Phasen des Operators find_bar_code. Deswegen kann die Anpassung des Parameters 'num_scanlines' große Geschwindigkeitsvorteile bringen. Das gilt insbesondere für GS1 DataBar Expanded Stacked. Ein GS1 DataBar Expanded Stacked Symbol kann in der Regel aus bis zu 11 Zeilen bestehen. Damit jede Zeile robust von jeweils 5 Scanlinien gelesen wird, sind im Operator 55 Scanlinien für den allgemeinen Fall vorgesehen. Wenn nur Symbole mit geringer Zeilenanzahl zu erwarten sind, sollte 'num_scanlines' auf 1.5 bis 5 Scanlinien pro erwartete Zeile reduziert werden.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden.
Typische Werte: [0, 5, 10, 20 ...]
Standardwert: 0
Die minimale Anzahl von Scanlinien, welche dasselbe Ergebnis liefern, die nötig ist, um die Dekodierung eines Symbols zu akzeptieren. Wenn 'min_identical_scanlines' nicht gesezt ist (der Parameter hat einen Wert von 0) wird der Barcode dekodiert, sobald eine Scanlinie erfolgreich dekodiert wurde. Ähnlich reicht bei gestapelten Barcodes eine erfolgreich dekodierte Scanlinie pro Barcodezeile. Es ist empfehlenswert, diesen Parameter auf 2 oder höher zu setzen, wenn man verhindern will, dass ein Barcode unbeabsichtigt gefunden wird. Dies kann insbesondere der Fall sein, wenn schlechte Bildqualität oder verrauschte Bildregionen dazu führen, dass eine Scanlinie fehlerhafte oder gar falsche Strichkanten findet. Dieser Parameter kann auch die falsche Leserate in Bildern verringern, in welchen Symbolen unterschiedlicher Barcodetyps gleichzeitig erscheinen.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden.
Typische Werte: [0, 2, 3, ...]
Standardwert: 0
Anzahl erfolgreich dekodierter Barcodes nach der die Dekodierung angehalten wird. Falls dieser Parameter nicht gesetzt ist (der Parameter hat einen Wert von 0), wird versucht alle Kandidaten zu dekodieren. Dieser Parameter wird typischerweise gesetzt, wenn die erwartete Anzahl von Barcodes im Voraus bekannt ist. Dann kann der Barcode-Leser die weitere Dekodierung von Kandidaten abbrechen und die Gesamtdekodierzeit wird reduziert.
Typische Werte: [0, 1, 2, ...]
Standardwert: 0
Erwarteter Barcode Orientierungswinkel. Ein potentieller (Kandidat-) Barcode hat Striche ähnlicher Orientierung. Man kann die Parameter 'orientation' und 'orientation_tol' anpassen, um den Wertebereich ['orientation'-'orientation_tol', 'orientation'+'orientation_tol'] zu definieren. find_bar_code bearbeitet nur Kandidatenregionen, deren Striche einen durchschnittlichen Orientierungswinkel haben, der in dem obigen Wertebereich liegt. Falls die Barcodes nur mit einer bestimmter Orientierung in den bearbeiteten Bildern erscheinen, so kann man den Wertebereich entsprechend reduzieren, sodass falsche Kandidaten früher erkannt werden und sich so die Ausführungszeit des Operator verkürzt. Diese Strategie bringt vor allem dann Vorteile, wenn die bearbeiteten Bilder viel Hintegrundtextur mit falsch orientierten Kandidaten enthalten.
Ausführlichere Informationen zu dem Orientierungswinkel können beim Operator get_bar_code_result(...,'orientation',...) nachgelesen werden. Im Gegensatz zu get_bar_code_result, wird hier die eigentliche Leserichtung nicht berücksichtigt, und es sind deswegen nur Winkel in dem Wertebereich [-90.0 ... 90.0] von Interesse. Die einzige Ausnahme dazu sind Barcodes vom Typ PharmaCode, welche keine eindeutige Leserichtung haben und somit auch in der Regel zwei dekodierte Ergebnisse zurückliefern: mit einem Wertebereich von [-180.0 ... 180.0] kann eine spezielle Leserichtung und damit auch ein einzelnes Ergebnis gewählt werden.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden.
Typischer Wertebereich: [-90.0 ... 90.0]
Standardwert: 0.0
Toleranz der Orientierung. Siehe 'orientation' für weitere Erklärungen. Wie bereits erklärt wurde, ist nur der Wertebereich [-90.0 ... 90.0] berücksichtigt, was mit einem 'orientation_tol' von 90.0 ganz abgedeckt wird. Deswegen sind die Werte von 'orientation_tol' auf den Wertebereich [0.0 ... 90.0] eingeschränkt. Dabei stellt ein Wert von 90.0 die Orientierungbeschränkung grundsätzlich aus.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden.
Typischer Wertebereich: [0.0 ... 90.0]
Standardwert: 90.0
Steuert die Verifikation der Ruhezonen eines Barcodesymbols. Wenn diese eingeschaltet ist, werden Scanlinen verworfen, falls unerwartete Striche in den Ruhezonen gefunden werden. Wenn 'quiet_zone'='true', muss die Ruhezone mindestens so breit sein, wie in der entsprechenden Barcode-Norm festgesetzt ist. Diese Werte (in X-Einheiten, wobei X eine "Modulbreite" bezeichnet, d.h. die Breite des schmalsten Striches aus der Strichsequenz des Barcodes) können von der folgenden Tabelle entnommen werden:
Barcodetyp Linke RZ Rechte RZ Barcodetyp Linke RZ Rechte RZ
--------------- -------- --------- --------------------------- -------- ---------
2/5 Industrial 10 10 UPC-A 9 9
2/5 Interleaved 10 10 UPC-A Add-On 2 9 5
Codabar 10 10 UPC-A Add-On 5 9 5
Code 39 10 10 UPC-E 9 7
Code 93 10 10 UPC-E Add-On 2 9 5
Code 128 10 10 UPC-E Add-On 5 9 5
MSI 10 10 GS1-128 10 10
PharmaCode 5 5 GS1 DataBar Omnidir 1 1
EAN-8 7 7 GS1 DataBar Truncated 1 1
EAN-8 Add-On 2 7 5 GS1 DataBar Stacked 1 1
EAN-8 Add-On 5 7 5 GS1 DataBar Stacked Omnidir 1 1
EAN-13 11 7 GS1 DataBar Limited 1 1
EAN-13 Add-On 2 11 5 GS1 DataBar Expanded 1 1
EAN-13 Add-On 5 11 5 GS1 DataBar Expanded Stacked 1 1
Wenn 'quiet_zone' auf eine Ganzzahl (>= 1) gesetzt ist, dann muss eine Ruhezone von mindestens 'quiet_zone' x X eingehalten werden.
Wenn 'quiet_zone'='tolerant', ist eine beschränkte Anzahl an Kanten in der Ruhezone erlaubt, aber höchstens eine pro vier Modulbreiten. Das Ziel ist zu verhindern, nur einen Teil von einem Barcode zu erkennen, aber dennoch Codes mit einer einfachen Verletzung der Ruhezone noch lesen zu können.
Wenn 'quiet_zone'='false', ist die Verifikation ausgeschaltet.
Die Verifikation der Ruhezone ist insbesondere für das Lesen von Barcodes im 'auto'-Modus wichtig. Sie verhindert, dass einfache Barcodes innerhalb einer Strichsequenz eines längeren und/oder komplexeren Barcodes gefunden werden. Normalerweise liefern Werte zwischen 2 und 4 optimale Ergebnisse, weil dadurch falsche Barcodes unterdrückt werden, während kleine Störungen wie Text, Etikettenkanten, etc. immer noch toleriert werden.
Wertevorschläge: 'false', 'true', 1, 2, 3, 4, 5
Standardwert: 'false'
Zusätzliche Bearbeitung für schrägabgebildete Barcodesymbole, d.h., Symbole deren Striche nicht orthogonal zu der Hauptrichtung des Symbols ausgerichtet sind. Zur Zeit werden drei Modi dieses Parameters unterstützt:
Wenn 'slanted'='true', versucht find_bar_code die Hauptrichtung des Symbols unabhängig von der Orientierung der Striche zu bestimmen.
Wenn 'slanted'='false', bestimmt der Operator nur die Orientierung der Striche und nimmt ihre Orthogonalle als Hauptrichtung des Symbols. Das bewirkt das Ausschalten dieses zusätzlichen Bearbeitungsschritts.
If 'slanted'='auto', versucht der Operator zuerst das Symbol anhand der von den Strichen abgeleiteten Orientierung zu dekodieren. Falls dieses Versuch scheitert bestimmt der Algorithmus die Hauptrichtung des Symbols und versucht erneut das Symbol zu dekodieren.
Wenn die Oberfläche, auf der das Symbol aufgedruckt ist, parallel zum Kamerasensor steht, entsteht keine Verzeichnung bei der Abbildung des Symbols im Bild, d.h., es ist nicht schräg. In Gegensatz dazu wird das Symbol schräg abgebildet, wenn die Oberfläche gekippt relativ zur Kamera steht. Ähnliche Verzeichnugen können auch bei Symbolen beobachtet werden, die mit Linescankameras aufgenommen wurden.
Die Bestimmung der dominierenden Strichorientierung basiert auf den detektierten Strichkanten. Im Gegensatz dazu wird die Hauptrichtung des Symbols aus der Form der Kandidatregion bestimmt. Demzufolge wird die Strichorientierung robuster bestimmt als die Symbolhauptrichtung. Das ist insbesondere dann der Fall, wenn die Kandidatenregion nicht sauber extrahiert werden kann (siehe get_bar_code_object mit ObjectName='candidate_regions'). In diesen Fällen umfasst die Kandidatenregion entweder nur ein Teil des Symbols oder das ganze Symbol zusammen mit umliegenden Texturen.
Aus diesen Gründen ist es zu empfehlen, die Bearbeitung von schrägabgebildeten Barcodesymbolen erst dann einzuschalten ('slanted'='true'), wenn das Bildeinzugssystem tatsächlich schräge Barcodes liefert und deren Kandidatenregionen sauber extrahiert werden können. Alternativ kann 'slanted'='auto' ausgewählt werden. Es ist zu beachten, dass die derzeitige Implementierung von 'auto' dazu führen kann, dass falsche Barcodes gefunden und dekodiert werden. In diesem Fall ist es empfehlenswert, 'slanted'='auto' mit anderen Barcodeparametern wie 'quiet_zone' und 'min_identical_scanlines' zu kombinieren, um falsche Barcodes zu unterdrücken. Wenn das Bildeinzugssystem keine schrägabgebildeten Barcodes liefert, empfiehlt sich diese Behandlung ganz auszuschalten ('slanted'='false').
Werte: 'false', 'auto', 'true'
Standardwert: 'false'
Fordert ein tolerantes ('high') oder ein strenges ('low') Matchingkriterium bei der Suche nach Start-, bzw. Stopmuster in einer Scanlinie. Ein tolerantes Kriterium erhöht die allgemeine Leserate, insbesondere in Bildern mit schlechtem Kontrast. Anderseits kann diese Einstellung zu ungültigen Dekodierungen in verrauschten Bildern, oder in Bildern mit Symbolen anderer Barcodetyps führen. Ein strenges Kriterium erhöht die Robustheit gegenüber falscher Dekodierung, kann aber auch die allgemeine Leserate mindern. Es ist zu beachten, dass momentan zwei unterschiedliche Kriterien nur für Code 128 und GS1-128 implementiert sind.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden. Obwohl man diesen Parameter für alle Barcodetypen setzen kann, hat er derzeit, wie bereits erwähnt, nur Wirkung auf Code 128 und GS1-128.
Werte: ['high', 'low']
Standardwert: 'high'
Erscheinungsbild der Module im Bild:
Innerhalb einer Scanlinie werden Kanten mit Hilfe eines Schwellwerts gefunden. 'meas_thresh' bestimmt, wie dieser Schwellwert relativ zum Dynamikbereich der Grauwerte entlang der Scanlinie berechnet wird. Liegen in dem Barcode Störungen vor oder ist das Rauschen groß, so sollte 'meas_thresh' auf größere Werte gesetzt werden.
Typischer Wertebereich: [0.05 .. 0.2]
Standardwert: 0.05
Der Parameter 'meas_thresh_abs' wird benutzt, um die falsche Kantendetektion zu verhindern. Sollte eine Scanlinie in eine Bildregion mit zu kleinem Dynamikbereich geraten (z.B. eine überwiegend weiße Region mit Grauwerten nahe 255), wird der Schwellwert zum Kantendetektion unangemessen klein berechnet. Das führt des Öfteren zur Detektion großer Mengen falscher Kanten. Falls der Schwellwert, der auf dem Parameter 'meas_thresh' basiert, kleiner als der Wert des Parameters 'meas_thresh_abs' wird, wird der letztere Wert als Schwellwert genommen. Standardmäßig ist 'meas_thresh_abs' auf 5.0 gesetzt. Sollten Bilder mit höherem Rauschpegel behandelt werden, könnte ein Erhöhen des Parameterwertes nutzlich sein. Anderseits, wenn rauschfreie Bilder mit niedrigem Kontrast behandelt werden, könnte dieser Parameter die Detektion richtiger Kanten stören. In solchen Fällen ist es empfehlenswert, den Parameterwert zu mindern oder den Parameter sogar zu deaktivieren (auf 0.0 setzen).
Typischer Wertebereich: [0.0 .. 10.0]
Standardwert: 5.0
Ein potentieller Barcode besteht aus Strichen und damit auch Kanten mit einer einheitlichen Orientierung. Die Größe 'max_diff_orient' gibt an, wie stark der Unterschied in der Orientierung benachbarter Kanten sein darf. 'max_diff_orient' ist ein Differenzwinkel in Gradmaß. Ist ein Barcode ausgefranst, d.h. die Strichkanten sind gestört, so ist 'max_diff_orient' groß zu wählen. Mit kleinen Werten dagegen kann die Anzahl falscher Barcode Kandidaten reduziert werden.
Typischer Wertebereich: [2 .. 20]
Standardwert: 10
Symbol spezifische Größen:
Barcodes mit optionalem Prüfzeichen werden anhand dieses Parameters interpretiert. Darunter fallen z.B. Code 39, Codabar, 2/5 Industrial und 2/5 Interleaved. Der Standardwert von 'absent' gibt an, dass kein Prüfzeichen vorliegt. In diesem Fall wird keine Prüfung durchgeführt, und alle Zeichen werden als Daten zurückgeliefert.
Ist dieser Parameter auf 'present' gesetzt, so wird ein Prüfzeichen erwartet und benutzt um die Korrektheit des Barcodes zu prüfen. Ist die Prüfsumme fehlerhaft, so wird der entsprechende Barcode nicht als Ergebnis zurückgeliefert. Das Prüfzeichen selbst wird aus den Nutzdaten entfernt. Falls dies nicht erwünscht ist, kann der Parameterwert 'preserved' eingestellt werden um das Prüfzeichen trotz Prüfung zu erhalten.
Barcodetypen mit obligatorischem Prüfzeichen verhalten sich immer so als wäre dieser Parameter auf 'present' gesetzt. Darunter fallen z.B. Code 128, EAN-8, EAN-13 und UPC-A.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden.
Werte: ['absent', 'present', 'preserved']
Standardwert: 'absent'
An den meisten GS1-tauglichen Barcodes kann eine 2D GS1-Composite Code Komponente angehängt sein. Wenn 'composite_code' auf 'CC-A/B' gesetzt ist, wird die Composite Komponente lokalisiert und dekodiert. Standardmäßig, ist 'composite_code' auf 'none' gesetzt und so wird der Composite Komponente neben dem Barcode ignoriert. Besitzt ein Barcode des gesuchten Typs keine Composite Komponente, so wird beim Aufruf von find_bar_code nur das Ergebnis des Barcodes zurückgeliefert. Zur Zeit werden GS1 Composite Codes nur zusammen mit einem Barcode der Familie GS1 DataBar unterstützt.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für unterschiedliche Barcodetypen gesetzt werden.
Werte: ['none', 'CC-A/B']
Standardwert: 'none'
UPC-E-Barcodes können in verschiedenen Ausgabeformaten zurückgegeben werden. Standardmäßig ist 'upce_encodation' auf 'ucc-12' gesetzt und der dekodierte String wird im UCC-12-Format (bestehend aus 12 Ziffern) zurückgegeben. Wird 'upce_encodation' auf 'zero-suppressed' gesetzt, so wird das Ergebnis im Zero-Suppressed-Format (also mit unterdrückten Nullen an definierten Stellen) zurückgegeben. Dieses Format besteht aus führender Null, sechs kodierten Ziffern und einem implizit kodiertem Prüfzeichen. Dies entspricht dem Format, das von ISO/IEC 15420 gefordert wird.
Dieser Parameter kann mit dem Operator set_bar_code_param_specific spezifisch für den Barcodetype UPC-E gesetzt werden.
Werte: ['ucc-12', 'zero-suppressed']
Standardwert: 'ucc-12'
Training:
Neben dem manuellen Setzen der Modellparameter mit dem Operator set_bar_code_param ist es auch möglich, das Modell mit Hilfe von find_bar_code anhand eines oder mehrerer Beispielbilder zu trainieren. Dazu muss zuerst ein Barcode-Modell im Trainings-Modus erstellt werden, oder ein bestehendes Barcode-Modell muss in den Trainings-Modus versetzt werden, indem man in set_bar_code_param als generischen Parameter GenParamNames 'train' übergibt. Der entsprechende Wert bei GenParamValues bestimmt, welche Parameter gelernt werden sollen. Im einzelnen können die folgenden Werte gesetzt werden:
Es werden alle trainierbaren Parameter gelernt.
Minimale Größe eines Elements. Diese Einstellung trainiert den Parameter 'element_size_min'.
Maximale Größe eines Elements. Diese Einstellung trainiert den Parameter 'element_size_max'.
Relativer Schwellwert zur Kantenbestimmung in Scanlinien. Diese Einstellung trainiert den Parameter 'meas_thresh'.
Absoluter Schwellwert zur Kantenbestimmung in Scanlinien. Diese Einstellung trainiert den Parameter 'meas_thresh_abs'.
Maximaler Unterschied in der Orientierung benachbarter Kanten. Diese Einstellung trainiert den Parameter 'max_diff_orient'.
Orientierung des Barcodes. Diese Einstellung trainiert die Parameter 'orientation' und 'orientation_tol'. Nach Abschluss des Trainings sollte der Wert für 'orientation_tol' noch um einen Toleranzwert erhöht werden um auch Barcodes zu finden deren Orientierung sich leicht außerhalb des trainierten Bereichs befindet.
Es können mehrere Parameter in einem Aufruf von find_bar_code gemeinsam trainiert werden, indem 'train' in set_bar_code_param in einem Tuple mehrfach mit den entsprechenden Werten übergeben wird: z.B. GenParamNames = ['train','train'] und GenParamValues = ['element_size_min','element_size_max']. Weiterhin können - im Zusammenhang mit 'train' = 'all' - einzelne Parameter explizit vom Training ausgeschlossen werden, indem zusätzlich 'train' mit den entsprechenden Parametern und einem vorangestellten '~' gesetzt wird: z.B. GenParamNames = ['train','train'] und GenParamValues = ['all','~orientation'] trainiert alle Parameter außer 'orientation'.
Anschließend muss für jedes zu trainierende Bild der Operator find_bar_code aufgerufen werden.
Die folgenden Hinweise sollten im Zusammenhang mit dem Training beachtet werden:
- Zusätzlich nötige, nicht zu trainierende Parameter (beispielsweise 'check_char') müssen vor dem Training manuell festgelegt werden.
- Soll über mehrere Bilder trainiert werden, ist der Operator find_bar_code mehrfach nacheinander aufzurufen.
- Pro Bild sollte nur ein Barcode des gewählten Typs sichtbar sein. Es sollten keine Muster vorhanden sein die vom Barcode-Leser als Barcode des gewählten Typs missinterpretiert werden könnten.
- Befinden sich im Trainingsbild mehrere Barcodes und soll aber nur über einen bestimmten Barcode trainiert werden, ist der Definitionsbereich des Bildes mit reduce_domain entsprechend einzuschränken.
- Sind in einer Anwendung alle Bilder sehr ähnlich, reicht i.d.R. ein Trainingsbild für die Parameter 'element_size_min', 'element_size_max', 'meas_thresh', 'meas_thresh_abs' und 'max_diff_orient'.
Für das Training des Parameters 'orientation' werden mindestens zwei Bilder benötigt, die den Barcode in seiner Minimum- und Maximum- Orientierung zeigen.
- Kann die Elementgröße variieren, sollten nach Möglichkeit im Training auch Bilder mit den kleinsten und den größten vorkommenden Elementen verwendet werden. Sollte dies nicht sichergestellt werden können, müssen die Grenzen für die Elementgröße nach dem Training von Hand gesetzt bzw. entsprechend modifiziert werden, oder die Elementgrößen werden vom Training ganz ausgenommen.
- Die Modellparameter werden beim ersten Training auf die Modelleigenschaften des im Bild gefundenen Barcodes eingeschränkt. Bei jedem weiteren Training werden sie, falls notwendig, so erweitert, dass neben den bisher trainierten Barcodes auch der neue Barcode vom Modell abgedeckt wird.
- Wurden genügend Bilder trainiert, so kann das Training beendet werden. Zuvor sollten jedoch die trainierten Parameter ausgelesen werden. Mit query_bar_code_params können die Namen der trainierten Parameter - aufgeteilt in spezifische und allgemeine Parameter - bestimmt werden und anschließend entsprechend mit get_bar_code_param_specific und get_bar_code_param ausgelesen werden.
Zum Beenden des Trainings werden alle trainierten Parameter durch einen Aufruf des Operators set_bar_code_param mit den Parametern GenParamNames = 'train' und GenParamValues = '~all' aus dem Training genommen.
Alternativ kann auch einfach das existierende Barcode-Modell durch den Operator clear_bar_code_model geschlossen werden.
- Während des Trainings sollte der Wert eines Trainingsparameters nicht durch einen Aufruf von set_bar_code_param oder set_bar_code_param_specific explizit gesetzt werden. Falls das gemacht wird, werden die gesamten internen Trainingsdaten zurückgesetzt und das Training startet mit dem nächsten Aufruf von find_bar_code von vorne.
- Kann der zu trainierende Barcode nicht gelesen werden, erzeugt dies keine gesonderte Fehlermeldung, sondern es sind lediglich die Ergebnislisten (DecodedDataStrings, SymbolRegions) leer. Die Modellparameter (insbesondere die trainierten Parameter) werden in diesem Fall nicht modifiziert.
- Timeouts sind während des Trainings deaktiviert.
Sonstiges:
Mit Hilfe dieses Parameters ist es möglich, dass find_bar_code nach einer definierten Zeit (in ms) abbricht. Dies ist vor allem dann nützlich, wenn maximale Zykluszeiten eingehalten werden müssen. Alle bis zu diesem Abbruch gewonnenen Ergebnisse sind anschließend verfügbar und können mit get_bar_code_result abgerufen werden. Werden Werte kleiner oder gleich Null übergeben, wird der Timeout deaktiviert (Default).
Die zeitliche Genauigkeit des Timeouts liegt bei ca. 10 ms. Sie hängt von vielen Faktoren ab, u.a. von der Geschwindigkeit des Rechners und dem 'timer_mode', der über set_system gesetzt wurde.
find_bar_code wirft keinen Fehler, falls ein Timeout auftritt. Um zu prüfen, ob find_bar_code abgebrochen wurde, kann der Parameter 'timeout_occurred' mit get_bar_code_result abgefragt werden.
Im Trainingsmodus von find_bar_code wird der Timeout ignoriert.
Typische Werte: ['false', 20 .. 100]
Standardwert: 'false'
Steuert, ob bestimmte Zwischenergebnisse bei der Symbolsuche mit find_bar_code temporär oder persistent im Modell gespeichert werden sollen. Zur Zeit ist es erforderlich 'persistence' einzuschalten ('persistence' = 1), wenn die Barcode Druckqualität bewertet werden muss (get_bar_code_result mit Parameter 'quality_isoiec15416') oder die Dekodierungs- Scanlinien inspiziert werden müssen (get_bar_code_object mit Parameter 'scanlines_all' oder 'scanlines_valid'). Mit Einschalten von 'persistence' steigt der Speicherbedarf für den Barcode-Leser allerdings auch.
Werte: [0, 1]
Standardwert: 0
Ein Barcode-Modell BarCodeHandle kann nur von einem Thread aus verwendet werden. Verschiedene Barcode-Modelle können dagegen in unterschiedlichen Threads genutzt werden.
Handle des zu verwendenden Barcode-Modells.
Namen der generischen Parameter, die für den Barcode eingestellt werden sollen.
Defaultwert: 'element_size_max'
Werteliste: 'check_char', 'composite_code', 'element_height_min', 'element_size_max', 'element_size_min', 'element_size_variable', 'max_diff_orient', 'meas_thresh', 'meas_thresh_abs', 'min_identical_scanlines', 'num_scanlines', 'orientation', 'orientation_tol', 'persistence', 'quiet_zone', 'slanted', 'start_stop_tolerance', 'stop_after_result_num', 'timeout', 'train', 'upce_encodation'
Werte der generischen Parameter, die für den Barcode eingestellt werden sollen.
Defaultwert: 8
Wertevorschläge: 0, 0.1, 1, 1.5, 2, 8, 32, 45, 'true', 'false', 'present', 'absent', 'none', 'CC-A/B', 'auto', 'high', 'low', 'ucc-12', 'zero-suppressed'
set_bar_code_param liefert den Wert 2 (H_MSG_TRUE), falls die übergebenen Parameter korrekt sind. Ansonsten wird eine Fehlerbehandlung durchgeführt.
Bar Code
| Operatoren |