【问题标题】:.NET OCRing an Image.NET OCR 处理图像
【发布时间】:2010-11-10 22:57:00
【问题描述】:

我正在尝试使用 MODI 对窗口程序进行 OCR。它适用于我使用 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;
    }

然后对这个较小的图像进行 OCR,但是 MODI 会抛出异常; 'OCR运行错误',错误代码为-959967087。

为什么 MODI 可以处理原始位图,但不能处理从中提取的较小版本?

【问题讨论】:

    标签: c# .net ocr modi


    【解决方案1】:

    似乎答案是给 MODI 一个更大的画布。我还试图截取控件的屏幕截图并对其进行 OCR,但遇到了同样的问题。最后我拿了控件的图像,将图像复制到一个更大的位图中,然后对更大的位图进行 OCRed 处理。

    我发现的另一个问题是您的图像文件必须具有适当的扩展名。换句话说,.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 可以解决问题。

    【讨论】:

      【解决方案2】:

      是的,这个帖子中的帖子帮助我开始工作,这里我要补充的是:

      正在尝试下载图像(小图像)然后 ocr...

      -在处理图像时,它们的大小似乎必须是 2 的幂! (能够对图像进行 ocr:512x512、128x128、256x64 .. 其他尺寸大多失败(如 1103x334))

      • 透明背景也有问题。我在创建具有 powerof2 边界、白色背景的新 tif 时得到了最好的结果,将下载的图像粘贴到其中,保存。

      • 缩放图像对我来说没有成功,因为 OCR 得到了错误的结果,特别是对于像“ü”这样的“德语”字符

      • 最后我也用了:doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

      • 在 office 2003 中使用 modi

      问候

      老天

      【讨论】:

        【解决方案3】:

        modi ocr 仅适用于我的 tif。 尝试将图像保存在“tif”中。

        对不起我的英语不好

        【讨论】:

          【解决方案4】:
          doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
          

          这意味着我不希望它检测方向并且不修复任何倾斜。现在该命令适用于所有图像,包括 2400x2496 tiff。

          但图片应该在 .tif 中。

          希望这可以帮助面临同样问题的人。

          【讨论】:

            【解决方案5】:

            我遇到了与某些图像相同的“OCR 运行问题”问题。我重新缩放了图像(在我的例子中是 50%),即减小了它的大小,瞧!它有效!

            【讨论】:

              【解决方案6】:

              我在使用时遇到了同样的问题

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

              在 2400x2496 的 tiff 文件上。将其调整为 50%(减小大小)解决了问题并且该方法不再抛出异常,但是,它错误地识别文本,例如检测“relerence”而不是“reference”或“712017”而不是“712517” .我一直在尝试不同的图像尺寸,但它们都有相同的问题,直到我将命令更改为

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

              这意味着我不希望它检测方向并且不修复任何倾斜。现在该命令适用于所有图像,包括 2400x2496 tiff。

              希望这可以帮助面临同样问题的人

              【讨论】:

                【解决方案7】:

                解决我的问题的方法是使用照片编辑器 (Paint.NET) 并最大限度地使用锐化效果。

                我也用过: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

                【讨论】:

                  猜你喜欢
                  • 2015-09-07
                  • 2016-03-10
                  • 2010-11-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-01-12
                  • 2014-10-07
                  • 2018-09-22
                  • 2011-05-10
                  相关资源
                  最近更新 更多