오토핫키로 OCR(문자 인식)을 활용하는 방법!

Posted by 발전소장
2014. 8. 15. 20:11 Functions

오늘 소개해드릴 사용자 함수는 OCR.ahk 입니다.


OCR은 광학 문자 인식(Optical character recognition; OCR)의 준말로

사람이 쓰거나 기계로 인쇄한 문자의 영상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 것이다. by 위키


오토핫키로 자동화 작업을 하면서 어느 부분에서 OCR 기능이 필요할때가 있습니다.


그럴때 이걸 응용하면 됩니다.


먼저 설명하기전에 주의점을 알려드리겠습니다.


한글은 인식을 못 합니다.

gocr.exe 라는 오픈소스 프로그램을 이용하는데 한글은 지원하지 않습니다.

숫자, 영문, 일문 등을 지원합니다.


문자의 크기와 폰트, 배경에 따라 인식률의 차이가 발생합니다.

아무래도 특정패턴으로 문자를 인식하기에 크기가 클수록, 폰트나 필체가 단정하고 깔끔할수록, 배경이 되도록 단순할수록 인식률이 좋습니다.

인식하고자 하는 문자만 정확히 인식영역에 들어오도록 크기를 지정하는게 중요합니다.


인식영역이 넓을수록 처리속도는 늦어집니다.

설명이 필요없겠죠.


해당 ahk의 출처는

http://www.autohotkey.com/board/topic/69127-ocrahk-library-for-recognizing-text-in-images/


스크립트와 예제를 첨부합니다.




압축파일 구조입니다.




알파벳 순서로 설명하겠습니다.



 dpjeg.exe

 djpeg.exe jpg파일을 pnm으로 변환하는 실행파일입니다. (pnm파일은 gocr.exe이 인식)

 Gdip.ahk

 Gdip.dll을 ahk로 활용해주는 ahk 스크립트 (화면을 캡쳐해서 jpg파일로 저장하는데 사용)

 gocr.exe

 gocr.exe pnm파일(이미지)을 인식하여 문자로 반환합니다.

 OCR.ahk

 OCR 기능을 처리하는 ahk 스크립트

 OCR-example.ahk

 OCR 기능 활용 예제

 OCR-preview.ahk

 OCR 기능 활용 미리보기로 직관적으로 이해할 수 있는 예제

 OCR-tests.ahk

 OCR 예제이지만 이해불가?


일단 OCR-preview.ahk 를 실행해보세요.


핑크색 영역안의 문자를 인식해서 툴팁에 표시해줍니다.




이런식으로 나오죠.

직관적으로 바로 이해가 됩니다.


widthToScan=200
heightToScan=50


스크립트 내용에 있는 변수 설정에서 widthToScan, heightToScan이 말 그대로 스캔할 영역의 넓이와 높이를 픽셀 단위로 지정하는 겁니다.

넓이 200, 높이 50 픽셀이라는 말이죠.


스크립트가 돌아가는 구조를 설명하자면


마우스 위치를 기준으로 가로 200, 세로 50 픽셀의 영역을 Gdip.dll을 이용하여 캡쳐한 후 jpg로 저장합니다. ( Gdip.ahk 활용 )


저장된 jpg를 pnm 파일로 변환합니다. ( djpeg.exe 활용 )


pnm 파일을 gocr.exe로 읽어들여 문자를 txt 파일로 저장합니다. ( gocr.exe 활용 )


저장된 txt 파일을 오토핫키 FileRead로 읽어들이고 표시합니다.


간단하죠.


특정 영역을 주기적으로(Loop 활용)


GetOCR(topLeftX, topLeftY, widthToScan, heightToScan, options)


를 이용해서 문자를 입력받습니다.


topLeftX는 말그대로 왼쪽상단 좌표를 말합니다.

X,Y 좌표와 넓이 높이를 입력받아 스캔 영역을 지정합니다.

option은 입력 안 할수있고(default)

Debug 모드

Numeric 모드로 숫자만 인식합니다.


사실 OCR로 입력받은 값을 바로 사용하기는 힘듭니다.

배경과 기타 잡스러운 문자도 출력되기때문이죠. (예를 들면 , . _ ; : 이런식)


따라서 regExReplace()로 필요없는 문자를 걸러주는 작업이 필요하죠.


outputText:=RegExReplace(inputText,"\D","") ; inputText 내용 중에 숫자가 아닌(\D)것을 제거("") 합니다.



덧붙이자면 앞서 말한바와 같이

Gdip.ahk와 OCR.ahk, gocr.exe, djpeg.exe (ahk는 #include 이용, exe는 FileInstall 이용)

파일들이 필요합니다.


자신의 스크립트에 OCR을 적용시켜 보세요!