2013-08-07 6 views
7

Ich benutze Tess4j, den Java-Wrapper von Tesseract. Ich habe auch den normalen Tesseract installiert. Ich bin mir nicht ganz sicher, wie Tess4j funktionieren soll, aber da es einen Tessdata-Ordner enthält, kann ich davon ausgehen, dass Sie die Sprachdateien dort ablegen würden. Tess4j funktioniert jedoch nur, wenn sich die Sprachdateien im "echten" tessdata-Ordner befinden (der mit tesseract, nicht mit tess4j). Wenn ich diesen Ordner löschen, erhalte ich diese Fehlermeldung:Tess4j verwendet nicht seinen Tessdata-Ordner

Error opening data file C:\Program Files\Tesseract-OCR\tessdata/jpn.trained 
data 
Please make sure the TESSDATA_PREFIX environment variable is set to the par 
ent directory of your "tessdata" directory. 
Failed loading language 'jpn' 
Tesseract couldn't load any languages! 
# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x631259dc, pid=5108, tid= 
10148 
# 
# JRE version: 7.0_06-b24 
# Java VM: Java HotSpot(TM) Client VM (23.2-b09 mixed mode, sharing windows 
-x86) 
# Problematic frame: 
# C [libtesseract302.dll+0x59dc] STRING::strdup+0x467c 
# 
# Failed to write core dump. Minidumps are not enabled by default on client 
versions of Windows 
# 
# An error report file with more information is saved as: 
# D:\School\Programs\OCRTest\v1.0.0\hs_err_pid5108.log 
# 
# If you would like to submit a bug report, please visit: 
# http://bugreport.sun.com/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
# 

Heißt das, ich brauche Tesseract installiert haben tess4j zu benutzen? Warum? Oder maby mein Tess4j Tessdata Ordner ist an der falschen Stelle (Es ist derzeit mit meinen. Java-Dateien, die Tess4j Jars sind in einem lib-Ordner, auf den ich einen Klassenpfad eingestellt haben).

+0

Was passiert, wenn Sie Ihre 'TESSDATA_PREFIX-Umgebungsvariable' auf den Tessdata-Ordner Ihres Tess4J zeigen? – sschrass

+1

Nun, das behebt mein Problem. Ich muss mich an Umgebungsvariablen besser gewöhnen, um diese Schwierigkeiten zu vermeiden. Eine weitere Frage: Würde alles noch funktionieren, wenn Sie das Programm auf einem anderen Computer ausführen, auf dem der Pfad nicht festgelegt ist? –

Antwort

3

Lassen Sie Ihre TESSDATA_PREFIX environment variable auf den Tessdata-Ordner Ihres Tess4j verweisen.

Normalerweise setzen Sie diese Variable bei einer Installation auf dem System, aber Sie vielleicht eine Lösung finden Sie hier: How do I set environment variables from Java?

Sie haben es auf dem System zu tun, die Ihre App läuft, weil die tessdata .dll s davon abhängen Umgebungsvariable.

+0

setDatapath (siehe Antwort von nguyenq), könnte die Einstellung der Umgebungsvariablen umgehen, das ist cool.Aber wie Nguyenq sagte, wird eine definierte env-Variable sie außer Kraft setzen, und das ist nicht cool: – sschrass

0

Vielleicht haben Sie nicht die tessdata Ordner in Ihrem Hauptprojektordner. Dieser Ordner enthält alle Tesserakts unterstützte Sprache (es enthält Dateien mit .traineddata, .bigrams, .fold, .lm, .nn, .params, .size und .word-freq Erweiterungen) Wenn Sie es nicht haben, gehen Sie folgendermaßen vor:

  1. herunterladen tessdata-Master-Ordner von github.com/tesseract-ocr/tessdata (von Download ZIP-Taste)
  2. entpacken Sie die Inhalte von tessdata-master.zip Datei in Ihrem Hauptprojektordner
  3. Umbenennen tessdata-master bis tessdata
  4. Führen Sie Ihr Java-Projekt und testen Sie, ob es funktioniert. Zumindest funktioniert das für mich.
0

Für diejenigen, die Maven verwenden und nicht gefällt, globale Variablen zu verwenden, das funktioniert für mich:

File imageFile = new File("C:\\random.png"); 
Tesseract instance = Tesseract.getInstance(); 

//In case you don't have your own tessdata, let it also be extracted for you 
File tessDataFolder = LoadLibs.extractTessResources("tessdata"); 

//Set the tessdata path 
instance.setDatapath(tessDataFolder.getAbsolutePath()); 

try { 
    String result = instance.doOCR(imageFile); 
    System.out.println(result); 
} catch (TesseractException e) { 
    System.err.println(e.getMessage()); 
} 

here gefunden, getestet mit Maven -> net.sourceforge.tess4j: tess4j: 3.4 .1, auch der Link Verwendung 1.4.1 jar

Verwandte Themen