java - 是否可以在 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?
解决方案
主要问题是tesseract.js
期望在浏览器中运行。没有定义窗口,因为不是在浏览器中运行 tesseract.js,而是在不同的 JavaScript 运行时中运行它。
为了解决您的问题,我将使用 Tess4j 运行 Tesseract OCR。Tess4j 是围绕 Tesseract 的 JNA 包装器(就像tesseract.js
浏览器包装器一样)。
推荐阅读
- c++ - 如何使用访问相对父目录
在 C++ 中 - amazon-web-services - 如何安装 awscli.msi 并使用 .bat 脚本将文件上传到 s3?
- python - 如何将多行值读入字典
- bash - 使用 fzf 或其他类似实用程序完成命令行增量路径
- javascript - 数组和可观察到 html 的角度问题
- java - Fixing the problem of passing data from one servlet to another
- command - Julia - 命令中的格式化字符串插值
- react-native - 使用异步 componentDidMount() 预期的 React Native 导入字体 =>
- javascript - 当我尝试在 JavaScript 函数中使用它时,Java JSP 代码不会增加
- reactjs - 将数组从 Laravel 传递到 React 时 JSON 输入意外结束