正方体 3.02.02 崩溃 JRE

Posted

技术标签:

【中文标题】正方体 3.02.02 崩溃 JRE【英文标题】:Tesseract 3.02.02 Crash JRE 【发布时间】:2017-03-28 12:35:44 【问题描述】:

我们正在使用 Tess4J/Tesseract 在 web 应用程序上执行 OCR。在 Windows 上一切正常,但在 Linux 机器(CentOS 6.8)上部署时,程序崩溃并自动终止 Apache tomcat 服务器。

我们同时读取了多个文件(不同的文件)。如果我们运行 OCR,它会在发生致命错误后运行大约 1 分钟。你能建议如何解决吗?

Java 运行时环境检测到致命错误:

SIGSEGV (0xb) 在 pc=0x00007f7d5934ff90, pid=17649, tid=140176377489152

JRE 版本:Java(TM) SE 运行时环境 (8.0_60-b27) (build 1.8.0_60-b27) Java VM:Java HotSpot(TM) 64 位服务器 VM(25.60-b23 混合模式 linux-amd64 压缩 oops) 有问题的框架:

 C [libtesseract.so.3.0.2+0x22cf90] tesseract::HistogramRect(unsigned char const*, int, int, int, int, int, int, int*)+0x70

无法写入核心转储。核心转储已被禁用。要启用核心转储,请在再次启动 Java 之前尝试ulimit -c unlimited

【问题讨论】:

您将很难在 *nix 环境中运行它。 Java的tesseract库实际上是一个JNI,Java Native Interface。这意味着它是一个 C/C++ 库,其中包含在 Java 代码中的系统特定代码,以允许您在 Java 中执行方法。您必须找到 Linux 特定版本的 tesseract 才能在 Linux 机器上使用它。但是,我上次查看时找不到 Linux 实现 我正在使用 Linux(CentOS) 支持版本的 tesseract pkgs.org/download/tesseract 我正在使用 tesseract 版本 - 3.02.02,leptonica-1.69 libjpeg 6b:libpng 1.2.49:libtiff 3.9.4:zlib 1.2.3。如果有任何更新版本,它将解决致命问题错误? 如果您使用TessBaseAPISetRectangle 从某个区域提取文本,可能在某些图像中该区域不在图像区域内,然后您会收到此错误。这就是我这个错误的原因。 【参考方案1】:

在将图像传递给 tess4j 之前,我通过在 javacv 中将图像大小调整为固定大小(我猜你可以调整百分比大小)来修复它。

我的调整大小方法示例。

public static IplImage resize(IplImage img_source)
        IplImage resized = IplImage.create(600, 480, img_source.depth(), img_source.nChannels());
        cvResize(img_source,resized);
        return resized;
    

然后我在下面进行 tesseract 提取:

public static String extract(BufferedImage bi, Rectangle r) throws CvHandler, IOException, TesseractException
        ITesseract tess = new Tesseract();
        String tessPath = getTess();
        tess.setPageSegMode(1);
        tess.setLanguage("eng");
        tess.setDatapath(tessPath);
        tess.setOcrEngineMode(TessOcrEngineMode.OEM_DEFAULT);
        tess.setTessVariable("load_system_dawg", "false");
        tess.setTessVariable("load_freq_dawg", "false");
        tess.setTessVariable("tessedit_create_hocr", "0");
        tess.setTessVariable("tessedit_char_whitelist","ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

        String result = "";
        if (!r.getBounds().isEmpty())
            try
                result = tess.doOCR(bi, r);
            catch(TesseractException e)
                throw new CvHandler(e.getMessage());
            
        else result = tess.doOCR(bi);

        return result;
    

IplImage转BufferedImage的Helper方法Source:

public static BufferedImage convertIplToBuffered(IplImage img)

        OpenCVFrameConverter.ToIplImage grabberConverter = new OpenCVFrameConverter.ToIplImage();
        Java2DFrameConverter paintConverter = new Java2DFrameConverter();
        Frame frame = grabberConverter.convert(img);
        BufferedImage img_result = paintConverter.getBufferedImage(frame,1);

        return img_result;
    

【讨论】:

以上是关于正方体 3.02.02 崩溃 JRE的主要内容,如果未能解决你的问题,请参考以下文章

带有 JNA 的 C 回调使 JRE 崩溃

Mac OS X Yosemite 上的 ElasticSearch + Node:JRE 崩溃?

GeoServer WMS 崩溃

ADT 经常崩溃

双打编辑导致崩溃的二维向量

Java多线程声音崩溃