Добрый день, Хабр. Недавно по работе пришлось писать программу по распознаванию текста на изображении. Не очень хотелось писать самому алгоритм распознавания и придумывать велосипед и решил изучить уже готовые библиотеки, реализованные под C#.
Прежде всего остановил свое внимание на 2 бесплатных проектах: puma.net и tessnet2. Так как tessnet2 уже довольно-таки неплохо описана здесь, то о работе с ней я скажу лишь пару слов, а основное внимание уделю puma.
После загрузки библиотеки и русского языка к ней прога у меня так и не завелась с ходу. Библиотеки, используемые tessnet2, после создания объекта просто отваливались и прога падала без каких-либо видимых объяснений и причин. Так как проект был срочный, то некогда было разбираться, что не так.
Несколько слов о пуме. Это обертка для движка Cognitive Technologies CuneiFrom, которая делает его удобным для использования в приложениях на .NET 2.0 и выше с функциональностью OCR. Хорошие результаты распознавания могут быть достигнуты несколькими строками кода.
Итак, перейдем к самому главному — как использовать эту библиотеку?
Документацию можно скачать здесь. Приведу пример, как использовал эту библиотеку я.
Для полноценной работы нам понадобятся три dll: dibapi.dll, puma.net.dll, puma.interop.dll.
Собственно, в моем проекте нужна была всего лишь эта функция:
Стоит отметить полезные свойства объекта PumaPage:
FileFormat — выходные форматы;
AutoRotateImage — автоповорот изображения, очень удобно;
RecognizeTables — распознавать ли таблицы или нет;
EnableSpeller — включить словарь или нет;
FontSettings — здесь можно указать, какие шрифты нужно включить в распознавание;
Language — язык.
Пару слов о применении. Мне нужно было с отсканированных изображений получать код договора, который состоял из 9 цифр и начинался с «91». Данная функция довольно-таки прекрасно распознает текст на изображениях, затем с помощью регулярного выражения ищем данный код (так как он может быть в двух местах, одно из которых — таблица), проверяем на правильность обнаружения кода (поиск в БД договора), а затем переименование файла изображения в распознанный код. Поиск кода был следующий:
Итак, мной была рассмотрена библиотека Puma.net, являющаяся альтернативой tessnet2. Мой субъективный выбор пал именно на нее в связи с простотой ее использования, в отличии от tessnet2.
Прежде всего остановил свое внимание на 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.