OCV
1 개요
학습한 문자 정보를 바탕으로 이미지 내에서의 텍스트를 추출하고 검증합니다.
2 알고리즘 상세 설명
OCR 알고리즘에서 학습하거나, 글꼴 파일의 문자 정보를 Load 하여 인식, 검사합니다.
규칙적이고 고정된 글꼴과 레이아웃을 가진 이미지에 최적화되어있습니다.
- 검사 항목
- 학습 문자 기준 또는 주변 문자 기준 문자의 밝기, 대비
- 학습 문자 기준 문자 모양의 Intrusion(안으로 파인 오차), Extrusion(밖으로 나온 오차)
- 주변 문자 기준 문자의 크기, 회전 정도
- 인접한 문자와의 떨어진 정도
높은 처리 속도를 제공하기위해 내재화된 병렬화 처리 기능을 제공합니다. 멀티스레드, SIMD 를 제공하며 복잡한 설정없이 알고리즘이 자체적으로 판단하여 기본으로 가장 높은 처리속도의 설정으로 바로 실행이 가능하여 손쉽게 사용이 가능합니다, 또한 설비에서 발생할 수 있는 제한된 스레드 사용, 저사양PC의 SIMD사용제한 등에 SetProcessingUnit API를 통해 손쉽게 원하는 리소스 방식으로 사용이 가능합니다.
Source 이미지 | 검사 결과 |
---|---|
![]() |
![]() |
Source 이미지 | 검사 결과 |
![]() |
![]() |
3 파라미터 설정 및 사용 방법
[i] 기본적인 동작의 경우, 별도의 파라미터 설정없이 가능합니다.
[ii] 사용자의 최적화된 결과를 제공하기위한 다양한 하이퍼 파라미터를 제공합니다. 해당 파라미터는 설정할 의무가 없으나 설비 혹은 개발에 최적화된 처리속도와 정밀한 결과를 얻기 위해 적절한 파라미터 값을 설정한다면 더 효과적인 결과를 얻을 수 있습니다.
3.1 학습 문자 정보 Load 및 관리
OCV 알고리즘 사용 전 반드시 OCR 알고리즘에서 학습한 문자 정보 또는 글꼴 파일(.TTF, .TTC)을 Load 해야합니다. 글꼴 파일을 Load 하는게 아닐 경우 OCR 메뉴얼을 먼저 보시는 것을 추천드립니다.
COCV ocv; // 알고리즘 객체
ocv.LoadFontData(L"C:/Users/Public/Documents/FLImaging/ExampleImages/OCV/Font_A-Z_0-9.flocr"); // flocr 파일 Load (TTF, TTC 파일도 가능합니다.)
const CFLImage* pFliFontData = ocv.GetFontData(); // 문자 정보 조회
LoadFont()
- OCR 알고리즘에서 Learn, 저장한 파일을 Load 합니다.
GetFontData()
- Load 한 문자 정보가 있는 이미지를 얻습니다. 각 페이지마다 하나의 학습된 문자에 대한 Figure, 매핑 정보를 조회할 수 있습니다. OCR 알고리즘의 'GetLearnedImage()' 결과와 동일합니다.
DeleteFontData()
- 인덱스 번호 또는 문자를 입력하여 문자 정보를 삭제합니다.
ClearFontData()
- 모든 문자 정보를 삭제합니다.
Font Data | Font Data |
---|---|
![]() |
![]() |
OCR 에서 학습한 문자 정보가 잘 Load 된 것 같습니다. 앞으로는 해당 정보를 기준으로 검사가 진행됩니다.
3.2 인식 관련 설정
OCV 알고리즘에서 인식을 위한 설정과 Preview 기능의 경우 OCR 알고리즘과 완전히 동일합니다. OCR 의 메뉴얼을 먼저 보시는 것을 추천드립니다.
ocv.EnableAutoSeparation(true); // Auto Separation 적용
ocv.EnableNoiseReduction(true); // 노이즈 감소 적용
ocv.SetCharacterColorType(ECharacterColorType_BlackOnWhite); // 흰색 배경에 검정색 문자로 설정
ocv.SetAngleBias(0.0); // 기준 각도를 0도로 설정
ocv.SetAngleTolerance(30.0); // 허용 범위를 양 옆 30도로 설정
EnableAutoSeparation()
- 이미지에 자체 전처리를 적용하여 이진화를 수행합니다.
SetThresholdValue()
- Auto Separation 을 사용하지 않을 경우 입력값을 기준으로 이진화합니다.
EnableNoiseReduction()
- 이미지에 노이즈 감소를 적용합니다.
SetCharacterColorType()
- 문자의 색상을 설정합니다. Black On White, White on Black, All 모드 중 선택 가능합니다.
SetAngleBias()
- 기준 각도를 설정합니다.
SetAngleTolerance()
- 기준 각도에서 문자가 기울어진 허용 범위를 설정합니다.
3.1.1 인식 관련 보조 키워드
Ignore Example |
---|
![]() |
노이즈나 인식하지 않고 싶은 객체가 있을 경우 "!!" 를 이름으로 라벨링하여 처리되지 않게 할 수 있습니다.
3.3 검사 관련 설정
3.3.1 문자열 매칭 기능
Label Figure 또는 ROI 기능을 사용하여 입력한 문자열과 동일하게 인식되었는지 검사할 수 있습니다. OCR 알고리즘의 이미지와 동일한 이미지에서 검사를 진행해보겠습니다.
CFLImage fliSource;
CFLFigureArray flfaROI1;
fliSource.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/OCR/OCR_Learn.flif"); // Source 이미지 로드
flfaROI1.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/OCV/Menual_ROI 1.fig"); // ROI 로드
ocv.SetSourceImage(fliSource); // Source 이미지 입력
ocv.SetSourceROI(flfaROI1); // 검사할 위치에 정답 문자열로 이름이 지정된 ROI 를 설정합니다.
ocv.SetWritingDirection(EWritingDirection_LeftToRight); // 왼쪽에서 오른쪽 방향으로 각 문자를 매핑합니다.
ocv.Execute(); // 검사 진행
SetWritingDirection()
- 문자의 정렬 방향을 설정합니다.
Execute()
- 검사를 진행합니다.
ROI, 정렬 방향을 설정하고 검사를 진행합니다. 입력한 Figure Name 과 동일한 문자가 매칭되었는지 검사합니다.
ROI |
---|
![]() |
ROI 가 입력되지 않을 경우 매칭 기능 없이 전체 이미지에 대해 검사합니다
COCV::EVerificationState eVerificationResult = ocv.GetResultVerificationState(); // 전체 검사 결과
int64_t i64ResultCount = ocv.GetResultCount(); // 추출한 문자 개수
std::vector<COCV::COCVVerificationCharacterInfo> vctOcvInfo; // 인식 문자들의 검사 결과를 저장하는 벡터
for(int64_t i = 0; i < i64ResultCount; i++)
{
COCV::COCVVerificationCharacterInfo ocvInfo; // 문자의 검사 결과를 담는 객체 선언
ocv.GetResultVerificationCharactersInfo(i, ocvInfo); // 인덱스마다 문자의 검사 결과 얻기
printf("Input Character: %s, Recognized Character: %s, %s\n", ocvInfo.GetRecognizedCharacter().GetBuffer(), ocvInfo.flsInputCharacter.GetBuffer(), ocvInfo.bCorrectCharacter ? "Correct" : "Wrong"); // 각각의 매칭 여부 출력
vctOcvInfo.push_back(ocvInfo); // 벡터에 저장
}
GetResultVerificationState()
- 전체 검사 결과를 반환합니다. 모든 문자가 Verified 일 경우에만 Verified 를 반환합니다.
GetResultCount()
- 검사한 문자의 개수를 얻습니다.
GetResultVerificationCharactersInfo()
- 입력한 인덱스의 문자 검사 결과를 얻습니다.
모든 인식 문자가 입력 문자가 일치함을 확인할 수 있습니다. 만약 입력 문자와 일치하지 않는 다면 해당 문자에 대해 Fail 처리됩니다.
Verification Result 1 | Verification Result 2 |
---|---|
![]() |
![]() |
단순한 문자열 매칭이 아닌 정규표현식으로도 검사 가능합니다.
ocv.EnableRegularExpression(true); // 정규식으로 매칭
ocv.Execute(); // 검사 진행
Verification Result 3 |
---|
![]() |
3.3.2 검사 항목 세팅
각각의 Inspection Item(검사 항목) 에 대해 검사 여부를 설정할 수 있습니다.
CFLImage fliAnomaly;
CFLRect<double> flrROI2;
fliAnomaly.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/OCV/Menual_Anomaly.flif"); // Source 이미지 로드
flrROI2.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/OCV/Menual_ROI 2.fig"); // ROI 로드
ocv.SetSourceImage(fliAnomaly); // Source 이미지 입력
ocv.SetSourceROI(flrROI2); // ROI 입력
ocv.EnableRegularExpression(false); // 문자열 매칭
ocv.EnableAbsoluteLightingInspection(false); // 학습 데이터 기준 밝기 검사 여부 설정
ocv.EnableAbsoluteContrastInspection(false); // 학습 데이터 기준 대비 검사 여부 설정
ocv.EnableRelativeLightingInspection(true); // 주변 문자 기준 밝기 검사 여부 설정
ocv.EnableRelativeContrastInspection(true); // 주변 문자 기준 대비 검사 여부 설정
ocv.EnableScaleInspection(true); // 크기 검사 여부 설정
ocv.EnableRotationInspection(true); // 회전 검사 여부 설정
ocv.EnableBlankSpaceWidthInspection(true); // 인접한 문자와의 공백 길이 검사 여부 설정
ocv.SetSigma(3.0); // Sigma 값 설정
ocv.Execute(); // 검사 진행
EnableAbsoluteLightingInspection()
- 해당 항목에 체크할 경우 학습 데이터와 비교하여 문자와 그 주변 배경의 전체적인 밝기 유사성을 검사합니다.
EnableAbsoluteContrastInspection()
- 해당 항목에 체크할 경우 학습 데이터와 비교하여 문자와 그 주변 배경의 대비(밝기 차이) 유사성을 검사합니다.
EnableRelativeLightingInspection()
- 해당 항목에 체크할 경우 정렬된 주변 문자와 비교하여 문자와 그 주변 배경의 전체적인 밝기에 대한 이상치를 검사합니다.
EnableRelativeContrastInspection()
- 해당 항목에 체크할 경우 정렬된 주변 문자와 비교하여 문자와 그 주변 배경의 대비(밝기 차이)에 대한 이상치를 검사합니다.
EnableScaleInspection()
- 해당 항목에 체크할 경우 정렬된 주변 문자와 비교하여 문자의 크기에 대한 이상치를 검사합니다.
EnableRotationInspection()
- 해당 항목에 체크할 경우 정렬된 주변 문자와 비교하여 문자의 회전 각도에 대한 이상치를 검사합니다.
EnableBlankSpaceWidthInspection()
- 해당 항목에 체크할 경우 인접한 문자와의 공백 길이에 대한 이상치를 검사합니다.
SetSigma()
- 이상치 판별 시 적용되는 가중치를 설정합니다. 입력값이 낮을수록 더 엄격하게 검사합니다.
eVerificationResult = ocv.GetResultVerificationState(); // 전체 검사 결과
i64ResultCount = ocv.GetResultCount(); // 추출한 문자 개수
vctOcvInfo.clear(); // 결과 벡터 Claer
for(int64_t i = 0; i < i64ResultCount; i++)
{
COCV::COCVVerificationCharacterInfo ocvInfo; // 문자의 검사 결과를 담는 객체 선언
ocv.GetResultVerificationCharactersInfo(i, ocvInfo); // 인덱스마다 문자의 검사 결과 얻기
printf("Recognized Character: %s, Relative Contrast: %s, Scale: %s, Rotation: %s\n", ocvInfo.GetRecognizedCharacter().GetBuffer(), ocvInfo.eRelativeContrastState == 1 ? "Verified" : "Fail", ocvInfo.eScaleState == 1 ? "Verified" : "Fail", ocvInfo.eRotationState == 1 ? "Verified" : "Fail"); // 각각의 검사 결과 출력
vctOcvInfo.push_back(ocvInfo); // 벡터에 저장
}
Source | Verification Result | Verification Result |
---|---|---|
![]() |
![]() |
![]() |
각각의 검사 항목에 대해 이상치를 가지는 문자가 검출됨을 확인할 수 있습니다.
3.3.3 Quility 검사
인식된 문자의 모양에 대한 정밀한 에러를 측정할 수 있습니다. Intrusion 또는 Extrusion 의 비율로 Quility 지표를 계산합니다.
CFLImage fliA;
fliA.Load(L"C:/Users/Public/Documents/FLImaging/ExampleImages/OCV/A_Demaged3.flif"); // Source 이미지 로드
ocv.SetSourceImage(fliA); // Source 이미지 입력
ocv.SetSourceROI(nullptr); // ROI 없음
ocv.EnableIntrusionInspection(true); // Intrusion 검사 여부 설정
ocv.EnableExtrusionInspection(true); // Extrusion 검사 여부 설정
ocv.SetMinimumQualityErrorHeight(12.); // Intrusion 또는 Extrusion 을 충족하는 최소 높이 설정
ocv.SetMinimumQualityErrorIter(12.); // Intrusion 또는 Extrusion 을 충족하는 최소 반복 횟수 설정
ocv.SetMinimumQuality(0.8); // 최소 Quality 점수 설정
ocv.Execute(); // 검사 진행
eVerificationResult = ocv.GetResultVerificationState(); // 전체 검사 결과
COCV::COCVVerificationCharacterInfo ocvInfo; // 문자의 검사 결과를 담는 객체 선언
ocv.GetResultVerificationCharactersInfo(0, ocvInfo); // 0번 인덱스 문자의 검사 결과 얻기
CFLFigureArray flfaIntrusion = ocvInfo.flfaIntrusion; // Intrusion
CFLFigureArray flfaExtrusion = ocvInfo.flfaExtrusion; // Extrusion
printf("Quality: %lf", ocvInfo.f64Quality); // Quality 점수 출력