C# .NET对图像进行光学字符识别
我正在尝试使用MODI对窗口的程序进行OCR。它适用于我使用win32 interop以编程方式获取的屏幕截图,如下所示: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
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
希望这能帮助人们解决同样的问题。解决我的问题的方法是使用照片编辑器(Paint.NET)并最大限度地使用锐化效果 我还使用了: 文档OCR(MODI.MiLANGUAGES.miLANG_英语,false,false)