【问题标题】:Is it possible to run tesseract.js (from https://github.com/naptha/tesseract.js) under GraalVM using graal.js to do OCR in Java?是否可以在 GraalVM 下运行 tesseract.js(来自 https://github.com/naptha/tesseract.js),使用 graal.js 在 Java 中进行 OCR?
【发布时间】:2021-08-04 08:46:10
【问题描述】:

我正在尝试对来自 Java 的图像文件进行 OCR。所以我决定使用来自https://github.com/naptha/tesseract.js 的 Tesseract.js 并通过 GraalVM 中的 graal.js 功能调用它,但无法让它工作。

这是我尝试过的。

public static final String TESSERACT = "src/tesseract.js";

private static void tesseract(String imageFile) throws IOException
{
    System.out.println("=== Calling Tesseract === ");
    try(Context context = Context.create())
    {
        context.eval(Source.newBuilder("js", new File(TESSERACT)).build());
        Value Tesseract = context.getBindings("js").getMember("Tesseract");
        Value recognize = Tesseract.getMember("recognize");
        long start = System.currentTimeMillis();
        String result = recognize.execute(imageFile).asString();
        long took = System.currentTimeMillis() - start;
        System.out.println("Tesseract call took: " + took + "ms with result: " + result);
    } // context.close() is automatic
}

它会编译,但在运行时会抛出这个异常:

=== Calling Tesseract === 
Exception in thread "main" ReferenceError: window is not defined
    at <js> spawnWorker(src\tesseract.js:286:8848-8853)
    at <js> _delay(src\tesseract.js:504:16140-16184)
    at <js> recognize(src\tesseract.js:472-481:15321-15620)
    at org.graalvm.polyglot.Value.execute(Value.java:457)
    at com.mycompany.app.JsApp.tesseract(JsApp.java:98)
    at com.mycompany.app.JsApp.main(JsApp.java:70)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)

Anyone know to to fix this?

【问题讨论】:

    标签: java graalvm tesseract.js


    【解决方案1】:

    主要问题是tesseract.js 期望在浏览器中运行。没有定义窗口,因为不是在浏览器中运行 tesseract.js,而是在不同的 JavaScript 运行时中运行它。

    为了解决您的问题,我将使用 Tess4j 运行 Tesseract OCR。 Tess4j 是围绕 Tesseract 的 JNA 包装器(就像 tesseract.js 是浏览器包装器一样)。

    【讨论】:

    • 我看到 tesseract.js 在不是浏览器的 Node.js 中运行。事实上,如果您查看页面底部github.com/naptha/tesseract.js,您会发现有多种使用方法。 Tess4j 在使用 JNI 时遇到了一些其他问题——这正是我尝试这种方法的原因。
    • 它引用窗口对象(仅在浏览器中可用)的事实使我认为它仅在浏览器中运行。他们没有在另一个环境中运行的任何示例。但我之前没有使用过 tesseract.js,所以我可能错了。
    • 同意。他们可能有一个不引用该对象的版本。在github中提问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多