find_bar_codeT_find_bar_codeFindBarCodeFindBarCode (Operator)

Name

find_bar_codeT_find_bar_codeFindBarCodeFindBarCode — Suchen und Lesen von Barcode-Symbolen im Eingabebild.

Signatur

find_bar_code(Image : SymbolRegions : BarCodeHandle, CodeType : DecodedDataStrings)

Herror T_find_bar_code(const Hobject Image, Hobject* SymbolRegions, const Htuple BarCodeHandle, const Htuple CodeType, Htuple* DecodedDataStrings)

void FindBarCode(const HObject& Image, HObject* SymbolRegions, const HTuple& BarCodeHandle, const HTuple& CodeType, HTuple* DecodedDataStrings)

HRegion HBarCode::FindBarCode(const HImage& Image, const HTuple& CodeType, HTuple* DecodedDataStrings) const

HRegion HBarCode::FindBarCode(const HImage& Image, const HString& CodeType, HString* DecodedDataStrings) const

HRegion HBarCode::FindBarCode(const HImage& Image, const char* CodeType, HString* DecodedDataStrings) const

HRegion HBarCode::FindBarCode(const HImage& Image, const wchar_t* CodeType, HString* DecodedDataStrings) const   (Nur Windows)

HRegion HImage::FindBarCode(const HBarCode& BarCodeHandle, const HTuple& CodeType, HTuple* DecodedDataStrings) const

HRegion HImage::FindBarCode(const HBarCode& BarCodeHandle, const HString& CodeType, HString* DecodedDataStrings) const

HRegion HImage::FindBarCode(const HBarCode& BarCodeHandle, const char* CodeType, HString* DecodedDataStrings) const

HRegion HImage::FindBarCode(const HBarCode& BarCodeHandle, const wchar_t* CodeType, HString* DecodedDataStrings) const   (Nur Windows)

static void HOperatorSet.FindBarCode(HObject image, out HObject symbolRegions, HTuple barCodeHandle, HTuple codeType, out HTuple decodedDataStrings)

HRegion HBarCode.FindBarCode(HImage image, HTuple codeType, out HTuple decodedDataStrings)

HRegion HBarCode.FindBarCode(HImage image, string codeType, out string decodedDataStrings)

HRegion HImage.FindBarCode(HBarCode barCodeHandle, HTuple codeType, out HTuple decodedDataStrings)

HRegion HImage.FindBarCode(HBarCode barCodeHandle, string codeType, out string decodedDataStrings)

Beschreibung

Der Operator find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode sucht im Eingabebild (ImageImageImageImageimage) nach Barcode-Symbolen und dekodiert die darin enthaltenen Zeichenfolgen. In einem Bild kann eine beliebige Anzahl an Barcodes eines Typs gefunden und dekodiert werden, wobei der Typ des gesuchten Barcodes mit CodeTypeCodeTypeCodeTypeCodeTypecodeType ausgewählt wird. Die gelesenen Zeichenfolgen werden in DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings und die dazu korrespondierenden Barcode-Regionen in SymbolRegionsSymbolRegionsSymbolRegionsSymbolRegionssymbolRegions zurück gegeben. Werden insgesamt n Barcodes erfolgreich gelesen, so können die Indizes von 0 bis (n-1) in den Operatoren get_bar_code_resultget_bar_code_resultGetBarCodeResultGetBarCodeResultGetBarCodeResult und get_bar_code_objectget_bar_code_objectGetBarCodeObjectGetBarCodeObjectGetBarCodeObject verwendet werden, um die gewünschte Information eines speziellen Ergebnisse zu erhalten.

Es wird angenommen, dass die Barcodes dunkel auf einem hellen Hintergrund erscheinen. Um helle Barcodes auf einem dunklen Hintergrund lesen zu können, muss das Eingabebild vorher mit dem Operator invert_imageinvert_imageInvertImageInvertImageInvertImage invertiert werden.

Vor dem Aufruf des Operators find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode muss mit Hilfe von create_bar_code_modelcreate_bar_code_modelCreateBarCodeModelCreateBarCodeModelCreateBarCodeModel ein Barcode-Modell erstellt und der dabei erzeugte Handle in BarCodeHandleBarCodeHandleBarCodeHandleBarCodeHandlebarCodeHandle an find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode übergeben werden.

Der Ausgabewert DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings gibt für jedes Ergebnis die dekodierte Zeichenfolge zurück. Der Inhalt dieser Zeichenfolge wird durch den Standard des entsprechenden Codetyps bestimmt. Typischerweise enthält DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings nur die Zeichen mit Dateninformation. Bei Codes mit obligatorischem Prüfzeichen wird dieses nicht mit ausgegeben. Bei Codes mit optionalem Prüfzeichen, z.B. Code 39, Codabar, 2/5 Industrial oder 2/5 Interleaved, hängt das Ergebnis von der Einstellung des Parameters 'check_char'"check_char""check_char""check_char""check_char" ab, welcher in create_bar_code_modelcreate_bar_code_modelCreateBarCodeModelCreateBarCodeModelCreateBarCodeModel, set_bar_code_paramset_bar_code_paramSetBarCodeParamSetBarCodeParamSetBarCodeParam oder set_bar_code_param_specificset_bar_code_param_specificSetBarCodeParamSpecificSetBarCodeParamSpecificSetBarCodeParamSpecific einstellbar ist: Der Standardwert von 'absent'"absent""absent""absent""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'"present""present""present""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 Code als nicht lesbar eingestuft und dementsprechend auch nicht als Ergebnis in DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings und SymbolRegionsSymbolRegionsSymbolRegionsSymbolRegionssymbolRegions zurückgeliefert. Das Prüfzeichen selbst wird aus den Nutzdaten entfernt. Falls dies nicht erwünscht ist, kann der Parameterwert 'preserved'"preserved""preserved""preserved""preserved" eingestellt werden um das Prüfzeichen trotz Prüfung zu erhalten.

Die zu Grunde liegenden Referenz-Zeichen, einschließlich möglicher Start- oder Stopzeichen sowie Prüfzeichen, können mit get_bar_code_resultget_bar_code_resultGetBarCodeResultGetBarCodeResultGetBarCodeResult und 'decoded_reference'"decoded_reference""decoded_reference""decoded_reference""decoded_reference" abgefragt werden.

Folgende Barcode-Symbole werden unterstützt:

2/5 Industrial EAN-8 GS1-128
2/5 Interleaved EAN-8 Add-On 2 GS1 DataBar Omnidirectional
Codabar EAN-8 Add-On 5 GS1 DataBar Truncated
Code 39 EAN-13 GS1 DataBar Stacked
Code 32 (converted from Code 39) EAN-13 Add-On 2 GS1 DataBar Stacked Omnidirectional
Code 93 EAN-13 Add-On 5 GS1 DataBar Limited
Code 128 UPC-A GS1 DataBar Expanded
MSI UPC-A Add-On 2 GS1 DataBar Expanded Stacked
PharmaCode UPC-A Add-On 5
UPC-E
UPC-E Add-On 2
UPC-E Add-On 5

Anmerkung: Da die Leserichtung beim PharmaCode nicht bestimmt werden kann, werden auch die beiden Zeichenketten für jede Leserichtung zurückgegeben. Beide Zeichenketten werden in einer Zeichenkette durch ein Komma getrennt aneinandergehängt.

Barcodes vom Typ GS1 DataBar können zusätzlich eine Composite-Code-Komponente enthalten. Um diese Komponente finden und dekodieren zu können, muss mittels des Operators set_bar_code_paramset_bar_code_paramSetBarCodeParamSetBarCodeParamSetBarCodeParam der Parameter 'composite_code'"composite_code""composite_code""composite_code""composite_code" auf 'CC-A/B'"CC-A/B""CC-A/B""CC-A/B""CC-A/B" gesetzt werden.

Es können auch Barcodes vom Typ 'Code 32' gelesen werden, indem der Operator find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode mit CodeTypeCodeTypeCodeTypeCodeTypecodeType 'Code 39'"Code 39""Code 39""Code 39""Code 39" in Kombination mit der externen Prozedur convert_decoded_string_code39_to_code32 verwendet wird.

Autodiskriminierung

Autodiskriminierung beschreibt das gleichzeitige Lesen mehrerer Barcode-Typen in einem Aufruf von find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode. Dazu wird dem Parameter CodeTypeCodeTypeCodeTypeCodeTypecodeType ein Tupel von möglichen Barcode-Typen übergeben. Mit dem speziellen Wert 'auto'"auto""auto""auto""auto" werden alle Barcode-Typen dekodiert, mit Ausnahme von 'PharmaCode'"PharmaCode""PharmaCode""PharmaCode""PharmaCode" und 'MSI'"MSI""MSI""MSI""MSI", da diese zu wenige Merkmale bieten um von anderen Barcode-Typen abgegrenzt werden zu können. In dem Tupel können auch Barcode-Typen mit vorangestellter Tilde (~) angegeben werden, welche dann nicht dekodiert werden. So bezeichnet beispielsweise ['auto'"auto""auto""auto""auto", '~EAN-8'"~EAN-8""~EAN-8""~EAN-8""~EAN-8", '~EAN-8 Add-On 2'"~EAN-8 Add-On 2""~EAN-8 Add-On 2""~EAN-8 Add-On 2""~EAN-8 Add-On 2", '~EAN-8 Add-On 5'"~EAN-8 Add-On 5""~EAN-8 Add-On 5""~EAN-8 Add-On 5""~EAN-8 Add-On 5"] alle Barcode-Typen ohne 'PharmaCode'"PharmaCode""PharmaCode""PharmaCode""PharmaCode", 'MSI'"MSI""MSI""MSI""MSI" und 'EAN-8'"EAN-8""EAN-8""EAN-8""EAN-8"-Arten. Zu beachten ist, dass jeder zusätzlich erlaubte Barcode-Typ die Laufzeit des Operators verlängert. Da eventuell nicht alle Barcodes definitiv voneinander unterschieden werden können nimmt ggf. die Zuverlässigkeit der Dekodierung mit jedem zusätzlichen Barcode-Typ ab. Um die Kompatibilität der Autodiskriminierung zu erhöhen sollten falls möglich immer Barcodes mit Prüfzeichen bzw. Prüfsumme verwendet werden.

Der Barcode-Leser versucht die Barcode-Typen in der folgenden Reihenfolge zu dekodieren:

'GS1 DataBar Omnidir'"GS1 DataBar Omnidir""GS1 DataBar Omnidir""GS1 DataBar Omnidir""GS1 DataBar Omnidir", 'GS1 DataBar Truncated'"GS1 DataBar Truncated""GS1 DataBar Truncated""GS1 DataBar Truncated""GS1 DataBar Truncated", 'GS1 DataBar Stacked'"GS1 DataBar Stacked""GS1 DataBar Stacked""GS1 DataBar Stacked""GS1 DataBar Stacked", 'GS1 DataBar Stacked Omnidir'"GS1 DataBar Stacked Omnidir""GS1 DataBar Stacked Omnidir""GS1 DataBar Stacked Omnidir""GS1 DataBar Stacked Omnidir", 'GS1 DataBar Limited'"GS1 DataBar Limited""GS1 DataBar Limited""GS1 DataBar Limited""GS1 DataBar Limited", 'GS1 DataBar Expanded'"GS1 DataBar Expanded""GS1 DataBar Expanded""GS1 DataBar Expanded""GS1 DataBar Expanded", 'GS1 DataBar Expanded Stacked'"GS1 DataBar Expanded Stacked""GS1 DataBar Expanded Stacked""GS1 DataBar Expanded Stacked""GS1 DataBar Expanded Stacked", 'GS1-128'"GS1-128""GS1-128""GS1-128""GS1-128", 'Code 128'"Code 128""Code 128""Code 128""Code 128", 'EAN-13 Add-On 5'"EAN-13 Add-On 5""EAN-13 Add-On 5""EAN-13 Add-On 5""EAN-13 Add-On 5", 'EAN-13 Add-On 2'"EAN-13 Add-On 2""EAN-13 Add-On 2""EAN-13 Add-On 2""EAN-13 Add-On 2", 'EAN-13'"EAN-13""EAN-13""EAN-13""EAN-13", 'UPC-A Add-On 5'"UPC-A Add-On 5""UPC-A Add-On 5""UPC-A Add-On 5""UPC-A Add-On 5", 'UPC-A Add-On 2'"UPC-A Add-On 2""UPC-A Add-On 2""UPC-A Add-On 2""UPC-A Add-On 2", 'UPC-A'"UPC-A""UPC-A""UPC-A""UPC-A", 'EAN-8 Add-On 5'"EAN-8 Add-On 5""EAN-8 Add-On 5""EAN-8 Add-On 5""EAN-8 Add-On 5", 'EAN-8 Add-On 2'"EAN-8 Add-On 2""EAN-8 Add-On 2""EAN-8 Add-On 2""EAN-8 Add-On 2", 'EAN-8'"EAN-8""EAN-8""EAN-8""EAN-8", 'UPC-E Add-On 5'"UPC-E Add-On 5""UPC-E Add-On 5""UPC-E Add-On 5""UPC-E Add-On 5", 'UPC-E Add-On 2'"UPC-E Add-On 2""UPC-E Add-On 2""UPC-E Add-On 2""UPC-E Add-On 2", 'UPC-E'"UPC-E""UPC-E""UPC-E""UPC-E", 'Code 93'"Code 93""Code 93""Code 93""Code 93", 'Code 39'"Code 39""Code 39""Code 39""Code 39", 'Codabar'"Codabar""Codabar""Codabar""Codabar", '2/5 Interleaved'"2/5 Interleaved""2/5 Interleaved""2/5 Interleaved""2/5 Interleaved", '2/5 Industrial'"2/5 Industrial""2/5 Industrial""2/5 Industrial""2/5 Industrial"

Deshalb sollten mindestens alle nicht auftretenden Barcode-Typen ausgeschlossen werden die vor dem ersten der erwarteten Barcode-Typen dekodiert werden oder gleich nur die explizite Liste aller Barcode-Typen die erwartet werden.

Insbesondere für den Fall der Autodiskriminierung existiert der Operator set_bar_code_param_specificset_bar_code_param_specificSetBarCodeParamSpecificSetBarCodeParamSpecificSetBarCodeParamSpecific. Einige Parameter des Barcode-Modells können damit spezifisch für verschiedene Barcode-Typen festgelegt werden.

Training

Falls sich der Barcode-Leser im Trainingsmodus befindet führt der Operator find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode einen Trainingslauf durch. Der Trainingmodus ist bei dem Operator set_bar_code_paramset_bar_code_paramSetBarCodeParamSetBarCodeParamSetBarCodeParam beschrieben.

Timeout und Abbruch

Der Operator find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode kann sowohl mit einem Timeout sowie auch manuell abgebrochen werden. Mit dem Operator set_bar_code_paramset_bar_code_paramSetBarCodeParamSetBarCodeParamSetBarCodeParam kann man einen Timeout festlegen. Falls find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode in einen Timeout läuft, werden alle bis dahin erkannten Codes zurückgegeben. Zusätzlich gibt es die Möglichkeit find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode manuell abzubrechen, indem man set_bar_code_paramset_bar_code_paramSetBarCodeParamSetBarCodeParamSetBarCodeParam mit 'abort' von einem anderen Thread aufruft.

In beiden Fällen, kann mit get_bar_code_resultget_bar_code_resultGetBarCodeResultGetBarCodeResultGetBarCodeResult und dem Parameter 'aborted'"aborted""aborted""aborted""aborted" abgefragt werden, ob der Operator abgebrochen wurde.

Hinweise zur Verwendung von niedrig aufgelösten Bildern

Dieser Hinweis betrifft Barcode-Anwendungen, in denen niedrig aufgelöste Bilder verwendet werden, d.h. Bilder in denen ein einzelner Strich des Barcodes nur zwischen ein und zwei Pixeln breit ist.

In diesen Fällen sollte man bei der Bildaufnahme darauf achten, dass die Bilder möglichst scharf sind und gleichzeitig möglichst wenig Rauschen enthalten, da diese Fehler zu Problemen bei der Dekodierung von niedrig aufgelösten Barcodes führen können.

Ausführungsinformationen

Dieser Operator modifiziert den Zustand des folgenden Eingabeparameters:

Während der Ausführung dieses Operators muss der Zugriff auf den Wert dieses Parameters synchronisiert werden, wenn er über mehrere Threads hinweg verwendet wird.

Parameter

ImageImageImageImageimage (input_object)  singlechannelimage objectHImageHImageHobject (byte / uint2)

Eingabebild. Falls das Bild eine reduzierte Domäne besitzen sollte, so wird der Bereich eingeschränkt in dem nach Barcodes gesucht wird. In der Regel führt dies zu einer Verbesserung der Laufzeit. Allerdings sollte man beachten, dass ein Barcode nicht mehr gefunden wird könnte, wenn er nicht vollständig in der Domäne des Bildes liegt.

SymbolRegionsSymbolRegionsSymbolRegionsSymbolRegionssymbolRegions (output_object)  region(-array) objectHRegionHRegionHobject *

Regionen der erfolgreich dekodierten Barcode-Symbole.

BarCodeHandleBarCodeHandleBarCodeHandleBarCodeHandlebarCodeHandle (input_control, Zustand wird modifiziert)  barcode HBarCode, HTupleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle des zu verwendenden Barcode-Modells.

CodeTypeCodeTypeCodeTypeCodeTypecodeType (input_control)  string(-array) HTupleHTupleHtuple (string) (string) (HString) (char*)

Typ des zu findenden Barcodes.

Defaultwert: 'auto' "auto" "auto" "auto" "auto"

Werteliste: '2/5 Industrial'"2/5 Industrial""2/5 Industrial""2/5 Industrial""2/5 Industrial", '2/5 Interleaved'"2/5 Interleaved""2/5 Interleaved""2/5 Interleaved""2/5 Interleaved", 'Codabar'"Codabar""Codabar""Codabar""Codabar", 'Code 128'"Code 128""Code 128""Code 128""Code 128", 'Code 39'"Code 39""Code 39""Code 39""Code 39", 'Code 93'"Code 93""Code 93""Code 93""Code 93", 'EAN-13 Add-On 2'"EAN-13 Add-On 2""EAN-13 Add-On 2""EAN-13 Add-On 2""EAN-13 Add-On 2", 'EAN-13 Add-On 5'"EAN-13 Add-On 5""EAN-13 Add-On 5""EAN-13 Add-On 5""EAN-13 Add-On 5", 'EAN-13'"EAN-13""EAN-13""EAN-13""EAN-13", 'EAN-8 Add-On 2'"EAN-8 Add-On 2""EAN-8 Add-On 2""EAN-8 Add-On 2""EAN-8 Add-On 2", 'EAN-8 Add-On 5'"EAN-8 Add-On 5""EAN-8 Add-On 5""EAN-8 Add-On 5""EAN-8 Add-On 5", 'EAN-8'"EAN-8""EAN-8""EAN-8""EAN-8", 'GS1 DataBar Expanded Stacked'"GS1 DataBar Expanded Stacked""GS1 DataBar Expanded Stacked""GS1 DataBar Expanded Stacked""GS1 DataBar Expanded Stacked", 'GS1 DataBar Expanded'"GS1 DataBar Expanded""GS1 DataBar Expanded""GS1 DataBar Expanded""GS1 DataBar Expanded", 'GS1 DataBar Limited'"GS1 DataBar Limited""GS1 DataBar Limited""GS1 DataBar Limited""GS1 DataBar Limited", 'GS1 DataBar Omnidir'"GS1 DataBar Omnidir""GS1 DataBar Omnidir""GS1 DataBar Omnidir""GS1 DataBar Omnidir", 'GS1 DataBar Stacked Omnidir'"GS1 DataBar Stacked Omnidir""GS1 DataBar Stacked Omnidir""GS1 DataBar Stacked Omnidir""GS1 DataBar Stacked Omnidir", 'GS1 DataBar Stacked'"GS1 DataBar Stacked""GS1 DataBar Stacked""GS1 DataBar Stacked""GS1 DataBar Stacked", 'GS1 DataBar Truncated'"GS1 DataBar Truncated""GS1 DataBar Truncated""GS1 DataBar Truncated""GS1 DataBar Truncated", 'GS1-128'"GS1-128""GS1-128""GS1-128""GS1-128", 'MSI'"MSI""MSI""MSI""MSI", 'PharmaCode'"PharmaCode""PharmaCode""PharmaCode""PharmaCode", 'UPC-A Add-On 2'"UPC-A Add-On 2""UPC-A Add-On 2""UPC-A Add-On 2""UPC-A Add-On 2", 'UPC-A Add-On 5'"UPC-A Add-On 5""UPC-A Add-On 5""UPC-A Add-On 5""UPC-A Add-On 5", 'UPC-A'"UPC-A""UPC-A""UPC-A""UPC-A", 'UPC-E Add-On 2'"UPC-E Add-On 2""UPC-E Add-On 2""UPC-E Add-On 2""UPC-E Add-On 2", 'UPC-E Add-On 5'"UPC-E Add-On 5""UPC-E Add-On 5""UPC-E Add-On 5""UPC-E Add-On 5", 'UPC-E'"UPC-E""UPC-E""UPC-E""UPC-E", 'auto'"auto""auto""auto""auto"

DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings (output_control)  string(-array) HTupleHTupleHtuple (string) (string) (HString) (char*)

Die Datenstrings der erfolgreich dekodierten Barcodes.

Beispiel (HDevelop)

* Small example for aborting bar code search:
read_image (Image, 'barcode/ean13/tea_box_10.png')

* Decode normally:
create_bar_code_model ([], [], BarCodeHandle)
find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', \
    DecodedDataStrings)
stop ()

* Start bar code search in separate thread.
par_start<ThreadID>: find_bar_code (Image, SymbolRegions1, BarCodeHandle, \
    'auto', DecodedDataStrings1)

* Let some time pass.
wait_seconds (0.002)

* Abort the data code search.
set_bar_code_param (BarCodeHandle, 'abort', 'true')

* Wait for the thread, it should finish very fast.
par_join(ThreadID)

* We can determine that the search in fact was aborted.
get_bar_code_result (BarCodeHandle, 'all', 'aborted', Aborted)

Ergebnis

find_bar_codefind_bar_codeFindBarCodeFindBarCodeFindBarCode liefert den Wert 2 (H_MSG_TRUE), falls die übergebenen Parameter korrekt sind. Ansonsten wird eine Fehlerbehandlung durchgeführt.

Vorgänger

create_bar_code_modelcreate_bar_code_modelCreateBarCodeModelCreateBarCodeModelCreateBarCodeModel, set_bar_code_paramset_bar_code_paramSetBarCodeParamSetBarCodeParamSetBarCodeParam

Nachfolger

get_bar_code_resultget_bar_code_resultGetBarCodeResultGetBarCodeResultGetBarCodeResult, get_bar_code_objectget_bar_code_objectGetBarCodeObjectGetBarCodeObjectGetBarCodeObject, clear_bar_code_modelclear_bar_code_modelClearBarCodeModelClearBarCodeModelClearBarCodeModel

Alternativen

decode_bar_code_rectangle2decode_bar_code_rectangle2DecodeBarCodeRectangle2DecodeBarCodeRectangle2DecodeBarCodeRectangle2

Modul

Bar Code