Android Tesseract TessBaseApi init()错误

Android Tesseract TessBaseApi init()错误,android,image,ocr,tesseract,tess-two,Android,Image,Ocr,Tesseract,Tess Two,我在我的项目中使用了rmtheis-tess两个依赖项。 我已经读了很多教程,但没有任何帮助 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 and

我在我的项目中使用了rmtheis-tess两个依赖项。 我已经读了很多教程,但没有任何帮助

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);



        }
    }
}
我在某处读到将数据路径设置为getFilesDir()+“/tesseract/”。此方法无效。然后我尝试路径->“/mnt/sdcard/tessract/”

我的eng.traineddata在资产文件夹中

错误出现的日志消息->

com.example.shaur.ocre/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:数据路径必须包含子文件夹 苔丝数据! 在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:数据路径必须包含 子文件夹数据! 在 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:数据路径必须包含子文件夹数据!”。我应该在哪里创建此目录。这是我的手机SD卡,我需要手动创建一个文件夹,并将其命名为tesseract,然后在其中添加一个子文件夹,其中TesserData包含eng.traineddata


如果我的代码中有关于tessaract的任何其他错误,请突出显示并告知正确的方法。

Tesseract不处理assets文件夹,您需要将.data复制到可能的位置,如/data/Android/yourapppackage/assets/Tesseract,并使用该路径

我只是让Tesseract工作了,不知道Tess二号是否处理了那个案子

假设您将数据添加到/assets/


然后在代码中,您从资产中获取流,并按照我提到的路径将文件复制到设备内部,然后在tesseract impl中使用它

我认为您应该使用

private静态最终字符串TessBasePath=Environment.getExternalStorageDirectory().getAbsolutePath()+“/com.example.shaur.ocrapp/”


这对我有用

到目前为止我已经尝试过的链接->,stackoverflow的答案让我困惑,为什么路径是“/mnt/sdcard/tesseract/tesserData”如果存在,你可以共享你的github回购吗