我正在开发一款需要OCR的Android应用。我决定使用Tesseract作为API,但我一直收到此错误:
E / Tesseract(原生):无法使用language = eng!
初始化Tesseract API
"eng.traineddata"
复制到该位置。以下是我正在使用的代码:
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 的文件夹中。
答案 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
答案 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)
/storage/emulated/0/Android/data/com.xxx.yyy/files/tessmodels/tessdata/
使用这条路径
/storage/emulated/0/Android/data/com.xxx.yyy/files/tessmodels/
tess-two:9.0.0
进行测试。我是从tess-two sample app 答案 6 :(得分:0)
较新版本的tess-two检查以确保可以在设备上找到训练数据文件。如果找不到这些训练数据文件,将显示比您看到的错误消息更具信息性的消息。
因此,当您在较新版本的tess-two上看到此错误消息时,这意味着在预期位置找到了训练数据文件,但它们是错误的版本或者是不可读的。检查以确保您使用的是正确版本的培训数据文件。