代码之家  ›  专栏  ›  技术社区  ›  Kirschstein

.NET OCRING图像

  •  8
  • Kirschstein  · 技术社区  · 16 年前

    我正在尝试使用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整个屏幕截图,只是它的一部分。我尝试像这样以编程方式剪切图像:

        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可以处理原始位图,但不能处理从中获取的较小版本?

    7 回复  |  直到 8 年前
        1
  •  7
  •   Rhys Parry    16 年前

    看来答案是给莫迪一块更大的画布。我还试图截取一个控件的屏幕截图并对其进行OCR处理,结果遇到了同样的问题。最后,我取了控件的图像,将图像复制到一个较大的位图中,并对较大的位图进行了OCR处理。

    我发现的另一个问题是,您的图像文件必须具有适当的扩展名。换言之,.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;
    }
    

    我不确定最小尺寸是多少,但看起来好像1024x 768能做到这一点。

        2
  •  3
  •   chris    15 年前

    是的,这个线程中的帖子帮助我让它工作,这里我要补充的是:

    正在尝试下载图像(小图像),然后是OCR…

    -当处理图像时,似乎一年的大小必须是2的力量! (能够OCR图像:512x512、128x128、256x64..其他尺寸大多失效(如1103x334)

    • 透明的背景也制造了麻烦。我在创建一个新的tif时得到了最好的结果,它带有powerof2边界、白色背景、将下载的图像粘贴到其中、保存。

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

    • 最后我还使用了:doc.ocr(modi.milanguages.milang_english,false,false);

    • 使用Office2003中的modi

    问候语

    沃德

        3
  •  1
  •   sitju    16 年前

    modi ocr仅与我一起使用tif。 尝试在“tif”中保存图像。

    对不起,我的英语不好

        4
  •  1
  •   Cosmin    14 年前
    doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
    

    这意味着我不想让它检测到方向,也不想修正任何歪斜。现在,该命令在所有图像上都可以正常工作,包括2400x2496 tiff。

    但图像应该在.tif中。

    希望这能帮助那些面临同样问题的人。

        5
  •  0
  •   Sireesh Jindal    16 年前

    我对一些图片也有同样的问题“OCR运行问题”。我重新缩放了图像(在我的例子中是50%),也就是说,缩小了它的尺寸,瞧!它起作用了!

        6
  •  0
  •   animuson    14 年前

    我在使用

    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
  •  0
  •   andycted    11 年前

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

    我也用过: ocr医生(modi.milanguages.milang_英语,假,假);

    推荐文章