This section deals with certain features specific to the recognition of barcodes with ABBYY FineReader Engine 12. The main aspects of barcode recognition are treated in the description of the Barcode Recognition scenario.
In most cases, if a barcode conforms to the specification, it can be recognized with the default settings. In other cases, certain parameters need to be specified. These parameters are specified via the BarcodeParams subobject of the PageAnalysisParams object.
Barcodes with checksum
Barcodes of types Code 39, Interleaved 2 of 5, Codabar, and Matrix 2 of 5 may include a checksum. Checksums are used for error detection. The algorithm of checksum calculation is specified by the standard. You should set the HasChecksum property of the BarcodeParams object to TRUE in order for the barcodes with checksums to be recognized correctly.
Important! The recognition result does not include the barcode checksum if it is provided by the standard.
PDF417, Aztec, Data Matrix, QR Code, MaxiCode barcodes
By default, ABBYY FineReader Engine recognizes PDF417, Aztec, DataMatrix, QR Code, MaxiCode barcodes using the code page, which corresponds to the specification. These are the following code pages:
- for PDF417 — DOS United States (437) (CP_US_MSDOS)
- for Aztec, DataMatrix, QR Code, MaxiCode — ISO Latin 1 (8859-1) (CP_Latin_ISO)
Sometimes, these barcodes do not conform to the specification, that is, they were created using a code page different from that defined by the specification. In this case, it is necessary to specify the code page manually via the CodePage property of the BarcodeParams object.
QR Codes in Structured Append mode
QR Codes can be used to encode a large amount of data by joining up to 16 codes in a sequence in structured append format. The BarcodeBlock object provides access to special information of structured-append sequence through QrCodeSequenceId, QrCodeSequenceCount, QrCodeSequenceIndex properties, and you can use it in your program to join the recognized codes together.
Binary data encoded in barcodes
PDF417, Aztec, DataMatrix, QR Code barcodes can encode both text and binary data. ABBYY FineReader Engine represents all recognized barcode data, including binary data, as text. The way how binary data is represented in the form of text depends on the value of the ContainsBinaryData property of the BarcodeParams object:
|Value of ContainsBinaryData||Binary data representation|
|FALSE (default value)||
Note: The binary zero cannot be translated correctly to a Unicode string. The corresponding character in the string will be the "unrecognized character" symbol ("^") and will have the IBarcodeSymbol::IsBinaryZero property set to TRUE.
The recognition procedure
To recognize barcodes that do not conform to the specification or barcodes with checksums, do the following (we presume that the BarcodeRecognition_Accuracy or BarcodeRecognition_Speed predefined profile has already been loaded):
- Create a DocumentProcessingParams object using the CreateDocumentProcessingParams method of the Engine object.
- Change the default values of the necessary properties of the BarcodeParams subobject (DocumentProcessingParams contains a PageProcessingParams property, which contains PageAnalysisParams, which in turn includes BarcodeParams).
- Pass the DocumentProcessingParams object to the Process method of the FRDocument object as an input parameter.
- If you are using other methods for processing, they may require a PageAnalysisParams or a PageProcessingParams object as input parameters. Follow the same procedure, changing the values of the BarcodeParams subobject of one of these objects.
C++ (COM) code
FREngine::IEnginePtr Engine; FREngine::IFRDocumentPtr frDocument; ... // Create a DocumentProcessingParams object FREngine::IDocumentProcessingParamsPtr params = Engine->CreateDocumentProcessingParams(); // Specify the necessary parameters params->PageProcessingParams->PageAnalysisParams->BarcodeParams->Type = FREngine::BT_Code39; // Recognize barcodes. Suppose that we have already created the FRDocument object and // the BarcodeRecognition predefined profile has already been loaded frDocument->Process( params ); ...
FREngine.IEngine engine; FREngine.IFRDocument frDocument; ... // Create a DocumentProcessingParams object FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams(); // Specify the necessary parameters dpp.PageProcessingParams.PageAnalysisParams.BarcodeParams.Type = (int)FREngine.BarcodeTypeEnum.BT_Code39; // Recognize barcodes. Suppose that we have already created the FRDocument object and // the BarcodeRecognition predefined profile has already been loaded frDocument.Process( dpp );
Tips for working with barcodes
Barcode recognition quality depends on barcode print quality and settings used in the document scanning process. In order for the barcodes to be recognized well, follow these recommendations:
- A barcode must be separated from other text by a fairly wide white gap.
- Barcode size and the width of its separate bars or dots must meet the following requirements:
- The optimal barcode height is more than 10 millimeters. The size of a barcode should be less than size A4.
- Barcode height must be greater than the double height of a text line.
- For non-square barcodes, the length must be greater than height.
- For 1D barcodes, the width of the thinnest bar in the barcode must be at least 3-5 pixels in terms of pixels of the image.
- For 2D barcodes, the dimensions of their cells should be at least 2x2 pixels; the recommended size is 4x4 pixels or more. Besides, for all 2D barcodes except PDF417, the cells should be square because if the 2D barcode is stretched, it will most likely be recognized incorrectly.
- We do not recommend compressing images of barcodes using JPEG compression as it makes barcode borders fuzzy.
- We do not recommend skewing barcodes, i.e., an angle of the barcode should be a multiple of 90 degrees relative to the horizontal axis.
- The grayscale scanning mode is the best for OCR purposes. When scanning in black-and-white, adjust the brightness setting. If the barcode is "torn" or very light, lower the brightness to make the image darker. If the barcode is distorted or its parts are glued together, increase the brightness to make the image brighter.
- Avoid printing barcodes in frames.
- Avoid printing barcodes over text or picture.
In real life, barcodes that do not fit these recommendations can still be recognized; however, the quality of recognition may be poor.