Search
Write a publication
Pull to refresh

Puma.net — удобная альтернатива tessnet2

Добрый день, Хабр. Недавно по работе пришлось писать программу по распознаванию текста на изображении. Не очень хотелось писать самому алгоритм распознавания и придумывать велосипед и решил изучить уже готовые библиотеки, реализованные под C#.

Прежде всего остановил свое внимание на 2 бесплатных проектах: puma.net и tessnet2. Так как tessnet2 уже довольно-таки неплохо описана здесь, то о работе с ней я скажу лишь пару слов, а основное внимание уделю puma.

Tessnet2


После загрузки библиотеки и русского языка к ней прога у меня так и не завелась с ходу. Библиотеки, используемые tessnet2, после создания объекта просто отваливались и прога падала без каких-либо видимых объяснений и причин. Так как проект был срочный, то некогда было разбираться, что не так.

Puma.net


Несколько слов о пуме. Это обертка для движка Cognitive Technologies CuneiFrom, которая делает его удобным для использования в приложениях на .NET 2.0 и выше с функциональностью OCR. Хорошие результаты распознавания могут быть достигнуты несколькими строками кода.

Возможности OCR

  • Распознавание множества печатаемых шрифтов.
  • Поддержка 27 языков, среди которых есть и русский.
  • Проверка правописания.
  • Автоматическое определение шрифтов (курсив, подчеркнутый и т.д.).
  • Сохранение структуры документа (абзацы, изображения, таблицы).
  • Улучшенное распознавание текста, расположенного под углом.
  • Входные форматы изображений: BMP, GIF, EXIG, JPG, PNG и TIFF.
  • Выходные форматы: TXT, RTF, HTML.

Использование Puma.NET


Итак, перейдем к самому главному — как использовать эту библиотеку?
Документацию можно скачать здесь. Приведу пример, как использовал эту библиотеку я.
Для полноценной работы нам понадобятся три dll: dibapi.dll, puma.net.dll, puma.interop.dll.
Собственно, в моем проекте нужна была всего лишь эта функция:
public static string ImageToText(string imageFilename)
{
string result = "";

using (Bitmap load = new Bitmap(imageFilename))
{
//Распознавание
PumaPage image = new PumaPage(load);
using (image)
{
image.FileFormat = PumaFileFormat.TxtAscii;
image.AutoRotateImage = true;
image.EnableSpeller = false;
image.RecognizeTables = true;
image.FontSettings.DetectItalic = true;
image.Language = PumaLanguage.Russian;

try
{
result = image.RecognizeToString();
}
catch (Exception)
{
image.Dispose();
}
}
}

return result;
}

Стоит отметить полезные свойства объекта PumaPage:
FileFormat — выходные форматы;
AutoRotateImage — автоповорот изображения, очень удобно;
RecognizeTables — распознавать ли таблицы или нет;
EnableSpeller — включить словарь или нет;
FontSettings — здесь можно указать, какие шрифты нужно включить в распознавание;
Language — язык.

Пару слов о применении. Мне нужно было с отсканированных изображений получать код договора, который состоял из 9 цифр и начинался с «91». Данная функция довольно-таки прекрасно распознает текст на изображениях, затем с помощью регулярного выражения ищем данный код (так как он может быть в двух местах, одно из которых — таблица), проверяем на правильность обнаружения кода (поиск в БД договора), а затем переименование файла изображения в распознанный код. Поиск кода был следующий:
public static string RetrieveNumber(string source)
{
//Номер может быть в виде следующего регулярного выражения
var patterns = new string[3];
patterns[0] = @"[0-9]{8}\s[0-9]{1}";
patterns[1] = @"[0-9]{8}_[0-9]{1}";
patterns[2] = @"[0-9]{8}";

string result = "";

foreach (string pattern in patterns)
{
Match match = Regex.Match(source, pattern);
if (match.Success)
{
result = match.Value;
break;
}
}

//Заменим пробелы на нижние подчеркивания
result = result.Replace(" ", "_");
//Удалим все, что после символа _
int lenght = result.IndexOf("_");
if (lenght != -1)
result = result.Substring(0, lenght);
return result;
}


Выводы


Итак, мной была рассмотрена библиотека Puma.net, являющаяся альтернативой tessnet2. Мой субъективный выбор пал именно на нее в связи с простотой ее использования, в отличии от tessnet2.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.