Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET对图像进行光学字符识别_C#_.net_Ocr_Modi - Fatal编程技术网

C# .NET对图像进行光学字符识别

C# .NET对图像进行光学字符识别,c#,.net,ocr,modi,C#,.net,Ocr,Modi,我正在尝试使用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

我正在尝试使用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;
}
    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();
    }
    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;
    }
然后将该图像保存到文件中,并通过MODI运行,如下所示:

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;
}
    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();
    }
    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运行错误',错误代码为-959967087


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

MODI ocr仅在tif中与我一起工作。 尝试用“tif”保存图像


对不起,我的英语不好

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

我发现的另一个问题是,您的图像文件必须具有适当的扩展名。换句话说,.tmp并没有削减它

我一直在我的OCR方法中创建一个更大的源,看起来像这样(我直接处理图像对象):


我不确定最小尺寸到底是多少,但似乎1024 x 768就可以做到这一点。

我在一些图像上遇到了同样的问题“OCR运行问题”。我重新缩放了图像(在我的例子中是50%),即缩小了它的大小,瞧!它起作用了

我在使用

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


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

是的,这篇帖子中的帖子帮助我让它发挥作用,这里我要补充的是:

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

-在处理图像时,看起来它们的大小必须是2的幂! (能够识别ocr图像:512x512、128x128、256x64..其他尺寸的图像大多无法识别(如1103x334))

  • 透明的背景也带来了麻烦。我得到了最好的结果,当创建一个新的tif与权力2边界,白色背景,粘贴下载的图像到它,保存

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

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

  • 使用Office2003中的modi

问候

子宫

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

但图像应该在.tif中


希望这能帮助人们解决同样的问题。

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

我还使用了: 文档OCR(MODI.MiLANGUAGES.miLANG_英语,false,false)