跳轉到主要內容
本節說明 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 United States (437) (CP_US_MSDOS)
  • Aztec、DataMatrix、QR Code、MaxiCode — ISO Latin 1 (8859-1) (CP_Latin_ISO)
有時,這些條碼不符合規格,也就是說,它們建立時所使用的字碼頁與規格所定義的不同。在這種情況下,必須透過 BarcodeParams 物件的 CodePage 屬性手動指定字碼頁。

QR Codes 的結構化附加模式

QR Codes 可使用結構化附加格式,將序列中最多 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_Accuracy 或 BarcodeRecognition_Speed 預先定義的設定檔) :
  1. 使用 Engine 物件的 CreateDocumentProcessingParams 方法建立 DocumentProcessingParams 物件。
  2. 變更 BarcodeParams 子物件中所需屬性的預設值 (DocumentProcessingParams 包含 PageProcessingParams 屬性,而 PageProcessingParams 又包含 PageAnalysisParams,後者則包含 BarcodeParams) 。
  3. 將 DocumentProcessingParams 物件作為輸入參數,傳遞給 FRDocument 物件的 Process 方法。
  4. 如果您使用其他處理方法,可能需要將 PageAnalysisParamsPageProcessingParams 物件作為輸入參數。請遵循相同步驟,變更其中一個物件的 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 而言,灰階掃描模式是最佳選擇。使用黑白模式掃描時,請調整亮度設定。如果條碼出現「斷裂」或顏色過淡,請降低亮度,讓影像變暗。如果條碼變形或其部分黏連在一起,請提高亮度,讓影像變亮。
  • 避免將條碼列印在邊框內。
  • 避免將條碼列印在文字或圖片上方。
在實際情況中,即使不符合這些建議的條碼仍可能被辨識;然而,辨識品質可能較差。

另請參閱

條碼辨識 條碼類型