无法使用language = eng初始化Tesseract API

时间:2016-07-10 11:28:18

标签: android ocr tesseract tess-two

我正在开发一款需要OCR的Android应用。我决定使用Tesseract作为API,但我一直收到此错误:

  

E / Tesseract(原生):无法使用language = eng!

初始化Tesseract API
  1. 我已将文件"eng.traineddata"复制到该位置。
  2. 我使用的是Android Studio 2.1.2(SDK 23)
  3. 使用API​​ 22 Android Lollipop 5.1.1在设备上进行测试(阅读关于Marshmallow的许可问题)
  4. 以下是我正在使用的代码:

    public void reads(View view) {
    
      TextView textView = (TextView) findViewById(R.id.textView);
    
      int rotation = 0;
    
      try {
        ExifInterface exifInterface = new ExifInterface(mCurrentPhotoPath);
        int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);
    
        switch (orientation){
          case ExifInterface.ORIENTATION_ROTATE_90: rotation = 90; break;
          case ExifInterface.ORIENTATION_ROTATE_180: rotation = 180; break;
          case ExifInterface.ORIENTATION_ROTATE_270: rotation = 270; break;
        }
      } catch(Exception e) {
    
      }
    
      int w = imageBitmap.getWidth();
      int h = imageBitmap.getHeight();
    
      if (rotation != 0) {
        Matrix matrix = new Matrix();
        matrix.preRotate(rotation);
    
        imageBitmap = Bitmap.createBitmap(imageBitmap,0,0,w,h,matrix,false);
      } else {
        imageBitmap = Bitmap.createBitmap(imageBitmap,0,0,w,h);
      }
    
      imageBitmap = imageBitmap.copy(Bitmap.Config.ARGB_8888,true);
    
      TessBaseAPI ReadIt = new TessBaseAPI();
      ReadIt.init("/storage/emulated/0/","eng");
      ReadIt.setImage(imageBitmap);
    
      String Text = ReadIt.getUTF8Text();
    
      if (Text!=null) textView.setText(Text);
    
    }
    

    我在build.gradle依赖项中使用了这一行:

      

    编译'com.rmtheis:tess-two:6.0.2'

    另外,我已经通过在特定的目录中下载,直接将eng.traineddata复制到名为 tessdata 的文件夹中。

7 个答案:

答案 0 :(得分:3)

您使用的是tess-two吗?在您的代码中:

TessBaseAPI ReadIt = new TessBaseAPI();
ReadIt.init("/storage/emulated/0/","eng");

"/storage/emulated/0/"路径应该指向您的数据文件。您必须有一个子目录 名为“tessdata”。看到 https://github.com/rmtheis/tess-two/blob/d7a45fd2e08b7ec315cd1e29d1a7e0c72fb24a66/tess-two/src/com/googlecode/tesseract/android/TessBaseAPI.java#L176

了解详情: Could not initialize Tesseract API with language=eng!

答案 1 :(得分:2)

如果您不使用Marshmallow但仍有问题请尝试清理并重建项目。

答案 2 :(得分:2)

在活动中释放清单的权限:

在清单中:

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

on onCreate:

    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1);
        }
    }

答案 3 :(得分:1)

我遇到了同样的问题,问题在于Marshmallow特别要求您的应用获得存储的读/写权限。 This blog post解决了我的问题。

在我的主要活动中,我有以下内容:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    ...
    getStorageAccessPermissions(); // Request storage read/write permissions from the user
}

@TargetApi(23)
private void getStorageAccessPermissions() {
    int hasWriteStoragePermission = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (hasWriteStoragePermission != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_PERMISSIONS);
    }
}

REQUEST_CODE_WRITE_EXTERNAL_PERMISSIONS是全局声明的整数常量。

在我扩展 TessBaseAPI 的类中,我添加了以下内容仅用于记录,以确保我实际上可以访问存储。

/* Checks if external storage is available to at least write to and returns the path name */
private static String isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    String retval = "External storage is not writable";
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        retval = Environment.getExternalStorageDirectory().toString();
    }
    return retval;
}

/* Checks if external storage is available to at least read from and returns the path name */
private static String isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    String retval = "External storage is not readable";
    if (Environment.MEDIA_MOUNTED.equals(state) ||
            Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        retval = Environment.getExternalStorageDirectory().toString();
    }
    return retval;
}

答案 4 :(得分:1)

Tesseract-2没有使用最新版本的OCR引擎,它使用3.05,所以我们被迫使用来自here的数据。似乎新数据使用了不同的模型,神经网络。 4.0之前的模型工作方式不同。

我尝试过使用here中的数据 和here。这些数据集仅与最新版本的tesseract 4.0(source)兼容,因此如果您使用旧版本的tesseract,它将无法使用。

答案 5 :(得分:0)

  • 使用来自外部存储(非资产)的 tessdata 目录的绝对路径 例如,如果您的模型在 /storage/emulated/0/Android/data/com.xxx.yyy/files/tessmodels/tessdata/ 使用这条路径 /storage/emulated/0/Android/data/com.xxx.yyy/files/tessmodels/
  • 确保您具有写入/读取外部存储权限
  • 使用this model,使用tess-two:9.0.0进行测试。我是从tess-two sample app
  • 得到的

答案 6 :(得分:0)

较新版本的tess-two检查以确保可以在设备上找到训练数据文件。如果找不到这些训练数据文件,将显示比您看到的错误消息更具信息性的消息。

因此,当您在较新版本的tess-two上看到此错误消息时,这意味着在预期位置找到了训练数据文件,但它们是错误的版本或者是不可读的。检查以确保您使用的是正确版本的培训数据文件。