.NET распознавание изображения
Вопрос
Я пытаюсь использовать MODI для распознавания оконной программы.Он отлично работает для снимков экрана, которые я получаю программно с помощью взаимодействия 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();
}
Эта часть работает нормально, однако я не хочу распознавать весь снимок экрана, а только его части.Я пытаюсь обрезать изображение программно следующим образом:
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 выдает исключение;«Ошибка выполнения OCR», код ошибки — -959967087.
Почему MODI может обрабатывать исходное растровое изображение, но не его уменьшенную версию?
Решение
Похоже, что ответ заключается в том, чтобы дать MODI более широкий простор.Я также пытался сделать снимок экрана элемента управления и распознать его, и столкнулся с той же проблемой.В конце концов я взял изображение элемента управления, скопировал его в растровое изображение большего размера и распознал растровое изображение большего размера.
Еще одна проблема, которую я обнаружил, заключалась в том, что у вашего файла изображения должно быть правильное расширение.Другими словами, .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 вполне подойдет.
Другие советы
да, сообщения в этой теме помогли мне заставить его работать, вот что я должен добавить:
пытался загрузить изображения (маленькие), потом окр...
-при обработке изображений создается впечатление, что их размер должен быть степенью 2!(смог распознать изображения:512х512, 128х128, 256х64..другие размеры в основном не удались (например, 1103x334))
прозрачный фон тоже создавал проблемы.Наилучшие результаты я получил при создании нового tif с границей powerof2 и белым фоном, вставке в него загруженного изображения и сохранении.
масштабирование изображения мне не удалось, так как OCR дает неправильные результаты, особенно для «немецких» символов, таких как «ü».
в конце я также использовал:doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
использую моди из офиса 2003
привет
мир
у меня modi ocr работает только в формате tif.попробуйте сохранить изображение в формате «tif».
извините за мой плохой английский
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
Это означает, что я не хочу, чтобы он определял ориентацию и не исправлял перекос.Теперь команда отлично работает со всеми изображениями, включая tiff 2400x2496.
Но изображение должно быть в формате .tif.
Надеюсь, это поможет людям, столкнувшимся с той же проблемой.
У меня была та же проблема «Проблема с распознаванием текста» с некоторыми изображениями.Я повторно масштабировал изображение (в моем случае на 50%), т.е.уменьшил его размер и вуаля!оно работает!
У меня была такая же проблема при использовании
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
в TIFF-файле размером 2400x2496.Изменение его размера до 50% (уменьшение размера) устранило проблему, и метод больше не выдавал исключение, однако он неправильно распознавал текст, например, обнаруживал «relerence» вместо «reference» или «712017» вместо «712517». .Я продолжал пробовать разные размеры изображений, но у всех была одна и та же проблема, пока я не изменил команду на
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
это означало, что я не хочу, чтобы он определял ориентацию и не исправлял перекос.Теперь команда отлично работает со всеми изображениями, включая tiff 2400x2496.
Надеюсь, это поможет людям, столкнувшимся с той же проблемой.
Что решило мою ситуацию, так это использование фоторедактора (Paint.NET) и максимальное использование эффекта резкости.
Я также использовал:doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);