Java Optical Character Recognization o.Ä. implementieren / Teilbild im Bild erkennen

iJerkface

Lieutenant
Registriert
März 2012
Beiträge
665
Hallo,

ich habe etwa 4000 Bilder von folgendem Aussehen: Prüfling Nr.1_Alt+_Bild319.png und muss die rot eingekreisten Werte auslesen.
Problem bei der Sache ist, dass die Daten nicht direkt vom Messgerät gelesen werden können, also den Screenshots entnommen werden müssen.

Den Text zu erkennen wäre nun mit einer OCR-Implementation oder Ähnlichem zu machen. Meine Frage also:

Gibt es gute und einfach zu bedienende APIs für Java die entweder den Umgang mit vorhandenen OCR-Implementationen ermöglichen oder es mir ermöglichen anhand "antrainierter Bilder" diese Bilder in meinen Screenshots wiederzufinden?
Also etwa ein Vorgehen wie:
  • Jede Zahl einspeichern ( Ist immer das selbe Font und etwa dieselbe Position der Werte)
  • Screenshot auf Bereich mit den Werten verkleinern
  • Bereich auf Teilbilder ( also die Zahlen ) überprüfen und dementsprechend Text ausgeben


Vielen Dank im Voraus
 
Bei solchen Screenshots sollte man mit OpenCV und der integrierten Tesseract OCR-Engine schon relativ weit kommen.
 
Wie Simpson474 schon sagt ist das ein Job für OpenCV. Ob du dann aber Tesseract nutzt oder eingelernte Referenz-Zeichen muss man ausprobieren. OpenCV bietet die Funktion 'match template' dafür. Dh du suchst in dem Teil-Bild von links nach rechts den besten Treffer und anschließend daneben wieder den besten Treffer. Jeweils werden halt 0-9 und die Zeichen ausprobiert:
http://opencv-python-tutroals.readt...y_template_matching/py_template_matching.html
OpenCV geht wohl mitlerweile auch gut mit Java:
http://opencv.org/opencv-java-api.html
http://docs.opencv.org/2.4/doc/tutorials/introduction/java_eclipse/java_eclipse.html
Ich hätte aber C++ genommen oder Python.

Wenn du so weit bist, dass du die Referenzbilder (Template) hast und du Code postest kann ich dir gern weiter helfen.. hab sowas schonma in C++ gemacht.

Fang erstmal Klein an.
- Erstell ein Teilbild der Region (auch Region of Interest oder SubImage genannt)
- Rufe matchTemplate auf mit einem Zeichen das darin vorkommt und gib die Koordinaten aus. Hierfür brauchst du wohl die Zeichen als Referenz-Bild-Datei auf dem Computer. Bevor du dir die Mühe machst alles einzeln auszuschneiden üb halt lieber erstmal mit 1, 2..
 
Zuletzt bearbeitet:
Würde auch OpenCV emfpehlen, habe solche und ähnliche Sachen damit schon gelöst.
Da sich das alles nach "quick'n'dirty"-Lösung anhört, wäre sicherlich Python die beste Wahl, damit bekommt man mit Abstand am schnellsten und einfachsten Ergebnisse. In C++ mit OpenCV hab ich gefühlt immer mindestens doppelt solange gebraucht, um bei "quick'n'dirty"-Lösungen zum Ziel zu kommen.
Zumal in Python (falls später doch mal mehr gemacht werden muss) neben der OpenCV API auch noch enorm viele andere libraries bereitstehen.

Aber mal eine kleine Rückfrage: Wozu hat man bitte ein solch gammliges Messgerät, auf dessen Funktionsweise man keinen Einfluss hat und das Messdaten *nur* in Bildern abspeichert? Was ist das für ein Schwachsinn? Normalerweise will man doch immer auch mal Wendepunkte, Integrale, lokale Minima/Maxima, ein arithmetisches Mittel, etc. pp. haben...was macht man dann? Aus diesen hässlichen Plots kriegt man ja nie im Leben wieder akkurate, diskrete Werte rausgelesen.
 
Zuletzt bearbeitet:
ascer schrieb:
Aber mal eine kleine Rückfrage: Wozu hat man bitte ein solch gammliges Messgerät, auf dessen Funktionsweise man keinen Einfluss hat und das Messdaten *nur* in Bildern abspeichert? Was ist das für ein Schwachsinn? Normalerweise will man doch immer auch mal Wendepunkte, Integrale, lokale Minima/Maxima, ein arithmetisches Mittel, etc. pp. haben...was macht man dann? Aus diesen hässlichen Plots kriegt man ja nie im Leben wieder akkurate, diskrete Werte rausgelesen.

Ich weiß es auch nicht, ich soll das nur für einen Elektroingenieur verarbeiten :D
OpenCV sieht schonmal recht vielversprechend aus - vielen Dank dafür!
Da ich mit Python so gut wie garnicht umgehen kann werde ich mir vielleicht erstmal die Java API anschauen.
Ich melde mich dann noch einmal in kommender Zeit mit Ergebnissen, nochmal ein dickes Dankeschön !
 
Wenn du dich mit Java auskennst, würd ich nen anderen Weg einschlagen (sofern alle Bilder gleich groß und die Texte auch immer an den gleichen Positionen zu finden sind):

* Nimm die Lib imageJ (sehr Krude Doku, aber wirklich mächtige Library)
* Croppe dir von allen Bildern den Bereich
* Baue aus allen Schnipseln ein neues Bild und speichere es als png, tiff, o.Ä.
* Gib das erzeugte Bild einer x beliebiger OCR Software zum Futter
* Das Ergebnis sollte eine Liste von Werten sein (und bissel Text, die dein Auftraggeber als Eigenleistung gerne selber bereinigen darf ;))

Statt imageJ kannst du auch Javas hausmitteln nehmen oder das Ganze anderweilig Scripten (bspw. mit Photoshop).
 
Zurück
Oben