2015-12-01 49 views
3

我正在开发一个使用Tesseract的android应用程序。下面的教程后,我收到此错误:Tesseract:找不到数据文件错误

Caused by: java.lang.IllegalArgumentException: Data file not found at /storage/emulated/0/Define/tessdata/eng.traineddata 
    at com.googlecode.tesseract.android.TessBaseAPI.init(TessBaseAPI.java:353) 
    at com.googlecode.tesseract.android.TessBaseAPI.init(TessBaseAPI.java:318) 
    at com.example.mississauga.define.MainActivity.onActivityResult(MainActivity.java:130) 

这是我的代码在MainActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    textcaptured = (TextView)findViewById(R.id.textView); 

    String[] paths = new String[] { DATA_PATH, DATA_PATH + "tessdata/" }; 

    for (String path : paths) { 
     File dir = new File(path); 
     if (!dir.exists()) { 
      if (!dir.mkdirs()) { 
       Log.v(TAG, "ERROR: Creation of directory " + path + " on sdcard failed"); 
       return; 
      } else { 
       Log.v(TAG, "Created directory " + path + " on sdcard"); 
      } 
     } 

    } 

    // lang.traineddata file with the app (in assets folder) 
    // You can get them at: 
    // http://code.google.com/p/tesseract-ocr/downloads/list 
    // This area needs work and optimization 
    if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) { 
     try { 

      AssetManager assetManager = getAssets(); 
      InputStream in = assetManager.open("tessdata/" + lang + ".traineddata"); 
      //GZIPInputStream gin = new GZIPInputStream(in); 
      OutputStream out = new FileOutputStream(DATA_PATH 
        + "tessdata/" + lang + ".traineddata"); 

      // Transfer bytes from in to out 
      byte[] buf = new byte[1024]; 
      int len; 
      //while ((lenf = gin.read(buff)) > 0) { 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
      in.close(); 
      //gin.close(); 
      out.close(); 

      Log.v(TAG, "Copied " + lang + " traineddata"); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString()); 
     } 
    } 


} 

protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if(requestCode==Start_Camera && resultCode== RESULT_OK){ 
     //Toast.makeText(this,"Picture Taken", Toast.LENGTH_SHORT).show(); 
     Bundle extras = data.getExtras(); 
     Bitmap photoBitmap = (Bitmap) extras.get("data"); 
     TessBaseAPI baseApi = new TessBaseAPI(); 

     baseApi.setDebug(true); 
     baseApi.init(DATA_PATH, "eng"); 
     baseApi.setImage(photoBitmap); 
     String recognizedText = baseApi.getUTF8Text(); // Log or otherwise display this string... 
     baseApi.end(); 
     textcaptured.setText(recognizedText); 

    } 
} 

这是多么我已经建立了我的directory,请忽略右边的代码。

回答

0

Tesseract OCR库要求您提供一个文件,其中包含特定语言的光学字符识别数据,以便以特定语言检测并形成尽可能有效的单词。

这个例外是告诉你.traineddata无法找到,事实上,根据你的目录,它在那里。 找不到文件的原因是因为您的数据路径中有/ tessdata /。

您应该不是 have/tessdata /在您的文件路径中。 Tesseract OCR库本身将确保搜索/ tessdata /文件夹中的.traineddata文件。

所以,你的路径应该是这样的:

private static final String DATA_PATH = "/storage/0/storage/emulated/0/Define/"; 
private static final String LANG = "eng"; 

我会建议测试与硬编码路径第一。您可以随时尝试,比较和使用相对路径。

最后,你有你的课程路径初始化的Tesseract OCR库:

baseApi.init(DATA_PATH, LANG); 

现在你应该是好去。

0

确保在AndroidManifest.xml中的文件存在的权限

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