메인 콘텐츠로 건너뛰기
이 섹션에서는 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 속성에서 코드 페이지를 수동으로 지정해야 합니다.

Structured Append 모드의 QR 코드

QR 코드는 structured append 형식으로 최대 16개의 코드를 하나의 시퀀스로 연결해 많은 양의 데이터를 인코딩하는 데 사용할 수 있습니다. BarcodeBlock 객체를 사용하면 QrCodeSequenceId, QrCodeSequenceCount, QrCodeSequenceIndex 속성을 통해 structured append 시퀀스의 특수 정보에 액세스할 수 있으며, 프로그램에서 이를 사용해 인식된 코드들을 하나로 결합할 수 있습니다.

바코드에 인코딩된 바이너리 데이터

PDF417, Aztec, DataMatrix, QR Code 바코드는 텍스트와 바이너리 데이터를 모두 인코딩할 수 있습니다. ABBYY FineReader Engine은 바이너리 데이터를 포함한 인식된 모든 바코드 데이터를 텍스트로 표현합니다. 바이너리 데이터가 텍스트 형식으로 표현되는 방식은 BarcodeParams 객체의 ContainsBinaryData 속성 값에 따라 달라집니다.

ContainsBinaryData 값

바이너리 데이터 표현 방식

FALSE (기본값)

  • 바이너리 데이터를 포함하는 각 문자의 IBarcodeSymbol::IsBinaryData 속성은 TRUE로 설정됩니다.
  • 바이너리 데이터와 텍스트 데이터는 모두 Unicode string(IBarcodeBlock::Text)으로 표현됩니다.
  • 데이터는 IBarcodeParams::CodePage 속성에 지정된 코드 페이지를 사용해 Unicode string으로 변환됩니다. Unicode string에서 바이너리 데이터를 얻으려면 해당 코드 페이지를 사용해 string을 디코딩해야 합니다.
바이너리 0은 Unicode string으로 올바르게 변환할 수 없습니다. string에서 해당 문자는 “인식되지 않은 문자” 기호(”^“)로 표시되며, IBarcodeSymbol::IsBinaryZero 속성은 TRUE로 설정됩니다.

TRUE

  • 바이너리 데이터를 포함하는 각 문자의 IBarcodeSymbol::IsBinaryData 속성은 TRUE로 설정됩니다.
  • 바이너리 데이터와 텍스트 데이터는 모두 Unicode string(IBarcodeBlock::Text)으로 표현됩니다.
  • 바이너리 데이터는 Unicode string에 해당 바이트의 16진수 값 시퀀스로 저장됩니다. 예를 들어 string “00FF02”는 다음 3개 바이트에 사용됩니다: 0x00, 0xFF, 0x02.

인식 절차

사양을 준수하지 않는 바코드나 체크섬이 있는 바코드를 인식하려면 다음 단계를 수행합니다(BarcodeRecognition_Accuracy 또는 BarcodeRecognition_Speed 미리 정의된 프로필이 이미 로드되어 있다고 가정합니다).
  1. Engine 객체의 CreateDocumentProcessingParams 메서드를 사용하여 DocumentProcessingParams 객체를 만듭니다.
  2. BarcodeParams 하위 객체에서 필요한 속성의 기본값을 변경합니다(DocumentProcessingParams에는 PageProcessingParams 속성이 있고, PageProcessingParams에는 PageAnalysisParams가 포함되며, PageAnalysisParams에는 다시 BarcodeParams가 포함됩니다).
  3. FRDocument 객체의 Process 메서드에 입력 매개변수로 DocumentProcessingParams 객체를 전달합니다.
  4. 처리에 다른 메서드를 사용하는 경우 입력 매개변수로 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보다 작아야 합니다.
    • 바코드 높이는 텍스트 한 줄 높이의 두 배보다 커야 합니다.
    • 정사각형이 아닌 바코드의 경우 길이가 높이보다 길어야 합니다.
    • 1D 바코드의 경우, 바코드에서 가장 가는 막대의 너비는 이미지 픽셀 기준으로 최소 3~5픽셀이어야 합니다.
    • 2D 바코드의 경우 셀 크기는 최소 2x2픽셀이어야 하며, 권장 크기는 4x4픽셀 이상입니다. 또한 PDF417을 제외한 모든 2D 바코드에서는 셀이 정사각형이어야 합니다. 2D 바코드가 늘어나면 잘못 인식될 가능성이 매우 높기 때문입니다.
  • JPEG 압축을 사용해 바코드 이미지를 압축하는 것은 권장하지 않습니다. 바코드 경계가 흐려지기 때문입니다.
  • 바코드가 기울어지지 않도록 하는 것이 좋습니다. 즉, 바코드의 각도는 수평축을 기준으로 90도의 배수여야 합니다.
  • 회색조 스캔 모드는 OCR에 가장 적합합니다. 흑백으로 스캔할 때는 밝기 설정을 조정하세요. 바코드가 “찢어진” 것처럼 보이거나 매우 옅으면 이미지를 더 어둡게 하기 위해 밝기를 낮추세요. 바코드가 왜곡되었거나 일부가 서로 붙어 있으면 이미지를 더 밝게 하기 위해 밝기를 높이세요.
  • 프레임 안에 바코드를 인쇄하지 마세요.
  • 텍스트나 그림 위에 바코드를 인쇄하지 마세요.
실제 환경에서는 이러한 권장 사항에 맞지 않는 바코드도 인식될 수 있지만, 인식 품질은 떨어질 수 있습니다.

참고 항목

바코드 인식 바코드 유형