本節說明 ABBYY FineReader Engine 12 中條碼辨識的特定功能。條碼辨識的主要內容請參閱 條碼辨識 情境的說明。
在大多數情況下,如果條碼符合規格,即可使用預設設定進行辨識。在其他情況下,則需要指定某些參數。這些參數可透過 PageAnalysisParams 物件的 BarcodeParams 子物件來指定。
Code 39、Interleaved 2 of 5、Codabar 和 Matrix 2 of 5 類型的條碼可能包含檢查碼。檢查碼用於偵測錯誤。檢查碼的計算演算法由相關標準規定。您應將 BarcodeParams 物件的 HasChecksum 屬性設為 TRUE,才能正確辨識含有檢查碼的條碼。
如果標準規定條碼包含檢查碼,則辨識結果中不會包含該檢查碼。
PDF417、Aztec、Data Matrix、QR Code、MaxiCode 條碼
預設情況下,ABBYY FineReader Engine 會使用符合規格的字碼頁來辨識 PDF417、Aztec、DataMatrix、QR Code、MaxiCode 條碼。對應的字碼頁如下:
- PDF417 — DOS United States (437) (CP_US_MSDOS)
- Aztec、DataMatrix、QR Code、MaxiCode — ISO Latin 1 (8859-1) (CP_Latin_ISO)
有時,這些條碼不符合規格,也就是說,它們建立時所使用的字碼頁與規格所定義的不同。在這種情況下,必須透過 BarcodeParams 物件的 CodePage 屬性手動指定字碼頁。
QR Codes 可使用結構化附加格式,將序列中最多 16 個代碼串接起來,以編碼大量資料。BarcodeBlock 物件可透過 QrCodeSequenceId、QrCodeSequenceCount 和 QrCodeSequenceIndex 屬性,存取結構化附加序列的特殊資訊,您可以在程式中使用這些資訊,將已辨識的代碼串接起來。
PDF417、Aztec、DataMatrix 和 QR Code 條碼都可以同時編碼文字與二進位資料。ABBYY FineReader Engine 會將所有辨識到的條碼資料 (包括二進位資料) 一律表示為文字。二進位資料以文字形式表示的方式,取決於 BarcodeParams 物件的 ContainsBinaryData 屬性值:
ContainsBinaryData 的值 | 二進位資料的表示方式 |
|---|
FALSE (預設值) | |
TRUE | |
若要辨識不符合規格的條碼或含有檢查碼的條碼,請執行下列操作 (假設已載入 BarcodeRecognition_Accuracy 或 BarcodeRecognition_Speed 預先定義的設定檔) :
- 使用 Engine 物件的 CreateDocumentProcessingParams 方法建立 DocumentProcessingParams 物件。
- 變更 BarcodeParams 子物件中所需屬性的預設值 (DocumentProcessingParams 包含 PageProcessingParams 屬性,而 PageProcessingParams 又包含 PageAnalysisParams,後者則包含 BarcodeParams) 。
- 將 DocumentProcessingParams 物件作為輸入參數,傳遞給 FRDocument 物件的 Process 方法。
- 如果您使用其他處理方法,可能需要將 PageAnalysisParams 或 PageProcessingParams 物件作為輸入參數。請遵循相同步驟,變更其中一個物件的 BarcodeParams 子物件值。
// 我們假設 Engine 已經載入
// 並且文件已開啟
IEngine* Engine;
IFRDocument* frDocument;
HRESULT res; // 使用此變數檢查方法呼叫是否成功
...
// 建立 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 而言,灰階掃描模式是最佳選擇。使用黑白模式掃描時,請調整亮度設定。如果條碼出現「斷裂」或顏色過淡,請降低亮度,讓影像變暗。如果條碼變形或其部分黏連在一起,請提高亮度,讓影像變亮。
- 避免將條碼列印在邊框內。
- 避免將條碼列印在文字或圖片上方。
在實際情況中,即使不符合這些建議的條碼仍可能被辨識;然而,辨識品質可能較差。
條碼辨識
條碼類型