.NET распознавание изображения - PullRequest
8 голосов
/ 15 июля 2009

Я пытаюсь использовать MODI для распознавания программы окна. Он отлично работает для скриншотов, которые я получаю программно с помощью win32 взаимодействия, например:

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 весь скриншот, а только его части. Я пытаюсь обрезать изображение программно следующим образом:

    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;
    }

и затем OCRing это меньшее изображение, однако MODI выдает исключение; «Ошибка выполнения OCR», код ошибки -959967087.

Почему MODI может обрабатывать исходное растровое изображение, но не меньшую версию, взятую из него?

Ответы [ 7 ]

7 голосов
/ 07 сентября 2009

Похоже, что ответ заключается в том, чтобы дать MODI больший холст. Я также пытался сделать скриншот элемента управления и OCR его и столкнулся с той же проблемой. В конце я взял изображение элемента управления, скопировал изображение в увеличенное изображение и распечатал изображение большего размера.

Другая проблема, которую я обнаружил, заключалась в том, что у вас должно быть правильное расширение для вашего файла изображения. Другими словами, .tmp не обрезает это.

Я продолжил работу по созданию большего источника внутри моего метода OCR, который выглядит примерно так (я имею дело непосредственно с объектами Image):

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 добиваются цели.

3 голосов
/ 20 августа 2010

да, посты в этой теме помогли мне заставить его работать, вот что я должен добавить:

пытался загрузить изображения (маленькие), а затем ocr ...

- при обработке изображений кажется, что их размер должен быть степенью 2! (был в состоянии ocr изображения: 512x512, 128x128, 256x64 .. другие размеры в основном не удалось (например, 1103x334))

  • прозрачный фон также создавал проблемы. Я получил лучшие результаты при создании нового tif с границей powerof2, белым фоном, вставил в него загруженный образ и сохранил.

  • масштабирование изображения для меня не увенчалось успехом, поскольку OCR дает неверные результаты, особенно для «немецких» символов, таких как «ü»

  • в конце я также использовал: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

  • с использованием моди из офиса 2003

привет

womd

1 голос
/ 06 апреля 2011
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

Это означает, что я не хочу, чтобы он определял ориентацию и не исправлял перекос. Теперь команда отлично работает на всех изображениях, включая tiff 2400x2496.

Но изображение должно быть в формате .tif.

Надеюсь, это поможет людям, сталкивающимся с той же проблемой.

1 голос
/ 09 августа 2009

режим ocr работает только со мной. попробуйте сохранить изображение в формате "tif".

извините, мой плохой английский

0 голосов
/ 12 февраля 2014

что решило мою ситуацию, так это использование фоторедактора (Paint.NET) и максимальный эффект повышения резкости.

Я также использовал: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

0 голосов
/ 06 апреля 2010

У меня была такая же проблема при использовании

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

в TIFF-файле размером 2400x2496. Уменьшение его до 50% (уменьшение размера) устранило проблему, и метод больше не выдавал исключение, однако он неправильно распознавал текст, например, обнаруживая «relerence» вместо «reference» или «712017» вместо «712517» , Я продолжал пробовать изображения разных размеров, но все они имели одну и ту же проблему, пока я не изменил команду на

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

что означало, что я не хочу, чтобы он определял ориентацию и не исправлял перекос. Теперь команда отлично работает на всех изображениях, включая tiff 2400x2496.

Надеюсь, это поможет людям, сталкивающимся с той же проблемой

0 голосов
/ 06 октября 2009

У меня была такая же проблема "проблема с распознаванием текста" с некоторыми изображениями. Я перемасштабировал изображение (в моем случае на 50%), то есть уменьшил его размер и вуаля! это работает!

...