In diesem Abschnitt geht es um bestimmte Funktionen, die speziell für die Erkennung von Barcodes mit ABBYY FineReader Engine 12 gelten. Die wichtigsten Aspekte der Barcode-Erkennung werden im Szenario Barcode-Erkennung beschrieben.In den meisten Fällen kann ein Barcode mit den Standardeinstellungen erkannt werden, wenn er der Spezifikation entspricht. In anderen Fällen müssen bestimmte Parameter angegeben werden. Diese Parameter werden über das Unterobjekt BarcodeParams des Objekts PageAnalysisParams festgelegt.
Barcodes der Typen Code 39, Interleaved 2 of 5, Codabar und Matrix 2 of 5 können eine Prüfsumme enthalten. Prüfsummen dienen der Fehlererkennung. Der Algorithmus zur Berechnung der Prüfsumme ist durch den Standard festgelegt. Damit Barcodes mit Prüfsummen korrekt erkannt werden, müssen Sie die Eigenschaft HasChecksum des BarcodeParams-Objekts auf TRUE setzen.
Das Erkennungsergebnis enthält die Barcode-Prüfsumme nicht, wenn diese durch den Standard vorgegeben ist.
PDF417-, Aztec-, Data Matrix-, QR-Code- und MaxiCode-Barcodes
Standardmäßig erkennt ABBYY FineReader Engine PDF417-, Aztec-, DataMatrix-, QR Code- und MaxiCode-Barcodes mit der Codepage, die der Spezifikation entspricht. Dabei werden die folgenden Codepages verwendet:
für PDF417 — DOS United States (437) (CP_US_MSDOS)
für Aztec, DataMatrix, QR Code, MaxiCode — ISO Latin 1 (8859-1) (CP_Latin_ISO)
Manchmal entsprechen diese Barcodes jedoch nicht der Spezifikation, das heißt, sie wurden mit einer anderen Codepage erstellt als der in der Spezifikation festgelegten. In diesem Fall muss die Codepage manuell über die Eigenschaft CodePage des Objekts BarcodeParams angegeben werden.
QR-Codes können verwendet werden, um große Datenmengen zu kodieren, indem bis zu 16 Codes in einer Sequenz im Structured-Append-Format zusammengefasst werden. Das BarcodeBlock-Objekt bietet über die Eigenschaften QrCodeSequenceId, QrCodeSequenceCount und QrCodeSequenceIndex Zugriff auf spezielle Informationen zur Structured-Append-Sequenz, und Sie können es in Ihrem Programm verwenden, um die erkannten Codes zusammenzusetzen.
PDF417, Aztec, DataMatrix und QR Code-Barcodes können sowohl Text als auch Binärdaten codieren. ABBYY FineReader Engine stellt alle erkannten Barcode-Daten, einschließlich Binärdaten, als Text dar. Wie Binärdaten in Textform dargestellt werden, hängt vom Wert der Eigenschaft ContainsBinaryData des BarcodeParams-Objekts ab:
Binärdaten werden ebenso wie Textdaten als Unicode-Zeichenfolge dargestellt (IBarcodeBlock::Text).
Die Daten werden mithilfe der in der Eigenschaft IBarcodeParams::CodePage angegebenen Codepage in die Unicode-Zeichenfolge umgewandelt. Um die Binärdaten aus der Unicode-Zeichenfolge zu erhalten, sollten Sie die Zeichenfolge mit der entsprechenden Codepage decodieren.
Die binäre Null kann nicht korrekt in eine Unicode-Zeichenfolge umgewandelt werden. Das entsprechende Zeichen in der Zeichenfolge ist das Symbol für „nicht erkanntes Zeichen“ („^“) und hat die Eigenschaft IBarcodeSymbol::IsBinaryZero auf TRUE gesetzt.
Binärdaten werden ebenso wie Textdaten als Unicode-Zeichenfolge dargestellt (IBarcodeBlock::Text).
Die Binärdaten werden in der Unicode-Zeichenfolge als Folge hexadezimaler Werte der entsprechenden Bytes gespeichert. Zum Beispiel wird die Zeichenfolge “00FF02” für die folgenden 3 Bytes verwendet: 0x00, 0xFF, 0x02.
Gehen Sie wie folgt vor, um Barcodes zu erkennen, die nicht der Spezifikation entsprechen, oder Barcodes mit Prüfsummen zu verarbeiten (wir setzen voraus, dass das vordefinierte Profil BarcodeRecognition_Accuracy oder BarcodeRecognition_Speed bereits geladen wurde):
Ändern Sie die Standardwerte der erforderlichen Eigenschaften des Unterobjekts BarcodeParams (DocumentProcessingParams enthält die Eigenschaft PageProcessingParams, die wiederum PageAnalysisParams enthält, und dieses schließt BarcodeParams ein).
Übergeben Sie das Objekt DocumentProcessingParams als Eingabeparameter an die Methode Process des Objekts FRDocument.
Wenn Sie andere Verarbeitungsmethoden verwenden, benötigen diese möglicherweise ein Objekt vom Typ PageAnalysisParams oder PageProcessingParams als Eingabeparameter. Gehen Sie dabei genauso vor und ändern Sie die Werte des Unterobjekts BarcodeParams in einem dieser Objekte.
// Wir gehen davon aus, dass die Engine bereits geladen wurde// und das Dokument geöffnet istIEngine* Engine;IFRDocument* frDocument;HRESULT res; // diese Variable verwenden, um zu prüfen, ob der Methodenaufruf erfolgreich war...// Ein DocumentProcessingParams-Objekt erstellenIDocumentProcessingParams* params = 0;res = Engine->CreateDocumentProcessingParams( ¶ms );IPageProcessingParams* pageParams = 0;IPageAnalysisParams* analysisParams = 0;IBarcodeParams* barcodeParams = 0;res = params->get_PageProcessingParams( &pageParams );res = pageParams->get_PageAnalysisParams( &analysisParams );res = analysisParams->get_BarcodeParams( &barcodeParams );// Die erforderlichen Parameter festlegenres = barcodeParams->set_Type( BT_Code39 );// Barcodes erkennen// Wir gehen davon aus, dass das vordefinierte Profil BarcodeRecognition bereits geladen istres = frDocument->Process( params );...
C++ (COM)-Code
FREngine::IEnginePtr Engine;FREngine::IFRDocumentPtr frDocument;...// Ein DocumentProcessingParams-Objekt erstellenFREngine::IDocumentProcessingParamsPtr params = Engine->CreateDocumentProcessingParams();// Die erforderlichen Parameter festlegenparams->PageProcessingParams->PageAnalysisParams->BarcodeParams->Type = FREngine::BT_Code39;// Barcodes erkennen. Wir gehen davon aus, dass das FRDocument-Objekt bereits erstellt wurde und// das vordefinierte Profil BarcodeRecognition bereits geladen istfrDocument->Process( params );...
C#-Code
FREngine.IEngine engine;FREngine.IFRDocument frDocument;...// Ein DocumentProcessingParams-Objekt erstellenFREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();// Die erforderlichen Parameter festlegendpp.PageProcessingParams.PageAnalysisParams.BarcodeParams.Type = (int)FREngine.BarcodeTypeEnum.BT_Code39;// Barcodes erkennen. Wir gehen davon aus, dass das FRDocument-Objekt bereits erstellt wurde und// das vordefinierte Profil BarcodeRecognition bereits geladen istfrDocument.Process( dpp );
Die Qualität der Barcode-Erkennung hängt von der Druckqualität der Barcodes und den beim Scannen des Dokuments verwendeten Einstellungen ab. Damit Barcodes zuverlässig erkannt werden, befolgen Sie diese Empfehlungen:
Ein Barcode muss durch einen ausreichend breiten weißen Freiraum von anderem Text getrennt sein.
Die Größe des Barcodes und die Breite seiner einzelnen Balken oder Punkte müssen die folgenden Anforderungen erfüllen:
Die optimale Höhe eines Barcodes beträgt mehr als 10 Millimeter. Ein Barcode sollte kleiner als das Format A4 sein.
Die Höhe des Barcodes muss mehr als doppelt so groß sein wie die Höhe einer Textzeile.
Bei nicht quadratischen Barcodes muss die Länge größer als die Höhe sein.
Bei 1D-Barcodes muss die Breite des dünnsten Balkens im Barcode mindestens 3–5 Pixel betragen.
Bei 2D-Barcodes müssen die Zellen mindestens 2x2 Pixel groß sein; empfohlen wird eine Größe von 4x4 Pixeln oder mehr. Außerdem sollten bei allen 2D-Barcodes außer PDF417 die Zellen quadratisch sein, da ein gestreckter 2D-Barcode höchstwahrscheinlich nicht korrekt erkannt wird.
Wir raten davon ab, Barcode-Bilder mit JPEG zu komprimieren, da dadurch die Barcode-Ränder unscharf werden.
Wir raten davon ab, Barcodes schräg auszurichten, d. h., der Winkel des Barcodes sollte zur horizontalen Achse ein Vielfaches von 90 Grad sein.
Der Graustufen-Scanmodus ist für OCR-Zwecke am besten geeignet. Wenn Sie in Schwarzweiß scannen, passen Sie die Helligkeitseinstellung an. Wenn der Barcode „zerrissen“ wirkt oder sehr hell ist, verringern Sie die Helligkeit, um das Bild dunkler zu machen. Wenn der Barcode verzerrt ist oder seine Teile zusammenkleben, erhöhen Sie die Helligkeit, um das Bild heller zu machen.
Vermeiden Sie es, Barcodes in Rahmen zu drucken.
Vermeiden Sie es, Barcodes über Text oder Bilder zu drucken.
In der Praxis können auch Barcodes erkannt werden, die diese Empfehlungen nicht erfüllen; die Erkennungsqualität kann jedoch gering sein.