跳转到主要内容
本节介绍 ABBYY FineReader Engine 12 在条码识别方面的一些特有功能。有关条码识别的主要内容,请参见条码识别场景说明。 在大多数情况下,如果条码符合规范,则可使用默认设置进行识别。其他情况下,则需要指定某些参数。这些参数通过 PageAnalysisParams 对象的 BarcodeParams 子对象进行设置。

带校验和的条码

Code 39Interleaved 2 of 5CodabarMatrix 2 of 5 类型的条码可能包含校验和。校验和用于检错,其计算算法由相关标准规定。为正确识别带校验和的条码,应将 BarcodeParams 对象 的 HasChecksum 属性设置为 TRUE。
如果标准规定了条码校验和,则识别结果中不包含该校验和。

PDF417、Aztec、Data Matrix、QR Code、MaxiCode 条码

默认情况下,ABBYY FineReader Engine 使用与规范相对应的代码页来识别 PDF417AztecDataMatrixQR CodeMaxiCode 条码。具体代码页如下:
  • 对于 PDF417 — DOS 美国 (437) (CP_US_MSDOS)
  • 对于 Aztec、DataMatrix、QR Code 和 MaxiCode — ISO Latin 1 (8859-1) (CP_Latin_ISO)
有时,这些条码并不符合规范,也就是说,它们在创建时使用的代码页与规范定义的代码页不同。在这种情况下,需要通过 BarcodeParams 对象的 CodePage 属性手动指定代码页。

结构化追加模式下的 QR Code

QR Code 可通过结构化追加格式将序列中最多 16 个代码组合起来,从而编码大量数据。BarcodeBlock 对象通过 QrCodeSequenceId、QrCodeSequenceCount 和 QrCodeSequenceIndex 属性提供对结构化追加序列专有信息的访问,您可以在程序中使用这些信息将识别出的代码拼接起来。

条码中编码的二进制数据

PDF417AztecDataMatrixQR Code 条码既可编码文本,也可编码二进制数据。ABBYY FineReader Engine 将所有识别到的条码数据 (包括二进制数据) 统一表示为文本。二进制数据以文本形式表示的方式取决于 BarcodeParams 对象的 ContainsBinaryData 属性值:

ContainsBinaryData 的值

二进制数据的表示方式

FALSE (默认值)

  • 每个包含二进制数据的字符,其 IBarcodeSymbol::IsBinaryData 属性都设置为 TRUE。
  • 二进制数据和文本数据都表示为 Unicode string (IBarcodeBlock::Text) 。
  • 数据会使用 IBarcodeParams::CodePage 属性中指定的代码页转换为 Unicode string。要从 Unicode string 中获取二进制数据,应使用相应的代码页对该 string 进行解码。
二进制零值无法正确转换为 Unicode string。string 中对应的字符将是“无法识别字符”符号 (“^”) ,并且其 IBarcodeSymbol::IsBinaryZero 属性将设置为 TRUE。

TRUE

  • 每个包含二进制数据的字符,其 IBarcodeSymbol::IsBinaryData 属性都设置为 TRUE。
  • 二进制数据和文本数据都表示为 Unicode string (IBarcodeBlock::Text) 。
  • 二进制数据会以对应字节的十六进制值序列形式保存在 Unicode string 中。例如,对于以下 3 个字节:0x00、0xFF、0x02,将使用 string“00FF02”。

识别过程

要识别不符合规范的条码或包含校验和的条码,请执行以下操作 (假定已加载 BarcodeRecognition_AccuracyBarcodeRecognition_Speed 预定义配置文件) :
  1. 使用 Engine 对象的 CreateDocumentProcessingParams 方法创建 DocumentProcessingParams 对象。
  2. 修改 BarcodeParams 子对象中所需属性的默认值 (DocumentProcessingParams 包含一个 PageProcessingParams 属性,该属性包含 PageAnalysisParams,而后者又包含 BarcodeParams) 。
  3. 将 DocumentProcessingParams 对象作为输入参数传递给 FRDocument 对象的 Process 方法。
  4. 如果您使用的是其他处理方法,它们可能需要 PageAnalysisParamsPageProcessingParams 对象作为输入参数。请按相同步骤操作,修改其中一个对象的 BarcodeParams 子对象的值。

代码示例

// 我们假设 Engine 已经加载
// 并且文档已打开
IEngine* Engine;
IFRDocument* frDocument;
HRESULT res; // 使用此变量检查 method 调用是否成功
...
// 创建一个 DocumentProcessingParams 对象
IDocumentProcessingParams* 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 );
 
// 指定所需参数
res = barcodeParams->set_Type( BT_Code39 );
 
// 识别条码
// 我们假设 BarcodeRecognition 预定义配置文件 已经加载
res = frDocument->Process( params );
...
FREngine::IEnginePtr Engine;
FREngine::IFRDocumentPtr frDocument;
...
// 创建一个 DocumentProcessingParams 对象
FREngine::IDocumentProcessingParamsPtr params = Engine->CreateDocumentProcessingParams();
// 指定所需参数
params->PageProcessingParams->PageAnalysisParams->BarcodeParams->Type = FREngine::BT_Code39;
// 识别条码。假设我们已经创建了 FRDocument 对象,
// 并且 BarcodeRecognition 预定义配置文件 已经加载
frDocument->Process( params );
...
FREngine.IEngine engine;
FREngine.IFRDocument frDocument;
...
// 创建一个 DocumentProcessingParams 对象
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
// 指定所需参数
dpp.PageProcessingParams.PageAnalysisParams.BarcodeParams.Type = (int)FREngine.BarcodeTypeEnum.BT_Code39;
// 识别条码。假设我们已经创建了 FRDocument 对象,
// 并且 BarcodeRecognition 预定义配置文件 已经加载
frDocument.Process( dpp );

条码使用提示

条码识别质量取决于条码的打印质量以及文档扫描过程中使用的设置。为确保条码能够得到良好识别,请遵循以下建议:
  • 条码必须与其他文本之间留有足够宽的空白间隔。
  • 条码尺寸以及各条纹或点的宽度必须满足以下要求:
    • 条码的最佳高度应大于 10 毫米。条码尺寸应小于 A4 纸张大小。
    • 条码高度必须大于文本行高度的两倍。
    • 对于非正方形条码,其长度必须大于高度。
    • 对于一维条码,按图像像素计算,条码中最细条纹的宽度必须至少为 3–5 像素。
    • 对于二维条码,其单元尺寸应至少为 2x2 像素;建议为 4x4 像素或更大。此外,除 PDF417 外,所有二维条码的单元都应为正方形,因为如果二维条码被拉伸,很可能会识别错误。
  • 不建议使用 JPEG 压缩条码图像,因为这会使条码边缘变得模糊。
  • 不建议让条码发生倾斜,也就是说,条码相对于水平轴的角度应为 90 度的倍数。
  • 对于 OCR,灰度扫描模式效果最佳。使用黑白模式扫描时,请调整亮度设置。如果条码出现“断裂”或颜色很浅,请降低亮度,使图像变暗。如果条码变形或各部分粘连在一起,请提高亮度,使图像变亮。
  • 避免将条码打印在边框中。
  • 避免将条码打印在文本或图片上。
在实际应用中,不符合这些建议的条码仍然可能被识别;但是,识别质量可能较差。

另请参见

条码识别 条码类型