NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (숫자 문자 판독 OCR 이미지 매크로 1부)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘은 완전히 새로운걸 만들어 볼텐데요. 기존에 이미지 인식이 아니라 이미지 안에 문자 또는 숫자를 텍스트로 추출하는 방법입니다. 이런 기술을 OCR(Optical Character Recognition: 광학 문자 인식)이라고 부릅니다.

     

    광학 문자 인식(OCR)은 텍스트 이미지를 기계가 읽을 수 있는 텍스트 포맷으로 변환하는 과정입니다. 예를 들어 양식 또는 영수증을 스캔하는 경우 컴퓨터는 스캔본을 이미지 파일로 저장합니다. 이미지 파일에서는 텍스트 편집기를 사용하여 단어를 편집, 검색하거나 단어 수를 계산할 수 없습니다. 그러나 OCR을 사용하면 이미지를 텍스트 문서로 변환하여 내용을 텍스트 데이터로 저장할 수 있습니다.

     

    OCR 모델을 하나 만들어줍니다. 참고로, 이전 에디터에서는 조건 카테고리에 OCR 체크라는 이름으로 존재했었습니다. 신 버전에서는 함수쪽에 OCR 기능을 추가했는데요. OCR 기능과 문자 또는 숫자 체크를 하나로 합쳐서 사용하다보니 불필요하게 속성들이 많아지고 복잡도가 상승하는 문제가 있었습니다. 그래서, 이번에는 함수 영역에 추가하고 변수를 이용해서 문자 체크나 숫자 체크로 조건을 사용하도록 변경했습니다.

    public class OcrModel : BaseModel, ISearchArea

     

    이미지에서 추출한 텍스트를 저장할 속성을 하나 추가해줍니다.

    [LocalizedCategory("Data")]
    [LocalizedDisplayName("Result")]
    [LocalizedDescription("Result")]
    [Browsable(true)]
    [DefaultValue(null)]
    public string? Result { get; set; }

     

    윈도우 화면에서 이미지로 캡쳐할 영역을 설정해야 합니다. 해당 영역을 실시간으로 이미지로 변환하고, 이 이미지를 이용해서 OCR 처리를 해줍니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("OcrArea")]
    [LocalizedDescription("OcrArea")]
    [Browsable(true)]
    [DefaultValue(typeof(Rectangle), "0,0,0,0")]
    [Editor(typeof(TypeEditor.AreaCaptureEditor), typeof(System.Drawing.Design.UITypeEditor))]
    public Rectangle SearchArea { get; set; }

     

    OCR은 다양한 서비스들이 존재합니다. 하지만, 테서랙트(Tesseract)를 제외하면 전부 유료라고 봐도 무방할정도로 무료 서비스를 찾기가 어렵습니다. 대부분 테서랙트를 배이스로 하고 있는데요. 유료 서비스들은 추가적인 학습 및 로직 개선을 통해서 좀 더 다양한 환경에 적응할 수 있는 기술들이 포함되어 있습니다. 테서랙트도 추가 학습이 가능하긴 하지만, 개발자가 아니라면 다소 어려운 부분들이 존재합니다.

     

    테서랙트가 아닌 경우에는 다중언어와 위치 정보를 제공하는게 거의 기본 기능입니다. 하지만, 테서랙트는 위치 정보는 알기가 어렵습니다. 하지만, 다중 언어는 설정이 가능합니다. 아래와 같이 분석에 사용할 언어들을 목록으로 넘겨주도록 리스트를 하나 만듭니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("Language")]
    [LocalizedDescription("Language")]
    [Browsable(true)]
    [DefaultValue(typeof(Definition.Language), "English")]
    public List<Definition.Language> Language { get; set; } = new List<Definition.Language>();

     

    언어 목록은 아래와 같이 설정되어 있습니다.

    public enum Language
    {
        None = 0,
        Korean = 1,
        English = 2,
        Chinese = 3,
        Japanese = 4,
        Filipino = 5,
        Indian = 6,
        Hindi = 7,
        Malay = 8,
        Indonesian = 9,
        Thai = 10,
        Vietnamese = 11,
        Spanish = 12,
        French = 13,
        German = 14,
        Russian = 15,
        Italian = 16,
        Polish = 17,
        Norweigian = 18,
        Turkish = 19,
        Persian = 20
    }

     

    언어를 분석할 모델이 필요한데요. 사용하지도 않을 언어들을 모두 제품에 추가하는건 비효율적입니다. 기존 엔지엠 매크로 에디터의 용량이 커지는 이유도 이런 문제 때문이었습니다. 제품은 최대한 가볍게 가져가고, 외부 라이브러리를 사용하는 것들은 사용자가 직접 특정 폴더에 저장해두고, 사용하도록 하는게 좋습니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("TessDataDirectory")]
    [LocalizedDescription("TessDataDirectory")]
    [Browsable(true)]
    [DefaultValue(null)]
    [Editor(typeof(TypeEditor.FolderSelectorEditor), typeof(UITypeEditor))]
    public string? TessDataDirectory { get; set; }

     

    기본 언어 데이타모델은 아래 링크에서 다운로드 받을 수 있습니다. 

    [ Default Tesseract Language Model Download ]

     

    Best 모델은 아래 링크에서 다운로드 받을 수 있습니다.

    [ Best Tesseract Language Model Download ]

     

    Fast 모델은 아래 링크에서 다운로드 받을 수 있습니다.

    [ Fast Tesseract Language Model Download ]

     

    테서랙트에서 사용할 수 있는 모델 종류가 3가지인데요. 사실 환경에 많은 영향을 받기 때문에 Best나 Fast나 크게 다른점은 없어 보입니다. 다만, 텍스트나 숫자 모양, 크기, 방향등등... 여러가지 환경적인 요인으로 3개중에 잘 되는 모델이 있고, 안되는 모델이 있기도 합니다. 다양하게 테스트 해보면서 자신에게 맞는 모델을 선택해야 합니다.

     

    이제 이미지로부터 문자를 분석하는 방법을 알아볼텐데요. OCR 관련해서 테서랙트뿐만 아니라 구글 또는 기타 다른 유료 제품들의 인터페이스도 추가 개발할 예정이기 때문에 Ai 최상위 모듈에 OcrManager를 만들고, 그 안에서 테서랙트 메소드를 만들었습니다.

    namespace Ai.Api.OcrManager
    {
        public class OcrTesseract

     

    테서랙트 전용 클래스에 ImageToText 메소드를 만들었습니다.

    public static string ImageToText(
        Image image, List<Definition.Language> locale, 
        string tessDataDirectory, 
        Definition.TesseractEngine engineMode = Definition.TesseractEngine.Default, 
        Definition.PageSegMode psm = Definition.PageSegMode.SingleBlock, 
        bool isNumber = false, 
        string[]? parameterName = null, 
        string[]? parameterValue = null)

     

    이외에도 이미지 전처리, 파인 튜닝등과 같은 것들도 추가할 예정인데요. 이 부분들은 아직 더 공부해야 해서 지금은 만들지 못했습니다. 충분히 공부해서 테스트를 해본 후 디자인을 거쳐서 기능을 추가해야 할거 같습니다. 아무튼, OCR 인스턴스를 생성한 후 이미지를 비교하도록 했습니다.

    var ocr = new Tesseract.TesseractEngine(tessDataDirectory, lang, mode);

     

    이미지에서 텍스트를 추출해줍니다.

    result = ocr.Process(Tesseract.Pix.LoadFromMemory(Api.ApiHelper.ImageToByteArray(image, System.Drawing.Imaging.ImageFormat.Png)),
        (Tesseract.PageSegMode)Enum.Parse(typeof(Tesseract.PageSegMode), psm.ToString())).GetText()?.Trim();

     

    OCR 모델에서는 아래와 같이 결과 값을 받아서 화면에 보여줍니다.

    Result = Ai.Api.OcrManager.OcrTesseract.ImageToText(image, Language, TessDataDirectory, EngineMode, PageSegMode);

     

    완성된 코드를 테스트하기에 앞서 언어 모델을 다운로드 받아줘야 합니다. 저는 바탕화면에 일단 만들었습니다.

    WvdYqHO.png

     

     

    한국어만 다운로드 받았기 때문에 현재는 한국어만 분석이 가능합니다. 아래와 같이 폴더를 선택했습니다.

    4Qj9T22.png

     

     

    분석용 언어를 선택 해줍니다.

    pySy7ZG.png

     

     

    감지 영역을 선택하고, 실행 해볼까요?

     

     

    OCR 텍스트 인식 기능을 간단하게 만들어보고, 테스트를 해봤는데요. 테서랙트에 추가 옵션이나 이미지 전처리 및 파인튜닝과 같은 다양한 기술들을 포함할 수 있습니다. 기본 기능은 검증이 되었으니 기능을 확장하는건 천처닣 알아보면 될듯 합니다. 일단은 엔지엠 6 버전에서 제공하던것들이라도 먼저 추가해놔야겠네요^^

     

    다음에는 수식 관련 기능을 좀 더 추가해야 할거 같아요.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.