Как стать автором
Поиск
Написать публикацию
Обновить

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.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.