.NET OCRing图像

我正在尝试使用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  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抛出exception; ‘OCR运行错误’,错误代码为-959967087。

为什么MOD​​I可以处理原始位图而不是从它获取的较小版本?

看起来好像答案是给MODI一个更大的canvas。 我还试图截取控件的屏幕截图并对其进行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就可以了。

是的,这个post中的post帮助我开始工作,这里我要添加:

试图下载图像(小的)然后ocr …

– 处理图像时,它们的大小似乎必须是2的幂! (能够ocr图像:512×512,128×128,256×64 ..其他尺寸大多失败(如1103×334))

  • 透明的背景也造成了麻烦。 在使用powerof2边界,白色背景创建新的tif时,我获得了最佳效果,将下载的图像粘贴到其中,保存。

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

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

  • 使用办公室2003年的modi

问候

womd

modi ocr和我一起工作。 尝试在“tif”中保存图像。

抱歉,我的英文不好

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

这意味着我不希望它检测到方向而不是修复任何偏斜。 现在该命令适用于所有图像,包括2400×2496 tiff。

但图像应该是.tif。

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

我有一些问题“OCR运行问题”和一些图像。 我重新缩放了图像(在我的情况下缩小了50%),即缩小了尺寸和瞧! 有用!

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

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

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

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

这意味着我不希望它检测到方向而不是修复任何偏斜。 现在该命令适用于所有图像,包括2400×2496 tiff。

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

什么解决了我的情况是使用照片编辑器(Paint.NET)并最大限度地使用锐化效果。

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