首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ubuntu上的Tess4J崩溃JVM

Ubuntu上的Tess4J崩溃JVM
EN

Stack Overflow用户
提问于 2021-12-21 11:05:29
回答 1查看 264关注 0票数 0

我是Tess4J和JNA的新手,所以很抱歉,如果这是显而易见的,但我还没有在博客中找到。我在Ubuntu18.04上运行Java 17.0.1,Tomcat 10.0。我已经建立了一个简单的动态网络应用程序,详情如下。我安装了这样的资源:

代码语言:javascript
运行
复制
sudo apt install tesseract-ocr tesseract-ocr-rus libleptonica-dev

首先,我将提到,我能够处理我的测试文档,而没有命令行中的任何问题:

代码语言:javascript
运行
复制
tesseract /tmp/output-0.jpg /tmp/file -l rus+eng

但是,当我尝试使用Java时,JVM就会崩溃。

我的类OCR中的相关Java如下:

代码语言:javascript
运行
复制
    private static final String tessDir = "/usr/share/tesseract-ocr/4.00/";
    private static final String libDir = "/usr/lib/x86_64-linux-gnu";
    private ITesseract ocr = new Tesseract();
    
    public OCR() {
        System.setProperty("java.library.path", System.getProperty("java.library.path") + ":" + libDir);
        ocr.setDatapath(tessDir);
    }

    public String doOcr (String inputDirName, String outputDirName, List<File> files, Set<Lang> langs) throws IOException {
        File f1 = new File("/tmp/output-0.jpg");
        String s = "";
        ocr.setLanguage("rus+eng");
        try {
            s = ocr.doOCR(f1);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return s;
    }

pom.xml:

代码语言:javascript
运行
复制
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna-platform</artifactId>
        <version>5.6.0</version>
    </dependency>
    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>4.6.0</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.lept4j</groupId>
        <artifactId>lept4j</artifactId>
        <version>1.16.1</version>
    </dependency>
    <dependency>
        <groupId>org.ghost4j</groupId>
        <artifactId>ghost4j</artifactId>
        <version>1.0.1</version>
    </dependency>

崩溃日志如下所示:

代码语言:javascript
运行
复制
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f67aeed2c27, pid=23274, tid=23912
#
# JRE version: Java(TM) SE Runtime Environment (17.0.1+12) (build 17.0.1+12-LTS-39)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0.1+12-LTS-39, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, parallel gc, linux-amd64)
...
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libtesseract.so.4+0xa1c27]  tesseract::Tesseract::recog_all_words(PAGE_RES*, ETEXT_DESC*, TBOX const*, char const*, int)+0x437

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com.sun.jna.Native.invokePointer(Lcom/sun/jna/Function;JI[Ljava/lang/Object;)J+0
j  com.sun.jna.Function.invokePointer(I[Ljava/lang/Object;)Lcom/sun/jna/Pointer;+7
j  com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;ZI)Ljava/lang/Object;+385
j  com.sun.jna.Function.invoke(Ljava/lang/reflect/Method;[Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+271
j  com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+390
j  jdk.proxy3.$Proxy10.TessBaseAPIGetUTF8Text(Lnet/sourceforge/tess4j/ITessAPI$TessBaseAPI;)Lcom/sun/jna/Pointer;+16 jdk.proxy3
j  net.sourceforge.tess4j.Tesseract.getOCRText(Ljava/lang/String;I)Ljava/lang/String;+269
j  net.sourceforge.tess4j.Tesseract.doOCR(Ljavax/imageio/IIOImage;Ljava/lang/String;Ljava/awt/Rectangle;I)Ljava/lang/String;+18
j  net.sourceforge.tess4j.Tesseract.doOCR(Ljava/io/File;Ljava/awt/Rectangle;)Ljava/lang/String;+126
j  net.sourceforge.tess4j.Tesseract.doOCR(Ljava/io/File;)Ljava/lang/String;+3
j  mypackage.OCR.doOcr(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Set;)Ljava/lang/String;+32

在libDir中,确实有libtesseract.so.4 -> libtesseract.so.4.0.0liblept.so -> liblept.so.5.0.2

那我错过了什么?版本错配的地方?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-21 11:32:06

不太确定您是否知道,但似乎有一个API可供您使用,而不是直接指向安装Lib文件夹。

这意味着这将是与平台无关的,无论是在windows/linux上都能工作。

使用示例:

pom.xml构建文件

代码语言:javascript
运行
复制
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.bytedeco.tesseract</groupId>
    <artifactId>BasicExample</artifactId>
    <version>1.5.7-SNAPSHOT</version>
    <properties>
        <exec.mainClass>BasicExample</exec.mainClass>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>tesseract-platform</artifactId>
            <version>5.0.0-1.5.7-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <sourceDirectory>.</sourceDirectory>
    </build>
</project>

BasicExample.java源文件

代码语言:javascript
运行
复制
import org.bytedeco.javacpp.*;
import org.bytedeco.leptonica.*;
import org.bytedeco.tesseract.*;
import static org.bytedeco.leptonica.global.lept.*;
import static org.bytedeco.tesseract.global.tesseract.*;

public class BasicExample {
    public static void main(String[] args) {
        BytePointer outText;

        TessBaseAPI api = new TessBaseAPI();
        // Initialize tesseract-ocr with English, without specifying tessdata path
        if (api.Init(null, "eng") != 0) {
            System.err.println("Could not initialize tesseract.");
            System.exit(1);
        }

        // Open input image with leptonica library
        PIX image = pixRead(args.length > 0 ? args[0] : "/usr/src/tesseract/testing/phototest.tif");
        api.SetImage(image);
        // Get OCR result
        outText = api.GetUTF8Text();
        System.out.println("OCR output:\n" + outText.getString());

        // Destroy used object and release memory
        api.End();
        outText.deallocate();
        pixDestroy(image);
    }
}

项目文件:

https://github.com/bytedeco/javacpp-presets/tree/master/tesseract

相关的StackOvervlow for V4:Using Tesseract from java

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70434438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档