.NET OCRing影像(.NET OCRing an Image)

2019-07-30 05:49发布

我试图使用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;
    }

然后OCRing这个更小的图像,然而MODI抛出异常; “OCR运行错误”,错误代码是-959967087。

MODI为什么能处理原始位图,但是从它不采取较小的版本?

Answer 1:

看起来好像答案是在给MODI一个更大的画布。 我也试图采取控制和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;
}

我不知道的最小尺寸是什么,但它看起来好像1024×768的伎俩。



Answer 2:

是的,在这个线程的职位帮助我刚开它,在这里工作,我有什么补充:

试图下载图像(小的),然后OCR ...

- 当处理图像,似乎theyr大小必须是2的幂! (能够OCR图片:512×512,128×128,256×64 ..其他尺寸大多失败(如1103x334))

  • 透明的背景也取得了麻烦。 创建具有powerof2边界,白色背景的新TIF,当我得到了最好的结果,粘贴图像下载到它,保存。

  • 缩放图像并没有为我出头,因为OCR越来越错误的结果,特别是对于像“ü”,“德”字

  • 在最后,我也使用:doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH,FALSE,FALSE);

  • 使用MODI从Office 2003

问候

womd



Answer 3:

该MODI OCR是TIF和我唯一的工作。 尝试保存图像“TIF”。

对不起,我的英语不好



Answer 4:

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

这意味着,我不希望它来检测取向,而不是修复任何倾斜。 现在命令对包括2400x2496 TIFF所有图像精细。

但是,图像应在的.tif。

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



Answer 5:

我有“OCR运行问题”同样的问题对某些图像。 (50%在我的情况)我重新缩放图像,即缩小其尺寸,瞧! 有用!



Answer 6:

我有同样的问题,同时使用

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

对TIFF文件,这是2400x2496。 然而,调整至50%(减小尺寸)固定的问题,并且该方法没有被抛出异常了,它被错误地识别文本等检测“relerence”而不是“参考”或“712017”来取代“712517” 。 我一直在尝试不同的图像大小,但他们都有同样的问题,直到我改变了命令

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

这意味着,我不希望它来检测取向,而不是修复任何倾斜。 现在命令对包括2400x2496 TIFF所有图像精细。

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



Answer 7:

使用照片编辑器(Paint.NET),并使用最大的锐化效果怎样解决我的情况了。

我还用:doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH,假的,假的);



文章来源: .NET OCRing an Image
标签: c# .net ocr modi