- PVSM.RU - https://www.pvsm.ru -

Использование Open Source OCR библиотеки Tesseract в Android на примере простого приложения

image

Сегодня я покажу, как добавить опцию распознавания текста (OCR) в Ваше Android приложение.

Наш тестовый проект — это один единственный Activity, в который я запихнула и распознавание. Итого в общем счете всего 200 строк кода.

Замечу сразу, что опция OCR работает offline. OCR увеличивает ваш .apk приблизительно на 17mb.

Tesseract — пожалуй, самая популярная и качественная бесплатная OCR библиотека, у которой до сих пор выходят апдейты. Создатели Tesseract — разработчики из Google.

Tesseract написан на С, но существует проект tess-two — готовый инструмент по использованию Tesseract на Android платформе. Он предоставляет Java API для доступа к изначально скомпилированным Tesseract классам. Все, что нужно — это добавить tess-two в ваш build.gradle:

dependencies {
    compile 'com.rmtheis:tess-two:5.4.1'
}

Кроме этого тессеракту потребуется .traineddata файл. Этот файл содержит данные для эффективного распознавания, словари слов и прочее. Файл уникален для каждого языка. Скачать .traineddata для любого языка можно по ссылке [1]. Замечу, что есть возможность создать свой собственный .traineddata файл. Это может быть полезно, если вы распознаете специфический текст или у вас свой словарь возможных слов. Теоретически, костомизация повысит качество распознавания.

Перед тем, как перейти к java коду, убедитесь в том, что вы положили в проект файл для английского языка eng.traideddata. Например, в srcmainassetstessdata.

Вам потребуется сконфигурировать тессеракт, перед тем как запускать распознавание. Для этого нужно передать в метод конфигурации (init) два параметра — путь к папке tessdata на вашем Android устройстве и язык («eng»). Будьте внимательны, путь к папке tessdata, а не к .traideddata файлу, если папка будет названа иначе, код не будет работать. Очевидно, вам эту папку нужно создать на external storage и поместить в неё eng.traideddata.

Привожу метод, который из Bitmap получает распознанный текст:

import com.googlecode.tesseract.android.TessBaseAPI;
//...

private String extractText(Bitmap bitmap) throws Exception
{
	TessBaseAPI tessBaseApi = new TessBaseAPI();
	tessBaseApi.init(DATA_PATH, "eng");
	tessBaseApi.setImage(bitmap);
	String extractedText = tessBaseApi.getUTF8Text();
	tessBaseApi.end();
	return extractedText;
}

Да-да, очень просто.

Результат

image

Рекомендации

1. Лучше запускать OCR на сервер стороне. Если у вас Java проект — используйте tess4j — JNA wrapper для Tesseract. Качество распознавания выше на 20-30%. Не садит батарею, не утяжеляет .apk.

2. Используйте предобработку изображения, перед тем как распознавать. Самый простой способ — заставить юзера выделить блок с текстом, что бы уменьшить площадь распознавания. Сюда можно отнести и выравнивание искажений, удаление шумов, цветокоррекцию.

Исходный код доступен здесь [2].

На этом все.

Автор: ashomokdev

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/android-development/119332

Ссылки в тексте:

[1] по ссылке: https://github.com/tesseract-ocr/tessdata

[2] здесь: https://github.com/bieliaievays/Tess-two_example

[3] Источник: https://habrahabr.ru/post/282582/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox