JAVA Tess4j doOCR() не работает, исключение Недопустимый доступ к памяти

Я работаю в динамическом веб-проекте в eclipse, я создал класс TesseractOCR, который содержит:

public class TesseractOCR {

    public TesseractOCR()
    {
    }

    public String doOCR(String file)
    {
         System.setProperty("jna.library.path", "32".equals(System.getProperty("sun.arch.data.model")) ? "lib/win32-x86" : "lib/win32-x86-64");

            File imageFile = new File("C:\\Users\\Sherein Dabbah\\Downloads\\ca096-d7a6d799d7a1d798d799d7a72.jpg");
            Tesseract instance = Tesseract.getInstance();  // JNA Interface Mapping
            Tesseract1 instance1 = new Tesseract1();
            instance.setLanguage("heb+eng");
            // Tesseract1 instance = new Tesseract1(); // JNA Direct Mapping
            // File tessDataFolder = LoadLibs.extractTessResources("tessdata"); // Maven build bundles English data
            // instance.setDatapath(tessDataFolder.getAbsolutePath());
            String sub ="";
            try {
                String result = instance.doOCR(imageFile);
                int indx1 = 6+result.indexOf("אבחנות");
                int indx2 = result.indexOf("הפניות");
                sub = result.substring(indx1,indx2-1);
                System.out.println(sub);
            } catch (Exception e) {
                System.err.println(e.getMessage());
            }

            return sub;
    }
}

пока есть сервлет, содержащий функцию doPost()

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

         System.setProperty("jna.library.path", "32".equals(System.getProperty("sun.arch.data.model")) ? "lib/win32-x86" : "lib/win32-x86-64");

         response.setContentType("text/html;charset=UTF-8");

            // Create path components to save the file
            final String path = "C:\\Users\\Sherein Dabbah\\Desktop\\med"; //request.getParameter("destination");
            final Part filePart = request.getPart("file");
            final String fileName = filePart.getSubmittedFileName();

            OutputStream out = null;
            InputStream filecontent = null;
            PrintWriter writer = response.getWriter();

            if(fileName == ""){
                writer.println("You either did not specify a file to upload or are "
                        + "trying to upload a file to a protected or nonexistent "
                        + "location.");
                return;
            }

            String fullName = path + File.separator+ fileName;

            try {
                File newFile = new File(fullName);
                out = new FileOutputStream(newFile);
                filecontent = filePart.getInputStream();

                int read = 0;
                final byte[] bytes = new byte[1024];

                while ((read = filecontent.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }

                writer.println("New file " + fileName + " created at " + path);
                LOGGER.log(Level.INFO, "File{0}being uploaded to {1}", 
                        new Object[]{fileName, path});

            } catch (FileNotFoundException fne) {
                writer.println("You either did not specify a file to upload or are "
                        + "trying to upload a file to a protected or nonexistent "
                        + "location.");
                writer.println("<br/> ERROR: " + fne.getMessage());

                LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}", 
                        new Object[]{fne.getMessage()});
            } finally {
                if (out != null) {
                    out.close();
                }
                if (filecontent != null) {
                    filecontent.close();
                }
                if (writer != null) {
                    writer.close();
                }
            }

            String s = new TesseractOCR().doOCR(fullName);
            System.out.println(s);
        }

У меня есть исключение:

   Sep 06, 2015 10:36:46 AM org.apache.catalina.core.StandardWrapperValve invoke
     SEVERE: Servlet.service() for servlet [servlets.UploadServlet] in context   with path [/up] threw exception [Servlet execution threw an exception] with root      cause
    java.lang.Error: Invalid memory access
    at com.sun.jna.Native.invokePointer(Native Method)
    at com.sun.jna.Function.invokePointer(Function.java:470)
    at com.sun.jna.Function.invoke(Function.java:404)
    at com.sun.jna.Function.invoke(Function.java:315)
    at com.sun.jna.Library$Handler.invoke(Library.java:212)
    at com.sun.proxy.$Proxy4.TessBaseAPIGetUTF8Text(Unknown Source)
    at net.sourceforge.tess4j.Tesseract.getOCRText(Unknown Source)
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source)
    at classes.TesseractOCR.doOCR(TesseractOCR.java:28)
    at servlets.UploadServlet.doPost(UploadServlet.java:111) 
    at...

Он терпит неудачу в строке:

String result = instance.doOCR(imageFile); in TesseractOCR class

person Sheren    schedule 06.09.2015    source источник
comment
Возможный дубликат Tess4J: неверный доступ к памяти   -  person Raedwald    schedule 06.03.2017


Ответы (2)


Вероятно, вам нужно будет вызвать setDatapath, чтобы сообщить ему, где найти папку tessdata для файлов .traineddata.

Кроме того, вам больше не нужно устанавливать переменную jna.library.path, поскольку теперь tess4j может автоматически извлекать и загружать собственные библиотеки.

person nguyenq    schedule 06.09.2015
comment
Я ломал голову, и это сработало внезапно, как заклинание! - person Aryan Venkat; 26.03.2016

В этом случае выбор языка также имеет значение. Я обрабатывал изображение с помощью lang=hin+eng, но выдавал ту же ошибку (упомянутую в этом посте)

Поскольку английского текста на изображении было меньше, я изменил lang=hin и получил ожидаемый результат.

public static void main(String[] args) {
        Tesseract in = new ReadImageText().getTesseractInstance("C:/Program Files (x86)/Tesseract-OCR/tessdata/", "hin");
        try {
            String resultText = in.doOCR(new File("C:/EA/app-result/im/01-001/34/0.png"));
            log.info("resultText {}", resultText);
        } catch (TesseractException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
person drt    schedule 18.05.2018