Тессеракт TessBaseApi init() Ошибка

Я использую зависимости rmtheis tess-two в своем проекте. Прочитал много уроков, но мне ничего не помогло.

package com.example.shaur.ocrapp;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.googlecode.tesseract.android.TessBaseAPI;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private static int RESULT_LOAD_IMAGE = 1;

    Button button;
    ImageView image;
    TextView result;
    Bitmap bitmap;
    private static final int GALLERY = 4;

    private static String TESSBASE_PATH= Environment.getRootDirectory().getPath();
    private static final String DEFAULT_LANGUAGE = "eng";


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button);
        image = (ImageView) findViewById(R.id.image);
        result = (TextView) findViewById(R.id.result);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");

                startActivityForResult(intent, GALLERY);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == GALLERY) {
            Uri uri = data.getData();
            try {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
            } catch (IOException e) {
                e.printStackTrace();
            }
            image.setImageBitmap(bitmap);


            final TessBaseAPI baseApi = new TessBaseAPI();

            //Error HERE
            baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
            baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
            baseApi.setVariable(TessBaseAPI.VAR_SAVE_BLOB_CHOICES, TessBaseAPI.VAR_TRUE);

            baseApi.setImage(bitmap);
            String outputText = baseApi.getUTF8Text();
            baseApi.end();

            Log.i("TEXT:",outputText);
            if(DEFAULT_LANGUAGE.equalsIgnoreCase("eng")){
                outputText = outputText.replaceAll("[^a-zA-Z0-9]+", " ");
            }
            result.setText(outputText);



        }
    }
}

Я прочитал где-то установить Data Path как getFilesDir()+ "/tesseract/". Этот метод не работает. Тогда я попробовал PATH-> "/mnt/sdcard/tessract/"

Мои eng.traineddata находятся в папке активов.

Сообщение в журнале, где появляется ошибка->

com.example.shaur.ocrapp E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.shaur.ocrapp, PID: 5736 java.lang.RuntimeException: сбой при доставке результата ResultInfo{who=null, request=4, result=-1, data=Intent { dat=content://media/external/images/media/43105 flg=0x1 launchParam=MultiScreenLaunchParams { mDisplayId=0 mBaseDisplayId=0 mFlags=0 } (имеет дополнительные данные) }} для деятельности {com.example.shaur.ocrapp/com.example.shaur.ocrapp.MainActivity}: java.lang.IllegalArgumentException: путь к данным должен содержать подпапку tessdata! на android.app.ActivityThread.deliverResults(ActivityThread.java:4520) на android.app.ActivityThread.handleSendResult(ActivityThread.java:4563) на android.app.ActivityThread.-wrap22(ActivityThread.java) на android.app.ActivityThread. $H.handleMessage(ActivityThread.java:1698) на android.os.Handler.dispatchMessage(Handler.java:102) на android.os.Looper.loop(Looper.java:154) на android.app.ActivityThread.main(ActivityThread.java:6776) на java.lang.reflect.Method.invoke(собственный метод) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518) на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408) Причина: java.lang.IllegalArgumentException: Путь к данным должен содержать подпапку tessdata! на com.googlecode.tesseract.android.TessBaseAPI.init(TessBaseAPI.java:311) на com.googlecode.tesseract.android.TessBaseAPI.init(TessBaseAPI.java:284) на com.example.shaur.ocrapp.MainActivity.onActivityResult(MainActivity.java:73) в android.app.Activity.dispatchActivityResult(Activity.java:7295) в android.app.ActivityThread.deliverResults(ActivityThread.java:4516) в android.app.ActivityThread.handleSendResult (ActivityThread.java: 4563) на android.app.ActivityThread.-wrap22(ActivityThread.java) на android.app.ActivityThread$H.handleMessage(ActivityThread.java:1698) на android.os.Handler.dispatchMessage(Handler.java:102) на android.os.Looper.loop(Looper.java:154) на android.app.ActivityThread.main(ActivityThread.java:6776) на java.lang.reflect.Method.invoke(собственный метод) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1518) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408)

В сообщении журнала четко указано "Причина: java.lang.IllegalArgumentException: путь к данным должен содержать подпапку tessdata!". Где я должен создать этот каталог. Это мой телефон SDCard, где мне нужно создать папку вручную и назвать ее как tesseract и добавить туда подпапку с tessdata, имеющим eng.traineddata.

Изображение моего каталога

Если в моем коде есть какая-либо другая ошибка, касающаяся тессаракта, выделите и сообщите правильный метод.

2 ответа

Tesseract не обрабатывает папку ресурсов, вам нужно скопировать данные в куда-нибудь доступное место, например / data / Android / yourapppackage / assets / tesseract, и использовать этот путь.

Я заставил работать только Тессеракт, не знаю, справится ли Тесс-Два с этим делом.

Предположим, вы добавили данные в / assets /

Затем в своем коде вы получаете Stream из ресурсов и копируете файл внутрь устройства по указанному мною пути, а затем в tesseract подразумеваете, что вы его используете.

Я думаю, что вы должны использовать

private static final String TessBasePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/com.example.shaur.ocrapp/";

Это сработало для меня!

Другие вопросы по тегам