ScottMobile
ScottMobile

Reputation: 83

Cannot add a eng.traineddata to my Tesseract project Android 5.0

I am currently trying to implement Tesseract OCR into my project but have came to a crossing road. I followed all of the directions from https://github.com/rmtheis/tess-two and got stuck at the actual implementation portion of this project. The current code I have running is:

 TessBaseAPI baseApi = new TessBaseAPI();
        baseApi.init(TESS_DATA_FILE_PATH, "eng");
        baseApi.setImage(icon);
        String recognizedText = baseApi.getUTF8Text();
        baseApi.end();

Now the TESS_DATA_FILE_PATH is the current issue. I have been trying to add the eng.traineddata file to my project, but I simply do not know where or how to do it.

Things I have tried:

  1. In the assets folder I added the file eng.traineddata but that is read only and I cannot change it at run time. So this wont work
  2. I tried to add in other ways of running the project, and running the adb push command to add it directly to the device, but that wont work since I will be pushing this application to the masses.

So what I am looking for is an answer of, How do I add the eng.traineddata to my project. And what do I place in the TESS_DATA_FILE_PATH part of the init call.

Side Notes: I did receive the BUILD SUCCESSFUL call at the end of all the steps at the link provided above.

Upvotes: 3

Views: 1846

Answers (1)

ScottMobile
ScottMobile

Reputation: 83

I have successfully added the language pack to my project, and ran tess two on my android project.

Here is the code for how I did it:

This is what sets up the files path, and adds the traineddata folder

public void setupOCR(){

    File folder = new File(Environment.getExternalStorageDirectory() + "/classlinkp/tessdata");
    if (!folder.exists()) {
        folder.mkdirs();
    }

    File saving = new File(folder, "eng.traineddata");
    try {
        saving.createNewFile();
    } catch (IOException e) {
        e.printStackTrace();
    }

    InputStream stream = null;
    try {
        stream = mContext.getAssets().open("eng.traineddata", AssetManager.ACCESS_STREAMING);
    } catch (IOException e) {
        e.printStackTrace();
    }


    if (stream != null){
        copyInputStreamToFile(stream, saving);
    }
}

Here is how I saved out the eng.traineddata file:

  private void copyInputStreamToFile( InputStream in, File file ) {
    try {
        OutputStream out = new FileOutputStream(file);
        byte[] buf = new byte[1024];
        int len;
        while((len=in.read(buf))>0){
            out.write(buf,0,len);
        }
        out.close();
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

The saving method was gathered from: https://stackoverflow.com/a/28131358/3781164

Upvotes: 1

Related Questions