Tess4j: ошибка доступа к памяти в tess4j java

Я пишу программу, используя 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;   
}

person Kami    schedule 09.02.2016    source источник
comment
Добро пожаловать в Stack Overflow! Вы можете извлечь выгоду из использования хорошего инструмента или метода отладки. С помощью инструмента отладки вы можете пройтись по коду строка за строкой и посмотреть, что он делает. Или вы можете использовать определенные методы, такие как добавление операторов печати или предупреждений, для отслеживания выполнения вашей программы без отладчика. Более полезная информация здесь: Как отлаживать небольшие программы   -  person shoover    schedule 09.02.2016
comment
Убедитесь, что ваша архитектура Java соответствует архитектуре Windows.   -  person mhcuervo    schedule 08.04.2016
comment
Возможный дубликат Tess4J: неверный доступ к памяти   -  person Raedwald    schedule 06.03.2017


Ответы (2)


Преобразуйте свое изображение в оттенки серого, прежде чем запускать tesseract

person Yep    schedule 10.01.2017

Это исключение обычно связано с тем, что Tesseract не может найти папку tessdata. Путь к данным должен быть установлен на родителя этой папки.

String treiningDataPath = "C:\\Users\\Karmen\\Documents\\Bitbucket\\Podjetje\\lib\\Tess4J\\";
person nguyenq    schedule 11.02.2016
comment
Спасибо @nguyenq за ответ... однако это не решает мою проблему... и, я полагаю, будет отображаться для каждого изображения. Однако для некоторых из них это всегда кажется, хотя по данным они кажутся одинаковыми. - person Kami; 22.02.2016
comment
Убедитесь, что ваша архитектура Java соответствует архитектуре Windows. - person mhcuervo; 08.04.2016