首页 > 解决方案 > 是否可以在 GraalVM 下运行 tesseract.js(来自 https://github.com/naptha/tesseract.js),使用 graal.js 在 Java 中进行 OCR?

问题描述

我正在尝试对来自 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?

标签: javagraalvmtesseract.js

解决方案


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

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


推荐阅读