java - Tesseract 3.02.02 崩溃 JRE

标签 java c++ c linux

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

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

Java 运行时环境检测到 fatal error :

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

JRE 版本:Java(TM) SE Runtime Environment (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

最佳答案

我通过在将图像传递给 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 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;
    }

关于java - Tesseract 3.02.02 崩溃 JRE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43069753/

相关文章:

java - Spring 中是否有 ServiceLoader 的类似物以及如何使用它?

java - 变量结果可能尚未初始化

c++ - raspbian (raspberry pi 3) 连接到数据库 (mysql/mariadb)

java - 关于字符串中的括号

c - 如何在C中创建一个二维数组?

JavaFX ScrollPane - 更新时向下滚动

java - 在java应用程序中启动powershell脚本

c++ - 设置窗口提示后 glfwCreateWindow() 不起作用

c - 如何在 C 中使用 fork() 创建倾斜树?

c - 如何检查没有root权限安装的C库?