Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tesseract 3.02.02碰撞JRE_Java_C++_C_Linux - Fatal编程技术网

Java Tesseract 3.02.02碰撞JRE

Java Tesseract 3.02.02碰撞JRE,java,c++,c,linux,Java,C++,C,Linux,我们正在使用Tess4J/Tesseract在Web应用程序上执行OCR。在Windows上,一切正常,但在Linux机器(CentOS 6.8)上部署时,程序崩溃并自动杀死Apache tomcat服务器 我们同时读取多个文件(不同的文件)。如果我们运行OCR,它会在发生致命错误后大约1分钟运行。你能建议如何解决这个问题吗 Java运行时环境检测到一个致命错误: pc=0x00007f7d5934ff90,pid=17649时的SIGSEGV(0xb), tid=140176377489152

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

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

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

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

JRE版本:Java(TM)SE运行时环境(8.0_60-b27)(构建1.8.0_60-b27) Java虚拟机:Java热点(TM)64位服务器虚拟机(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转换为BuffereImage的帮助器方法:


在将图像传递给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转换为BuffereImage的帮助器方法:


在*nix环境中运行它将非常困难。tesseract Java库实际上是一个JNI,Java本机接口。这意味着它是一个C/C++库,具有用Java代码包装的系统特定代码,允许您在Java中执行方法。您必须找到特定于Linux的tesseract版本,才能在Linux机器上使用它。但是,上次我查看时,找不到Linux实现我使用的是Linux(CentOS)支持版本的tesseract我使用的是tesseract版本-3.02.02,leptonica-1.69 libjpeg 6b:libpng 1.2.49:libtiff 3.9.4:zlib 1.2.3。如果对版本进行任何更新,它将解决致命错误?如果您使用
TessBaseAPISetRectangle
从特定区域提取文本,可能在某些图像中,此区域不在图像区域内,然后您会遇到此错误。这就是我犯此错误的原因。在*nix环境中运行此操作将非常困难。tesseract Java库实际上是一个JNI,Java本机接口。这意味着它是一个C/C++库,具有用Java代码包装的系统特定代码,允许您在Java中执行方法。您必须找到特定于Linux的tesseract版本,才能在Linux机器上使用它。但是,上次我查看时,找不到Linux实现我使用的是Linux(CentOS)支持版本的tesseract我使用的是tesseract版本-3.02.02,leptonica-1.69 libjpeg 6b:libpng 1.2.49:libtiff 3.9.4:zlib 1.2.3。如果对版本进行任何更新,它将解决致命错误?如果您使用
TessBaseAPISetRectangle
从特定区域提取文本,可能在某些图像中,此区域不在图像区域内,然后您会遇到此错误。这就是我犯这个错误的原因。