| Operatoren |
get_2d_bar_code — Bestimmen der Werte der Datenelemente (in ECC 200: „Module“) innerhalb einer Barcode-Region („Data Matrix Symbol“).
get_2d_bar_code ist veraltet und wird nur aus Gründen der Rückwärtskompatibilität zur Verfügung gestellt. Neue Applikationen sollten stattdessen die Funktionalität im Kapitel Identifizierung / Datacode verwenden zum Lesen von 2D-Datacode-Symbologien verwenden (siehe create_data_code_2d_model).
get_2d_bar_code(BarCodeRegion, Image : : BarCodeDescr, CodeRegDescr, GenParamNames, GenParamValues : BarCodeDimension, BarCodeData)
get_2d_bar_code extrahiert aus einem Symbolkandidaten BarCodeRegion und den dazugehörigen Grauwerten Image die einzelnen Datenwerte (Bit gesetzt oder nicht). BarCodeDescr enthält den mit gen_2d_bar_code_descr erzeugten Barcode-Descriptor, CodeRegDescr den von find_2d_bar_code erzeugten Regionen-Descriptor.
Wenn die übergebene Region BarCodeRegion einen Barcode enthält, werden die Daten zeilenweise in ein Tupel geschrieben und im Parameter BarCodeData zurückgeliefert. Dabei stehen positive Werte für eine logische Eins (Bit gesetzt) und negative Werte für eine logische Null (Bit nicht gesetzt). Der Wert Null bedeutet, dass das Modul nicht eindeutig klassifiziert werden konnte.
In BarCodeDimension wird die Größe des Datenfeldes zurückgegeben. Diese ist nicht mit der Symbolgröße zu verwechseln, zu der zusätzliche Such- und Alignmentmuster mitzählen. Die ersten beiden Werte von BarCodeDimension enthalten die Breite und die Höhe des Datenfelds, der dritte Wert entspricht dem Index des Symbols.
Falls kein Barcode extrahiert werden konnte, wird dies durch einen Fehlercode im Rückgabewert signalisiert.
Um auch in schwierigen Fällen noch eine Extraktion der Datenwerte zu ermöglichen, kann mit Hilfe der (optionalen) generischen Parameter GenParamNames und GenParamValues gezielt Einfluss auf die Bildverarbeitungsverfahren genommen werden. Welche das im einzelnen sind, hängt von der Druckform des Barcodes ab, die im Barcode-Descriptor BarCodeDescr abgelegt ist (siehe gen_2d_bar_code_descr). Die Breite eines einzelnen Moduls ('module_width') braucht an dieser Stelle nicht mehr spezifiziert zu werden, da sie Bestandteil des von find_2d_bar_code gelieferten Regionen-Descriptors CodeRegDescr ist.
Die Bildverarbeitung gliedert sich grob in die folgenden Schritte: Zuerst wird die übergebene Region BarCodeRegion mittels Schwellwert-Operator in eine helle und eine dunkle Region unterteilt. Da um einen 2D-Barcode ein „leerer“ Sicherheitsbereich zu liegen hat, kann in diesem Bereich bestimmt werden, ob das Symbol schwarz-auf-weiß oder umgekehrt gedruckt ist. Damit können die „dunklen“ und „hellen“ Regionen den logischen Datenwerten zugeordnet werden. BarCodeRegion wird dann durch ein Rechteck approximiert. Die Randbereiche des Rechtecks werden auf die in der 2D-Barcode-Spezifikation festgelegten Muster hin untersucht. Daraus ergibt sich automatisch die Größe der Datenmatrix und die Größe und Position der Module, deren Datenwert daraufhin ermittelt wird.
Parameter für die Bestimmung der Datenwerte eines Moduls:
'module_rad_ratio' Bereich des Moduls für die Klassifikation der Daten.
Dieser Parameter legt den Bereich des Moduls (in Prozent) fest, in dem die
Klassifikation der Daten (gesetzt oder nicht gesetzt) erfolgen soll.
'module_rad_ratio' = 1.0 bedeutet, dass das Modul in seiner gesamten Größe
untersucht werden soll, bei sehr kleinem 'module_rad_ratio' wird dagegen nur
ein Punkt in der Mitte getestet.
GenParamValues: 0 < 'module_rad_ratio' <= 1
default: Druckmethode 'printed': 0.3
Druckmethode 'engraved_lightfield': 0.3
Druckmethode 'engraved_darkfield': 0.7
'use_grayvals' Verfahren zur Bestimmung des Datenwerts (Nur wählbar bei den Druckmethoden
'printed' und 'engraved_lightfield'; bei
'engraved_darkfield' wird immer anhand der Grauwerte klassifiziert!).
Mit dem Parameter 'use_grayvals' wird festgelegt, mit welchem Verfahren der
Datenwert eines Moduls ermittelt werden soll. Ist 'use_grayvals' = 'no', wird
getestet, ob der mit 'module_rad_ratio' festgelegte Bereich innerhalb
der Region liegt, die dem Datenwert 1 zugeordnet wurde. Liegt mehr
als die Hälfte des Moduls innerhalb dieser Region, wird das Modul als
gesetztes Bit interpretiert.
Ist 'use_grayvals' = 'yes', werden innerhalb des Testbereichs die Grauwerte
untersucht. Dafür wird zuvor aus dem bekannten Symbolrand ein Klassifikator
erzeugt, der anhand des Minimums, des Maximums und des Wertebereichs der
Grauwerte den Testbereich als 'gesetzt' oder 'nicht gesetzt' klassifiziert.
Einzelne Grauwert-Merkmale werden ausgeschlossen, wenn sie die Testregionen
nicht eindeutig trennen können. Ist die Klassifikation nicht eindeutig,
entscheidet die Mehrheit. Ist keines der Grauwertmerkmale geeignet, die
Testregionen zu trennen, wird automatisch die regionenbasierte Methode
verwendet. Zu erkennen ist dies anhand der in BarCodeData
zurückgelieferten Werte: Bei der regionenbasierten Methode werden Vielfache
von 4 zurückgeliefert, ansonsten Werte zwischen -3 und +3.
Bei der Druckmethode 'engraved_darkfield' wird immer anhand der
Grauwerte klassifiziert. Die Klassifizierbarkeit lässt sich hierbei oft
durch eine günstige Wahl von 'module_rad_ratio' verbessern.
GenParamValues: 'yes', 'no'
default: 'yes'
'use_grayval_min' Klassifikation anhand des Grauwert-Minimums.
GenParamValues: 'yes', 'no'
default: 'yes'
'use_grayval_max' Klassifikation anhand des Grauwert-Maximums.
GenParamValues: 'yes', 'no'
default: 'printed', 'engraved_darkfield': 'yes'
'engraved_darkfield': 'no'
'use_grayval_range' Klassifikation anhand des Grauwertbereichs.
GenParamValues: 'yes', 'no'
default: 'yes'
Bei den Druckmethoden 'printed' und 'engraved_lightfield' können zusätzlich die
folgenden Parameter gesetzt werden:
'enlarge_region_rad' Vergrößerung der Symbolregion.
GenParamValues: > 0 (<= 0: keine Vergrößerung erlaubt)
default: 2.5
'thresh_percent' Histogrammbereich zum Suchen des optimalen Schwellwerts.
Der Schwellwert zum Trennen der hellen und dunklen Bereiche der Region wird
in den mittleren 'thresh_percent' Prozent des Grauwerthistogramms gesucht.
Bei 'thresh_percent' = 0 liegt der Schwellwert genau in der Mitte zwischen
dem hellsten und dem dunkelsten Pixel. Bei 'thresh_percent' = 100 wird der
gesamte Histogrammbereich durchsucht. Der Schwellwert beeinflusst neben der
Größe der Datenregion auch die Position des umschließenden Vierecks des
Symbols und somit auch geringfügig die angenommene Lage der Module.
GenParamValues: 0...100
default: 50
'thresh_step_width' Schrittweite zum Suchen des optimalen Schwellwerts.
Der mit 'thresh_percent' abgesteckte Bereich wird mit der Schrittweite
'thresh_step_width' solange durchsucht, bis eine optimale Trennung zwischen
den hellen und dunklen Bereichen (Maximum der Summe aus hellen und dunklen
Regionen) gefunden wurde. Je kleiner 'thresh_step_width' ist, um so genauer
kann das Optimum bestimmt werden, um so länger wird aber auch gesucht.
GenParamValues: > 0
default: 10
'smooth_cont' Parameter für die Approximation der Region durch ein Polygon (Rechteck).
Der Parameter 'smooth_cont' bestimmt, über wieviele Punkte die Kontur
geglättet wird, bevor die Polygonapproximation durchgeführt wird (vgl.
Operator segment_contours_xld).
GenParamValues: 0,3,5,7,9,...
default: 5
'max_line_dist1', Abstand der Kontur von der approximierten Linie.
'max_line_dist2'
Die Parameter 'max_line_dist1' und 'max_line_dist2' bestimmen den maximalen
Abstand zwischen der Kontur und der approximierten Linie (vgl. Operator
segment_contours_xld).
GenParamValues: >= 0
default: 4
'min_cont_len' Minimale Länge der Konturelemente in Pixel.
Konturelemente, die kürzer als 'min_cont_len' sind, werden beim Bestimmen
des umgebenden Vierecks der Region ignoriert. Bei sehr kleinen Symbolen oder
bei geringer Auflösung kann es nötig sein, diesen Wert zu verkleinern.
GenParamValues: > 0
default: 50
'border_width_min' Minimale Breite des Randbereichs.
Im Randbereich der übergebenen Region muss das sogenannte Suchmuster liegen,
bestehend aus zwei kontinuierlichen Linien mit gesetzten Bits und zwei
alternierenden Linien. Ausgehend von 'border_width_min' wird der
Suchbereich solange vergrößert, bis ein gültiger Symbolrand gefunden
oder 'border_width_max' erreicht wurde.
GenParamValues: > 0
default: 2
'border_width_max' Maximale Breite des Randbereichs.
GenParamValues: > 'border_width_min'
default: 5
'border_width' Exakte Breite des Randbereichs.
Als Alternative kann im Parameter 'border_width' die exakte Breite des
Suchbereichs übergeben werden. Damit werden automatisch
'border_width_min' und 'border_width_max' gesetzt.
GenParamValues: > 0
default: -
Bei der Druckmethode 'engraved_darkfield' können die folgenden Parameter gesetzt werden:
'median_mask_rad' Maskengröße für initiale Medianfilterung (vgl. Operator median_image).
GenParamValues: 3,5,7,...,501
default: 'module_width'*0.1 + 0.5
'gray_erosion_size' Maskengröße für Grauwerterosion (vgl. Operator gray_erosion_rect).
GenParamValues: 3,5,7,...,511
default: 'module_width'*0.18 + 3.5
'measure_sigma' Parameter für die Extraktion gerader Kantenpaare (vgl. Operator measure_pairs).
GenParamValues: 0.4...100
default: 'module_width' < 20: 0.7
'module_width' >= 20: 1.4
'measure_thresh' Parameter für die Extraktion gerader Kantenpaare (vgl. Operator measure_pairs).
GenParamValues: 1...255
default: 2.0
Der Operator get_2d_bar_code signalisiert über den Fehlercode, dass die übergebene Region keinen gültigen Barcode enthält. Da die vom Operator find_2d_bar_code extrahierten Regionenkandidaten aber durchaus Regionen ohne Barcode enthalten können, sollte jeder Aufruf von get_2d_bar_code in eine eigene Fehlerbehandlung eingeschlossen werden (siehe Beispiel).
Region, die einen 2D-Barcode enthalten könnte.
Zugehöriges Bild.
Beschreibung der 2D-Barcodeklasse
Zusätzliche Parameter, die die Barcoderegion beschreiben und für die Extraktion der Datenwerte verwendet werden können.
Liste von Namen (optionaler) generischer Steuerparameter.
Defaultwert: []
Werteliste: 'border_width', 'border_width_max', 'border_width_min', 'enlarge_region_rad', 'gray_erosion_size', 'max_line_dist1', 'max_line_dist2', 'measure_sigma', 'measure_thresh', 'median_mask_rad', 'min_cont_len', 'module_rad_ratio', 'smooth_cont', 'thresh_percent', 'thresh_step_width', 'use_grayval_max', 'use_grayval_min', 'use_grayval_range', 'use_grayvals'
Liste der Werte der generischen Steuerparameter.
Defaultwert: []
Wertevorschläge: 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 'yes', 'no', -1, 1.5, 2.5, 3.5, 4.5, 5.5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50
Tupel mit der Dimension des extrahierten Symbols. Bei ECC 200: Datenfeldbreite, -höhe, Symbol-Index.
Tupel mit den Datenwerten des extrahierten Symbols. Wert > 0: logische 1, Wert < 0: logische 0, Wert = 0: Modul nicht klassifizierbar.
dev_error_var (ErrorCode, 1)
gen_2d_bar_code_descr ('Data Matrix ECC 200', ['mode'], ['printed'], \
BarCodeDescr)
read_image (Image, 'bar2d.tif')
find_2d_bar_code (Image, CodeRegion, BarCodeDescr, \
['module_width'], [10], CodeRegDescr)
count_obj (CodeRegion, SymbolNum)
for i := 1 to SymbolNum by 1
select_obj (CodeRegion, ObjectSelected, i)
dev_set_check ('~give_error')
get_2d_bar_code (ObjectSelected, Image, BarCodeDescr, CodeRegDescr, \
[], [], BarCodeDimension, BarCodeData)
err := ErrorCode
dev_set_check ('give_error')
if (err = 2)
decode_2d_bar_code (BarCodeDescr, BarCodeDimension, BarCodeData, \
SymbolCharacters, CorrSymbolData, DecodedData, \
DecodingError, StructuredAppend)
if (|DecodedData|)
tuple_chrt (DecodedData, String)
endif
endif
endfor
Der Operator get_2d_bar_code signalisiert über den Fehlercode sowohl, dass inkorrekte Parameter übergeben wurden als auch, dass die Extraktion eines Barcodes aus der übergebenen Region aus bestimmten Gründen scheiterte. Konnte z.B. kein umschließendes Viereck um die Region bestimmt werden, wird der Operator mit dem Fehlercode 8808 abgebrochen. Liegt das Viereck z.T. außerhalb des Bildes, wird mit dem Fehlercode 8807 abgebrochen. Wurde innerhalb des Randbereichs kein Suchmuster gefunden, wird der Operator mit dem Fehlercode 8810 abgebrochen. Wird dagegen der durchgezogener Symbolrand an zwei aneinanderstoßenden Seiten ('L') nicht gefunden, wird mit dem Fehlercode 8809 abgebrochen. Kann bei der Druckmethode 'engraved_darkfield' keines der Grauwertmerkmale die Testregionen trennen, bricht der Operator mit dem Fehlercode 8811 ab.
Data Code
| Operatoren |