我正在尝试将Tesseract实现到我的android项目中,但在尝试完成OCR时遇到了崩溃。
以下是我设置Tesseract的方法:
TessBaseAPI baseApi = new TessBaseAPI();
baseApi.setDebug(true);
baseApi.init(imagePath, "eng");
baseApi.setImage(bitmap);
String recognizedText = baseApi.getUTF8Text();
baseApi.end();
这就是我设置图像信息以传递给TesseractAPI的方法:
destination = new File(Environment.getExternalStorageDirectory(), name + ".png");
imagePath = destination.getAbsolutePath();
String name = dateToString(new Date(),"yyyy-MM-dd-hh-mm-ss");
这是Logcat:
10734-10734/www.rshdev.com.ocr E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: www.rshdev.com.ocr, PID: 10734
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.rshdev.com.ocr-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libpngt.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:988)
at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(TessBaseAPI.java:43)
at www.rshdev.com.ocr.MainActivity.ocr(MainActivity.java:140)
at www.rshdev.com.ocr.MainActivity.onActivityResult(MainActivity.java:86)
at android.app.Activity.dispatchActivityResult(Activity.java:6192)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3570)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3617)
at android.app.ActivityThread.access$1300(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
答案 0 :(得分:1)
你的tesseract在OCR功能中没有崩溃,它崩溃试图加载一个库:
java.lang.UnsatisfiedLinkError: ... couldn't find "libpngt.so"
...
at com.googlecode.tesseract.android.TessBaseAPI.<clinit>(TessBaseAPI.java:43)
但我在源代码中的第43行读到:
System.loadLibrary("tess");
因此它尝试加载 libtess.so 但报告 libpngt.so 上的失败。
或者:
1)您的TessBaseAPI.java源代码不同,它包含System.loadLibrary("pngt");
,并且缺少该库。确保.apk包含它。 Eclipse过去常常出现错误:如果您的代码依赖于库,则可以在一个位置配置该依赖项以进行编译,并在另一个位置进行交付。和IIRC。所以依赖在第3位指定。
2)libtess.so是用动态链接编译的(然后尝试使用静态链接)
3)您正试图在模拟器中运行它(然后尝试使用真实设备)。
这就是您提供的信息的全部内容。
答案 1 :(得分:0)
有关解决方案的更多信息:
当我从Windows迁移到Linux时,我遇到了这个问题。我的Linux没有安装 NDK 。
我是从official source下载的。
在Linux下安装的说明:
转到下载目录。 执行包。例如:
ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin
您还需要在Linux下重建tess-two。按照官方 source中的说明进行操作。
答案 2 :(得分:0)
确保您在项目和tess lib项目中使用相同的gradle版本。例如:
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
}
}
classpath 上的值必须等于两个项目。
答案 3 :(得分:0)