Використання 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 для будь-якої мови можназа адресою. Зауважу, що є можливість створити свій власний .traineddata файл. Це може бути корисно, якщо ви розпізнаєте специфічний текст або у вас свій словник можливих слів. Теоретично, кастомізація підвищить якість розпізнавання.

Перед тим, як перейти до java коду, переконайтеся, що ви поклали в проект файл для англійської мови eng.traideddata. Наприклад, у src\main\assets\tessdata.

Вам потрібно сконфігурувати тессеракт, перед тим як запускати розпізнавання. Для цього потрібно передати в метод конфігурації 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%. Не садить батарею, не обтяжує.апк.

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

Вихідний код доступний тут.

На цьому все.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.