Tess4j OcrEngineMode CUBE ONLY: недопустимый доступ к памяти

Я хочу отсканировать изображение (изображение в формате tif), чтобы получить номер. Когда Tess4J настроен на движок по умолчанию, он часто путает 6 с 5, 0 с 9 ... Я хотел бы попробовать его с движком CUBE ONLY.

Это файл myconfig:

  tessedit_ocr_engine_mode 2
  load_system_dawg F
  load_freq_dawg F
  load_punc_dawg F
  load_number_dawg F
  load_unambig_dawg F
  load_bigram_dawg F
  load_fixed_length_dawgs F
  user_words_suffix    user-words
  user_patterns_suffix    user-patterns

Это мой код Java

   public class App {

    public static final String NUMBERS = "Oo0123456789";
        public static final String TESSDATA_PATH_FOLDER = "D:/compuwork/ambienti/workspace_mars/ocrmaven/tessdata";



    private static final Logger logger = LoggerFactory.getLogger(new LoggHelper().toString());

    Tesseract1 instance;

        String nomeCartella="005";
        String path = "D:\\Documenti\\OCR\\scansioni\\"+nomeCartella;
        String resultPath = "D:\\Documenti\\OCR\\RISULTATI\\"+nomeCartella;
        String resultCorrettiPath = resultPath+"\\"+"corretti";
        String resultErratiPath = resultPath+"\\"+"errati";
        String tmpPath = resultPath+"\\tmpImmagine";
        String anotherCopy = resultPath+"\\"+"ad";
        String preScanPath = resultPath+"\\prescan";

        int validi = 0;
        int nonValidi = 0;

    public static void main( String[] args ) {

        try {    

            //write my dictionary
            File fileDir = new File(TESSDATA_PATH_FOLDER+"\\"+"eng.user-words");
            Writer out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(fileDir), "UTF8"));

            for(int i=120000; i<200000;i++) {
                out.append(""+i).append("\r\n");
            }
            out.flush();
            out.close();

            //write my pattern
            fileDir = new File(TESSDATA_PATH_FOLDER+"\\"+"eng.user-patterns");
            out = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(fileDir), "UTF8"));
            out.append("\\d\\d\\d\\d\\d\\d");
            out.flush();
            out.close();

            new App().testTesseractGlobalV();
            System.exit(0);
        } catch(Exception e) {
            e.printStackTrace();
        }

    }

    public App() {
        instance = new Tesseract1(); 
        instance.setLanguage("eng");
        instance.setDatapath(TESSDATA_PATH_FOLDER);
        instance.setPageSegMode(TessPageSegMode.PSM_AUTO);
        instance.setTessVariable("tessedit_char_blacklist", "èéìà§ùòç$£&%éÎÉÈ");
        instance.setTessVariable("file_type", ".tiff");
        List<String> configs = Arrays.asList("myconfig");
        instance.setConfigs(configs);
    }



    public void testTesseractGlobalV() {    

        File samples = new File(path);    

        //my Verify Result
        Verificator verSerieV = new Verificator();       

        File outputFile = null;
        BufferedImage bi = null;

        int imgCount = 0;
        for (File imageFile : samples.listFiles()) {
            System.out.println("******* IMG "+imgCount+++" ******");

            try {                        
                 bi = ImageIO.read(imageFile);
                 verSerieV.setRegionScan(new Rectangle(verSerieV.getRegionScan().x,verSerieV.getRegionScan().y,(int)(bi.getWidth() - verSerieV.getRegionScan().x), verSerieV.getRegionScan().height));
                 bi = ImageHelper.getSubImage(bi, verSerieV.getRegionScan().x, verSerieV.getRegionScan().y, verSerieV.getRegionScan().width, verSerieV.getRegionScan().height);


                 Binirization binarization = new Binirization(bi);
                 binarization.DoBinirization();
                 BufferedImage nuovaTest = binarization.getImg();
                 String nameFile = imageFile.getName();
                 File mFile = new File(preScanPath+"\\"+nameFile);
                 ImageIO.write(nuovaTest,"tif", mFile);      
                 System.out.println("scanning "+nameFile);

                 String result = instance.doOCR(nuovaTest); //throw java.lang.Error

                 ...

Это полное сообщение об ошибке

Exception in thread "main" java.lang.Error: Invalid memory access
    at net.sourceforge.tess4j.TessAPI1.TessBaseAPIInit1(Native Method)
    at net.sourceforge.tess4j.Tesseract1.init(Tesseract1.java:338)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:247)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:231)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:212)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:196)
    at tess4j.example.App.testTesseractGlobalV(App.java:158)
    at tess4j.example.App.main(App.java:97)
init_cube_objects(true, &tessdata_manager):Error:Assert failed:in file ..\..\ccmain\tessedit.cpp, line 209

Я использую eclipse, проект maven:

   <dependency>
        <groupId>net.sourceforge.tess4j</groupId>
        <artifactId>tess4j</artifactId>
        <version>3.0.0</version>
    </dependency>

person bancomat    schedule 29.02.2016    source источник


Ответы (2)


Вам нужно будет загрузить eng.cube.* файлы данных и поместить их в tessdata папку.

TESSDATA_PATH_FOLDER должен быть установлен на D:/compuwork/ambienti/workspace_mars/ocrmaven/.

person nguyenq    schedule 01.03.2016

Большое спасибо, nguyenq!

Я починил свой TESSDATA_PATH_FOLDER и скачал несколько недостающих файлов eng.cube.* по вашей ссылке ...

Это работает с этим myconfig:

    tessedit_ocr_engine_mode 1
    user_words_suffix    user-words
    user_patterns_suffix    user-patterns

и удаление instance.setPageSegMode(TessPageSegMode.PSM_AUTO); из конструктора App () ...

Вместо этого попробуйте с файлом myconfig:

  tessedit_ocr_engine_mode 1
  load_system_dawg F
  load_freq_dawg F
  load_punc_dawg F
  load_number_dawg F
  load_unambig_dawg F
  load_bigram_dawg F
  load_fixed_length_dawgs F
  user_words_suffix    user-words
  user_patterns_suffix    user-patterns

и удалив instance.setPageSegMode(TessPageSegMode.PSM_AUTO) из конструктора App (), есть следующее исключение:

    Exception in thread "main" java.lang.Error: Invalid memory access
    at net.sourceforge.tess4j.TessAPI1.TessBaseAPIGetUTF8Text(Native Method)
    at net.sourceforge.tess4j.Tesseract1.getOCRText(Tesseract1.java:402)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:258)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:231)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:212)
    at net.sourceforge.tess4j.Tesseract1.doOCR(Tesseract1.java:196)
    at tess4j.example.TestP.verify(TestP.java:96)
    at tess4j.example.App.main(App.java:77)    
person bancomat    schedule 01.03.2016
comment
Снова проверьте свой путь к данным. Недействительный доступ к памяти обычно связан с тем, что Tesseract не может найти свою tessdata папку. Некоторые пользователи также сообщали, что их изображения иногда вызывали эту проблему. В таких случаях потребуется обработка изображения. - person nguyenq; 01.03.2016