2016-01-03 3 views
4

Я делаю приложение на Android Studio с Tesseract OCR. Я сделал код, который должен распознавать текст на изображениях, сделанных камерой телефона. Проблема: функция tesseract getUTF8Text() не дает результата AT ALL (null, несмотря на то, что изображение имеет текст). Программа не дает никаких ошибок.Tesseract не дает результатов распознавания (Android studio, Java)

Я задавался вопросом о возможных проблемах: 1. Может быть, я интегрировал tesseract в свой проект не правильно? (Компилятор не обнаруживает проблем при использовании классов tesseract в коде). 2. Может быть проблема с кодом? (плохой тренированный путь)?

Основной класс: Код:

private TessOCR Tess; 

//after taking picture I call: 
PictureCallback pictureCallback = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
     String result = Tess.getOCRResult(bitmap); 

     if (result != null) Log.i(TAG, result); 
     else Log.i(TAG, "NO RESULT"); 
    } 
}; 

TessOCR класс для тессеракт traineddata файла нахождения или добавления и распознавания текста (Конструктор только для поиска traineddata файла):

public class TessOCR { 
public static final String PACKAGE_NAME = "com.example.dainius.ocr"; 
public static final String DATA_PATH = Environment 
     .getExternalStorageDirectory().toString() + "/AndroidOCR/"; 
public static final String lang = "eng"; 

private static final String TAG = "OCR"; 
private TessBaseAPI mTess; 

public TessOCR(AssetManager assetManager) { 

    mTess = new TessBaseAPI(); 

    String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" }; 

    for (String path : paths) { 
     File dir = new File(path); 
     if (!dir.exists()) { 
      if (!dir.mkdirs()) { 
       Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed"); 
       return; 
      } else { 
       Log.v(TAG, "Created directory " + path + " on sdcard"); 
      } 
     } 

    } 

    if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) { 
     try { 
      InputStream in = assetManager.open("tessdata/" + lang + ".traineddata"); 
      OutputStream out = new FileOutputStream(DATA_PATH 
        + "tessdata/" + lang + ".traineddata"); 

      byte[] buf = new byte[1024]; 
      int len; 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      in.close(); 
      out.close(); 

      Log.v(TAG, "Copied " + lang + " traineddata"); 
     } catch (IOException e) { 
      Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString()); 
     } 
    } 

    mTess.setDebug(true); 
    mTess.init(DATA_PATH, lang); 
} 

public String getOCRResult(Bitmap bitmap) { 

    mTess.setImage(bitmap); 
    String result = mTess.getUTF8Text(); 

    return result; 
} 

public void onDestroy() { 
    if (mTess != null) 
     mTess.end(); 
} 
  • Если это проблема вызвана плохой интеграцией с tesseract, пожалуйста, разместите соответствующий учебник о том, как его интегрировать, потому что каждый учебник в Интернете отличается друг от друга, трудно отказаться и как правильно это сделать.

ответ

0

Причина моей проблемы заключалась в том, что я не имел права на запись внешнего хранилища. Если кто-то будет пытаться применить этот метод для извлечения файла из папки активов (получил этот метод из this github project), убедитесь, что вы добавляете разрешения писать код внешней хранения строки в файл манифест (AndroidManifest.xml файла):

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
2

Я работал с Tesseract (tess4j). Вы пытались использовать изображение с очень четким текстом и полностью монохромным/полутоновым? Я обнаружил, что, когда я пытаюсь заставить Tesseract читать мои изображения, гораздо полезнее тратить время на манипулирование изображением, пытаясь облегчить Tesseract.

Если вы все еще не можете получить его для вывода вывода, и он не показывает никаких ошибок, я бы пошел here и перезапустил настройку Tesseract с помощью учебника и следил за всеми их советами. Это не должно быть слишком сложно, файлы .dll извлекаются и загружаются автоматически. Просто убедитесь, что ваша папка tessdata находится в правильном месте (корневой каталог), и у вас есть все .jar (я думаю, вам нужно всего 4, а не все из них, но проверьте учебник на tess4j.sourceforge.com) в качестве компиляции библиотеки времени.

Снято с их сайта: «Изображения, предназначенные для OCR, должны иметь разрешение не менее 200 DPI, как правило, 300 DPI, 1 bpp (бит на пиксель) монохромный или 8 bpp оттенки серого несжатого формата TIFF или PNG». Честно говоря, мне не повезло с Tesseract помимо их инструментов PDF для сканирования легко читаемых документов с высоким разрешением.

Я не получил его работать в первый раз, так как он того стоит.

+0

Спасибо за ваш ответ, Престон. Было несколько проблем с тем, как я интегрировал tesseract в свой проект, поэтому я реинтегрировал его другим учебником. Тем не менее, моя проблема не была решена, поэтому, как я это сделал, я объяснил в своем ответе на мой вопрос. Я довольно новичок в студии Android (но не очень-то новичок в программировании), и использование его с tesseract кажется для меня головной болью, поэтому спасибо за ваш ответ, это действительно расширило мой взгляд на этот инструмент. –