문제

MODI를 사용하여 창 프로그램을 OCR하려고 합니다.다음과 같이 win32 interop을 사용하여 프로그래밍 방식으로 캡처한 스크린샷에는 잘 작동합니다.

public string SaveScreenShotToFile()
{
    RECT rc;
    GetWindowRect(_hWnd, out rc);

    int width = rc.right - rc.left;
    int height = rc.bottom - rc.top;

    Bitmap bmp = new Bitmap(width, height);
    Graphics gfxBmp = Graphics.FromImage(bmp);
    IntPtr hdcBitmap = gfxBmp.GetHdc();

    PrintWindow(_hWnd, hdcBitmap, 0);

    gfxBmp.ReleaseHdc(hdcBitmap);
    gfxBmp.Dispose();

    string fileName = @"c:\temp\screenshots\" + Guid.NewGuid().ToString() + ".bmp";
    bmp.Save(fileName);
    return fileName;
}

그런 다음 이 이미지는 파일에 저장되고 다음과 같이 MODI를 통해 실행됩니다.

    private string GetTextFromImage(string fileName)
    {

        MODI.Document doc = new MODI.DocumentClass();
        doc.Create(fileName);
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        MODI.Image img = (MODI.Image)doc.Images[0];
        MODI.Layout layout = img.Layout;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < layout.Words.Count; i++)
        {
            MODI.Word word = (MODI.Word)layout.Words[i];
            sb.Append(word.Text);
            sb.Append(" ");
        }

        if (sb.Length > 1)
            sb.Length--;

        return sb.ToString();
    }

이 부분은 잘 작동하지만 전체 스크린샷을 OCR하는 것이 아니라 일부만 OCR하고 싶습니다.다음과 같이 프로그래밍 방식으로 이미지를 자르려고 합니다.

    private string SaveToCroppedImage(Bitmap original)
    {
        Bitmap result = original.Clone(new Rectangle(0, 0, 250, 250), original.PixelFormat);
        var fileName = "c:\\" + Guid.NewGuid().ToString() + ".bmp";
        result.Save(fileName, original.RawFormat);

        return fileName;
    }

그런 다음 이 작은 이미지를 OCR하면 MODI에서 예외가 발생합니다.'OCR 실행 오류', 오류 코드는 -959967087입니다.

MODI가 원본 비트맵을 처리할 수 있지만 여기서 가져온 더 작은 버전은 처리할 수 없는 이유는 무엇입니까?

도움이 되었습니까?

해결책

대답은 Modi에게 더 큰 캔버스를주는 것처럼 보입니다. 나는 또한 컨트롤의 스크린 샷을 찍고 OCR을 사용하여 같은 문제에 부딪 쳤다. 결국 나는 컨트롤의 이미지를 가져 와서 이미지를 더 큰 비트 맵으로 복사하고 더 큰 비트 맵을 OCRed했습니다.

내가 찾은 또 다른 문제는 이미지 파일에 적절한 확장자가 있어야한다는 것입니다. 다시 말해, .tmp는 그것을 자르지 않습니다.

나는 OCR 방법 내부에서 더 큰 소스를 만드는 작업을 계속 유지했습니다.

public static string ExtractText(this Image image)
{
    var tmpFile = Path.GetTempFileName();
    string text;
    try
    {
        var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
        var gfxResize = Graphics.FromImage(bmp);
        gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
        bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
        var doc = new MODI.Document();
        doc.Create(tmpFile + ".bmp");
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        var img = (MODI.Image)doc.Images[0];
        var layout = img.Layout;
        text = layout.Text;
    }
    finally
    {
        File.Delete(tmpFile);
        File.Delete(tmpFile + ".bmp");
    }

    return text;
}

최소 크기가 무엇인지 정확히 잘 모르겠지만 1024 x 768이 트릭을 수행하는 것처럼 보입니다.

다른 팁

예, 이 스레드의 게시물이 작동하는 데 도움이 되었습니다. 여기에 추가해야 할 내용은 다음과 같습니다.

이미지(작은 이미지)를 다운로드한 다음 OCR을 다운로드하려고 했습니다.

-이미지를 처리할 때 크기는 2의 거듭제곱이어야 하는 것 같습니다!(이미지를 OCR할 수 있었습니다:512x512, 128x128, 256x64 ..다른 크기는 대부분 실패했습니다(예: 1103x334))

  • 투명한 배경도 문제를 일으켰습니다.powerof2 경계, 흰색 배경을 사용하여 새 tif를 만들고 다운로드한 이미지를 붙여넣고 저장하면 최상의 결과를 얻었습니다.

  • 특히 "ü"와 같은 "독일어" 문자의 경우 OCR에서 잘못된 결과가 나오기 때문에 이미지 크기 조정이 성공하지 못했습니다.

  • 결국 나는 또한 다음을 사용했습니다.doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, 거짓, 거짓);

  • Office 2003의 Modi 사용

인사말

웜드

Modi OCR은 나와 함께 일하고 있습니다. "TIF"에서 이미지를 저장하십시오.

내 나쁜 영어 미안 해요

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

즉, 방향을 감지하고 왜곡을 고치지 않기를 원합니다. 이제 명령은 2400x2496 TIFF를 포함한 모든 이미지에서 잘 작동합니다.

그러나 이미지는 .tif에 있어야합니다.

이것이 사람들이 같은 문제에 직면하는 데 도움이되기를 바랍니다.

일부 이미지와 같은 "OCR 실행 문제"와 같은 문제가있었습니다. 나는 이미지를 다시 스케일했다 (내 경우 50%), 즉 크기와 짜잔을 줄였다! 효과가있다!

사용하는 동안 같은 문제가있었습니다

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

2400x2496 인 TIFF 파일에서. 그것을 50%(크기를 줄이면)로 크기를 조정하고 문제가 해결 되었고이 방법은 더 이상 예외를 던지지 않았지만 "712517"대신 "참조"또는 "712017"대신 "Relerence"를 감지하는 것과 같은 텍스트를 잘못 인식했습니다. . 다른 이미지 크기를 계속 시도했지만 명령을 변경할 때까지 모두 같은 문제가있었습니다.

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

그것은 내가 방향을 감지하고 왜곡을 고치지 않기를 원하지 않았다는 것을 의미했습니다. 이제 명령은 2400x2496 TIFF를 포함한 모든 이미지에서 잘 작동합니다.

이것이 사람들이 같은 문제에 직면하는 데 도움이되기를 바랍니다

내 상황을 해결 한 것은 사진 편집기 (Paint.net)를 사용하고 최대의 선명한 효과를 사용하는 것이 었습니다.

나는 또한 사용했다 : doc.ocr (modi.milanguages.milang_english, false, false);

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top