使用Tesseract-OCR实现相机拍照OCR时遇数据路径不存在错误
解决Tesseract-OCR初始化时「Data path does not exist!」的问题
这个错误本质是Tesseract找不到存放语言包的有效路径——它没法直接读取assets里的文件,必须把语言包复制到设备的本地可读写目录才行,我给你一步步捋清楚怎么解决:
1. 先检查你的assets文件结构是否正确
你需要在app/src/main/assets下创建一个tessdata子文件夹,把对应的语言包(比如eng.traineddata,识别英文用)放进去,最终路径应该是:app/src/main/assets/tessdata/eng.traineddata
注意:语言包的文件名要和你初始化时传的
language参数对应,比如你传"eng",就必须有eng.traineddata文件。
2. 把assets里的语言包复制到应用私有存储
因为assets是只读目录,Tesseract需要读写权限,所以我们要把语言包复制到应用的私有存储目录(比如getFilesDir(),这个目录不需要动态申请权限,Android 6.0+也能用)。
在你的MainActivity或者MyTessOCR类里添加复制文件的方法:
private void copyTessDataToLocal() { AssetManager assetManager = getAssets(); String tessDataFolder = "tessdata"; File localTessDataDir = new File(getFilesDir(), tessDataFolder); // 先创建本地tessdata目录 if (!localTessDataDir.exists()) { localTessDataDir.mkdirs(); } try { // 获取assets里tessdata文件夹下的所有文件 String[] files = assetManager.list(tessDataFolder); for (String filename : files) { // 打开assets里的文件流 InputStream inStream = assetManager.open(tessDataFolder + "/" + filename); // 本地文件路径 File outFile = new File(localTessDataDir, filename); // 复制文件 OutputStream outStream = new FileOutputStream(outFile); byte[] buffer = new byte[1024]; int length; while ((length = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, length); } // 关闭流 inStream.close(); outStream.close(); } } catch (IOException e) { e.printStackTrace(); } }
3. 正确初始化Tesseract
在调用mTess.init()之前,先执行上面的复制方法,然后把datapath设置为应用私有存储的根目录(也就是getFilesDir().getAbsolutePath()):
// 先复制语言包到本地 copyTessDataToLocal(); // 设置datapath为应用私有存储根目录 String dataPath = getFilesDir().getAbsolutePath(); // 初始化,第二个参数是语言包前缀(比如eng对应eng.traineddata) mTess.init(dataPath, "eng");
额外注意点
- 不要用外部存储路径(比如
Environment.getExternalStorageDirectory()),因为Android 10+对外部存储的权限限制很严,用应用私有存储更省心。 - 第一次启动应用时复制文件可能需要一点时间,你可以加个加载提示,避免用户以为应用卡死。
内容的提问来源于stack exchange,提问作者lovecode
相关产品推荐
相关产品推荐

