当前位置: 首页 > 知识库问答 >
问题:

Tess4j:Tess4j java中的内存访问错误

闻人和泽
2023-03-14

我正在使用tess4j.jar编写一个程序。该程序正在从图像中提取文本及其位置。我得到这个错误:

Exception in thread "main" java.lang.Error: Invalid memory access
at net.sourceforge.tess4j.TessAPI1.TessBaseAPIRecognize(Native Method)
at TesseractUtility.TessBoxForLogo.run(TessBoxForLogo.java:50)

有趣的是,它不会出现在每张图片上。有人知道我哪里出错了吗?

这是我的代码:

public static ArrayList<Info> run(String imageName, List<String[]> wordsToFind){
    int WayToGetInfo = TessAPI1.TessPageIteratorLevel.RIL_TEXTLINE;
    wordsToFind = ParsData.addAnomalie(wordsToFind);
    //Prepare lists
    ArrayList<Info> infos = new ArrayList<Info>();
    ArrayList<Rect> rectangles = new ArrayList<Rect>();

    //Buff image
    File imageFile = new File(imageName);
    BufferedImage image = null;
    ByteBuffer buf = null;
    int w = 0;
    int h = 0;
    try {
        image = ImageIO.read(new FileInputStream(imageFile));
        w = image.getWidth();
        h = image.getHeight();

        buf = ImageIOHelper.convertImageData(image);
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 

    //Get image dimensions
    int bpp = image.getColorModel().getPixelSize();
    int bytespp = bpp / 8;
    int bytespl = (int) Math.ceil(w * bytespp);

    //Tess4 preparation
    TessBaseAPI handler = TessAPI1.TessBaseAPICreate();
    String treiningDataPath = "C:\\Users\\Karmen\\Documents\\Bitbucket\\Podjetje\\lib\\Tess4J\\tessdata";
    String lang = "slv";
    TessAPI1.TessBaseAPIInit3(handler, treiningDataPath, lang);
    TessAPI1.TessBaseAPISetPageSegMode(handler, TessAPI1.TessPageSegMode.PSM_AUTO_ONLY);
    TessAPI1.TessBaseAPISetImage(handler, buf, w, h, bytespp, bytespl);

    TessAPI1.TessBaseAPIRecognize(handler, null);

    TessResultIterator ri = TessAPI1.TessBaseAPIGetIterator(handler);
    Pointer str = TessAPI1.TessResultIteratorGetUTF8Text(ri, WayToGetInfo);
    TessAPI1.TessPageIterator pi = TessAPI1.TessResultIteratorGetPageIterator(ri);
    TessAPI1.TessPageIteratorBegin(pi);

    //Iterate thru rows
    while (TessAPI1.TessPageIteratorNext(pi,WayToGetInfo) == TessAPI1.TRUE){
        str = TessAPI1.TessResultIteratorGetUTF8Text(ri, WayToGetInfo);
        if (str!=null){
            float confidence = TessAPI1.TessResultIteratorConfidence(ri, WayToGetInfo);
            String word = str.getString(0);
            IntBuffer leftB = IntBuffer.allocate(1);
            IntBuffer topB = IntBuffer.allocate(1);
            IntBuffer rightB = IntBuffer.allocate(1);
            IntBuffer bottomB = IntBuffer.allocate(1);

            TessAPI1.TessPageIteratorBoundingBox(pi, WayToGetInfo, leftB, topB, rightB, bottomB);
            int left = leftB.get();
            int top = topB.get();
            int right = rightB.get();
            int bottom = bottomB.get();
            Rect rectangle1 = new Rect((int) (left-0.05*left), 
                                       (int) (top-0.05*top), 
                                       (int) ((right+0.05*right)-(left-0.05*left)),
                                       (int) ((bottom+0.5*bottom)-(top-0.05*top)));
            rectangles.add(rectangle1);

            String kword = "";
            for (String[] s:wordsToFind){
                //System.out.println(s[1]);
                if (word.toLowerCase().contains(s[1].toLowerCase())
                        ){
                    Rect rect = new Rect(left, top, right-left,bottom-top);
                    infos.add(copmare(word, s, rect, confidence));
                    kword = s[0];
                }
            }       
        }
    }
    draw(imageName, rectangles);
    return infos;   
}

共有2个答案

廖令
2023-03-14

该异常通常是由于Tesseract找不到tessdata文件夹。数据路径应设置为该文件夹的父级。

String treiningDataPath = "C:\\Users\\Karmen\\Documents\\Bitbucket\\Podjetje\\lib\\Tess4J\\";
邹俊拔
2023-03-14

在运行镶嵌之前将图像转换为灰度

 类似资料:
  • 问题内容: 我出于好奇而学习x86汇编。我目前正在使用带有NASM汇编器的基于Linux的操作系统。我很难理解为什么 会导致分段错误(将ebx寄存器的内容移至内存位置0xFFF时)。我当时以为在纯asm中构建程序将使我能够不受限制地访问进程的虚拟地址空间。不是吗? 您将如何在程序集中实现类似堆的内容? 问题答案: 在Linux(x86)上-尽管您的进程中的虚拟地址范围为4gb,但并非所有虚拟地址都

  • 我在用Linux。 我有一个函数叫like: 其功能是: 但我无法访问在线内存: 声明audioExtension: 所以,我希望有: 发生什么事了? 注意:我已尝试: 但无论如何都没用。 musicFile不是常量。我不想声明一个tempchar[80]以避免文件名太长时溢出,如示例cc引用 提前道谢。

  • 问题内容: 我正在尝试直接为嵌入式Linux项目访问物理内存,但是我不确定如何最好地指定使用的内存。 如果我定期引导设备并访问/ dev / mem,则可以轻松地对其几乎任何位置进行读写。但是,在这种情况下,我正在访问可以轻松分配给任何进程的内存。我不想做 我的/ dev / mem代码是(删除了所有错误,等等。): 这可行。但是,我想使用没有其他人会碰到的内存。我尝试通过使用mem = XXXm

  • 使用JNA时,我在调用方法时收到无效内存访问错误。 下面是我映射DLL的接口: 我有另一个带有常量的类: 以下是代码中出现的位置: 我知道1假设立即落在类型在dll中不匹配的事实上。但是头文件明确说明返回类型是int: lpszUserName是指向包含用户名的ASCIIZ字符串的指针。 pszUserPassword是一个指向包含用户密码的ASCIIZ字符串的指针。 lpszDesc是一个指向缓

  • 问题内容: 我已经从事Java项目一年了。我的代码已经工作了好几个月了。几天前,我在Mac(Snow Leopard 10.6.8)上将Java SDK升级到最新版本1.6.0_26。升级后,发生了一些非常奇怪的事情。当我运行某些类时,出现此错误: 位置0x202 rip = 0x202的无效内存访问 但是,如果我使用- Xint(已解释)运行它们,它们会工作,但速度较慢,但​​效果很好。我在使用

  • 问题内容: 在这篇“ 接口Linux信号”文章之后,我一直试图在 amd64中* 使用,但是在发送信号时总是会遇到 内存访问错误 。使用 C / C ++ 函数时, struct sigaction 有效。 * 通话有什么问题? 具有ASM代码的C / C ++: 编译 发送信号 问题答案: 在x86-64 linux中,必须提供a,而您尚未提供。 内核源码的相关部分: 在C库包装为您完成此: 使