2016-07-13 5 views
1

Я загрузил распознаватель текста OCR из github.Каталог: активы/tessdata

Моя проблема: я хочу запустить приложение без подключения к сети, но каждый раз, когда я устанавливаю apk на свой телефон, он начинает загружать английский язык и движок OCR Tesseract. Я нашел онлайн-руководство, в котором говорится, что мне нужно создать папку в папке с ресурсами, называемую «tessdata», и поместить в эту папку данные eng.traineddata и osd.traineddata.

Я пробовал, но процесс загрузки по-прежнему начинается, когда я устанавливаю приложение в первый раз. Что делать, если приложение полностью отключено?

ответ

2

Во-первых, в каталоге проектов на компьютере (YourProjectDirectory\app\src\main) создайте папку assets, в этой папке создайте другую папку tessdata. В папке tessdata поместите ваши файлы .traineddata, они будут переданы в вашем телефоне при запуске вашего проекта. Вы можете скачать файлы .traineddata для своего языка HERE.

Для передачи .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 = "TESSERACT"; 
private AssetManager assetManager; 

private TessBaseAPI mTess; 

public TessOCR(AssetManager assetManager) { 

    Log.i(TAG, DATA_PATH); 

    this.assetManager = assetManager; 

    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(new File(DATA_PATH + "tessdata/", lang + ".traineddata")); 

      byte[] buf = new byte[1024]; 
      int len; 
      while ((len = in.read(buf)) != -1) { 
       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 = new TessBaseAPI(); 
    mTess.setDebug(true); 
    mTess.init(DATA_PATH, lang); 

} 


public String getResults(Bitmap bitmap) 
{ 
    mTess.setImage(bitmap); 
    String result = mTess.getUTF8Text(); 
    return result; 
} 

public void onDestroy() { 
    if (mTess != null) 
     mTess.end(); 
} 
} 

Этот код проверяет, существует ли в телефоне файл с каталогами , и если нет, создает один и помещает .traineddata файл здесь. Для этого в вашем OnCreate вам нужно будет создать AssetManager, что позволит вам получить доступ к этому файлу .traineddata, который вы разместили на своем компьютере в своем проекте.

Так что в вашем OnCreate в MainActivity:

AssetManager assetManager = getAssets(); 
TessOCR tess = new TessOCR(assetManager); 

Кроме того, чтобы ваши данные Android проекта записи в телефон в AndroidManifest.xml файл, который нужно добавить permision строку:

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

Это метод, который я использую лично, и он работает без ошибок. Если у вас есть, выполните поиск в Google для ответов и если вы все еще не можете найти ответ, опубликуйте в комментариях.

+0

Это то же самое для osd.traineddata (механизм распознавания текста)? – Mirco

+0

Должно быть, я думаю. Просто попробуйте 'public static final String lang =" eng ";' change change with "osd", затем он должен поместить его в тот же каталог. Мне на самом деле никогда не требовалось osd, и tesseract не пытались загрузить его для меня, поэтому я не могу быть на 100% уверенным. Если вам нужно проверить и загрузить оба этих файла в телефоне, просто повторите функцию конструктора TessOCR два раза с разными именами .traineddata (lang variables). –

+0

Я использовал ваш код, и он работает ... более или менее: он создает папку в памяти телефона, но он продолжает просить меня загрузить этот файл, и если я отменим строки кода, в которых задается загрузка, он показывает диалоговое окно с сообщением о том, что двигатель инициализируется ... и если я удалю эту часть, у меня есть только черный экран. – Mirco