1

我正在尝试将 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)
4

4 回答 4

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 .so 依赖项被指定在第三位。

2)libtess.so是用动态链接编译的(然后尝试使用静态链接)

3)您正在尝试在模拟器中运行它(然后在真实设备上尝试)。

从您提供的信息中可以说的就是这些了。

于 2015-09-23T09:24:52.157 回答
0
  1. 不要更新任何 gradle aur sdk 更新......我重复一遍......如果询问,请忽略所有更新,它会顺利运行。只需从 github 导入 priyankverma######## 项目并忽略所有更新......我相信你不会得到这个 libpngt.so 错误。
    1. 下载或克隆项目
    2. 在安卓工作室中导入
    3. 让 gradle 和 sdk 版本保持原样
    4. 忽略所有更新,即使它说“强烈推荐”。
    5. 只需运行该项目。:)
于 2017-08-18T06:29:09.297 回答
0

有关解决方案的更多信息:

当我从 Windows 迁移到 Linux 时,我遇到了这个问题。我的 Linux 没有安装NDK

我已经从官方来源下载了它。

Linux下安装说明:

转到您下载它的目录。执行包。例如:

ndk$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
ndk$ ./android-ndk-r10c-darwin-x86_64.bin

你还需要在 Linux 下重建 tess-two。按照官方 来源中的说明进行操作。

于 2015-11-30T18:45:53.390 回答
0

确保您在项目和 tess lib 项目中使用相同的 gradle 版本。例子:

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}

类路径上的值在两个项目上必须相等。

于 2016-02-10T13:27:05.013 回答