我从github下载了一个OCR文本识别器。
我的问题是:我想在不上线的情况下启动我的应用程序,但每次我在手机上安装apk时,它都会开始下载英语和tesseract OCR引擎。 我找到了一个在线指南,说我必须在assets文件夹中创建一个名为“tessdata”的文件夹,并将eng.traineddata和osd.traineddata放在这个文件夹中。
我已经尝试了,但是第一次安装应用时,下载过程仍然开始。 我该怎么做才能使这个应用程序完全脱机?
答案 0 :(得分:4)
首先,在计算机的项目目录(YourProjectDirectory\app\src\main
)中创建assets
文件夹,在此文件夹中创建另一个tessdata
文件夹。在tessdata文件夹中放入.traineddata文件,这些文件将在项目开始运行时在手机中传输。您可以为您的语言HERE下载.traineddata文件。
要将.traineddata文件传输到手机中,请使用以下代码:
public class TessOCR {
public static final String PACKAGE_NAME = "com.example.dainius.ocr";
public static final String DATA_PATH = Environment
.getExternalStorageDirectory().toString() + "/AndroidOCR/";
public static final String lang = "eng";
private static final String TAG = "TESSERACT";
private AssetManager assetManager;
private TessBaseAPI mTess;
public TessOCR(AssetManager assetManager) {
Log.i(TAG, DATA_PATH);
this.assetManager = assetManager;
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");
}
}
}
if (!(new File(DATA_PATH + "tessdata/" + lang + ".traineddata")).exists()) {
try {
InputStream in = assetManager.open("tessdata/" + lang + ".traineddata");
OutputStream out = new FileOutputStream(new File(DATA_PATH + "tessdata/", lang + ".traineddata"));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
Log.v(TAG, "Copied " + lang + " traineddata");
} catch (IOException e) {
Log.e(TAG, "Was unable to copy " + lang + " traineddata " + e.toString());
}
}
mTess = new TessBaseAPI();
mTess.setDebug(true);
mTess.init(DATA_PATH, lang);
}
public String getResults(Bitmap bitmap)
{
mTess.setImage(bitmap);
String result = mTess.getUTF8Text();
return result;
}
public void onDestroy() {
if (mTess != null)
mTess.end();
}
}
此代码检查手机中是否存在包含目录/AndroidOCR/tessdata/eng.traineddata
的文件,如果没有,则创建一个并在此处放置.traineddata文件。
为此,您需要在OnCreate中创建AssetManager
,这样您就可以访问放置在项目中的计算机中的.traineddata文件。
所以在MainActivity中的OnCreate中:
AssetManager assetManager = getAssets();
TessOCR tess = new TessOCR(assetManager);
此外,要允许您的Android项目在AndroidManifest.xml
文件中将数据写入手机,您需要添加permision线:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这是我个人使用的方法,它没有任何错误。如果您有,请在谷歌搜索答案,如果仍然找不到答案,请在评论中发帖。