Nabend,
Ich wollte mir vor langer Zeit mal etwas bauen, um meine Zählerstände
automatisch zu erfassen.
Die Idee ist realtiv einfach: WebCam vor den Zähler geklemmt, Bild
machen, und den Zählerstand aus dem Bild holen.
Mein damaliger erster Ansatz, war mit OpenCV. Da bin ich aber nicht
sonderlich weit gekommen, denn OCR kann doch schon relativ komplex
werden.
Nun hab ich heute aber Bücher bekommen, unter anderem:
Web Scraping with Python
http://www.amazon.de/Web-Scraping-Python-Comprehensive-Collection/dp/1491910291/ref=sr_1_1?ie=UTF8&qid=1457208782&sr=8-1&keywords=web+scraping+with+python
In diesem Buch finden sich unter anderem kurze Beispiele für OCR (wusste
ich nicht, als ich das Buch bestellte!) mit Pillow und tesseract. Also
mal kurz die 3 Seiten gelesen und ich hab neue hoffnung auf eine
"einfache" OCR-Lösung geschöpft.
Also schnell zum Gas-Zähler gelaufen, ein Bild gemacht, und losprobiert.
Das Bild (test.jpg) ist noch manuell nachbearbeitet (wie man sieht),
wegen dem Blitz vom Handy. Aber Es funktioniert! Ich bekomme tatsächlich
den Zählerstand (4380) als text geliefert! Das ist sooo super :)
Ausprobiert hab ich das ganze jetzt unter Linux, mit Python 3.5.1.
Weiterhin braucht es tesseract und das Python-Modul Pillow.
Vielleicht hilft das ja nochmal wem! :-)
Grüße
Setze ich den Threshold von 170 auf 212 funktioniert das ganze auch mit
diesem nicht bearbeiteten Bild.
Ist natürlich alles noch nicht rund, und funktinoiert momentan nur, wenn
die Zahlen ganz drauf sind. Aber für den Anfang find ich das schon
ziemlich cool.
Was ist denn hier los?
Das hat weder was mit Python, noch irgendwas anderem zu tun - du rufst
ein Programm auf - tesseract - mit ein "paar" Parametern (die bei jedem
wieder anders sind).
Was ist hier den Post wert? Die Tatsache dass du erkannt hast, dass du
mit Python ein Programm aufrufen kannst?
Die Tatsache, dass du Tesseract gefunden hast?
Hallo Kaj, hallo S R
S R schrieb:> Was ist hier den Post wert? Die Tatsache dass du erkannt hast, dass du> mit Python ein Programm aufrufen kannst?> Die Tatsache, dass du Tesseract gefunden hast?
Das individuelle Erfolgserlebnis, wenn man soetwas erkannt hat, und wie
einfach es mit den entsprechenden Tools ist, ist schon so einen Post
wert.
Vor allem, wenn es, wie zum Beispiel mir, auch den Mund wässerig macht,
damit mal zu experimentieren. ;O)
Wenn Du da mit nichts anfangen kannst, lass es doch einfach kommentarlos
liegen. Mach ich auch, wenn ich im Netzt beim herumstöbern etwas finde,
womit ich nichts anfangen kann. ;O)
An den TO (Kaj): Weiterhin viel Erfolg. Hast Du Links auf ein gutes
Tutorial zu Tesseract? Ansonsten wärest Du jetzt in der guten Position,
eines zu schreiben, solange Deine Erinnerungen an Deinen eigenen
Einstieg noch frisch sind.
Leute, die wirklich Ahnung haben, können möglicherweise gute Doku
schreiben, aber kaum gute Tutorials, Darum solltest Du das vorher
erledigen, bevor Du zuviel darüber weisst, Mach Dir zumindest selber ein
paar Notitzen. Sonst fängst Du im Herbst neu an.
Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.l02.de
Hi Bernd,
Bernd W. schrieb:> Vor allem, wenn es, wie zum Beispiel mir, auch den Mund wässerig macht,> damit mal zu experimentieren. ;O)
Das freut mich :)
Bernd W. schrieb:> hast Du Links auf ein gutes Tutorial zu Tesseract?
Tutorial ist übertrieben, hier ist ein Heise-Artikel zu Tesseract, aus
dem Jahr 2012:
http://www.heise.de/open/artikel/Toolbox-Texterkennung-mit-Tesseract-OCR-1674881.html
Hier ist das GitHub-Repo: https://github.com/tesseract-ocr
Wie S R ja schon festgestllt hat:
Tesseract ist ein eigenständiges Programm (und ich hab nie was anderes
behauptet). In dem Heise-Artikel ist die Rede davon, dass das Bild als
TIFF vorliegen sollte. Ich hab hier jetzt jpeg genommen, funktioniert
auch.
Der Aufruf von Tesseract ist wie folgt:
1
tesseract bilddatei ausgabedatei [sprache]
2
3
z.B.
4
5
tesseract test.jpg output -l deu
tesseract öffnet das Bild "test.jpg", schreibt den erkannten Text in die
Datei "output.txt" (die Erweiterung ".txt" wird automatisch angehangen,
deswegen muss man sie nicht angeben), und der erkannte Text wird als
deutsch interpretiert. Man kann den Sprach parameter auch weglassen, ich
denke mal das dann englisch als default sprache genommen wird.
Das Aufrufen von tesseract ist also sehr einfach. Das alleine reicht
aber nicht.
Mach ich z.B. ein Screenshot (bei normaler Browser Zoomstufe: 100%) von
einem Textteil aus dem Heise-Artikel, so ist Ergebnis nicht so der
Knaller. Pro Zeile mind. 1 Fehler.
Stell ich die Browser Zoomstufe aber 150% und mache einen neuen
Screenshot so ist Ergebnis schon sehr gut: 1 Fehler im Gesamten
ausschnitt.
Aber auch das alleine reicht noch nicht, für das, was ich machen will.
Denn schiebt man das reine Bild vom Zähler in tesseract rein, so kommt
einfach nichts raus. Es werden keine Zeichen gefunden, oder im
bestenfalle Schrott.
An dieser Stelle kommt Python mit Pillow ins Spiel. Statt Pillow könnte
man auch OpenCV nehmen, statt Python könnte man C/C++ nehmen...
Ich nehme hier aber Python mit dem Pillow-Modul.
Tesseract scheint ein sehr großes Problem mit dem
Kontrast(?)/Farbverläufen im Hintergrund zu haben. Man muss also dafür
sorgen, dass sich das was man haben will von dem Rest auf dem Bild
unterscheidet. Um bei meinen Zählerständen zu bleiben: Alles außer die
gesuchten Zeichen sollte Schwarz sein. Ich häng mal die zwei Bilder an,
damit man sieht, wie die Bilder aussehen, nachdem das Bild mit Pillow
bearbeitet wurde.
Erst nach dieser manipulation ist tesseract in der Lage die Zeichen zu
extrahieren.
Die Bilder von meinem Zähler hab ich mit meinem Handy gemacht, mit einer
Auflösung von 3840 x 2160, und hab dann nur das Ausgeschnitten, was mich
interessiert. Wie das dann mit einer (guten Full HD) WebCam wird, muss
man sehen. Sollte aber kein Problem sein. Wenn man das ganze so aufbaut,
und gut beleuchtet, dass die Plastikscheibe des Zählers nicht so
reflektiert...
Gerade jetzt am Anfang ist es natürlich viel Experimentieren, wie man
die Kamera positionieren muss, und wie man dann den Threshold einstellen
muss, damit Zeichen erkannt werden.
Joa, soweit erstmal dazu.
Grüße :)
Ich will ja das Erfolgserlebnis des TE nicht schlechtreden, aaaber:
Um unter quasi konstanten Bedingungen und aus einem sehr begrenzten
Zeichenvorrat ein par Zeichen wiederzuerkennen, benötigt man kein
ausgewachsenes OCR-Programm, das geht auch mit ein par
selbstgeschriebenen Funktionen: Bildoptimierung, Symbolvereinzelung,
Größennormierung, Mustervergleich ... sofern man Zeit und Lust hat, sich
damit zu beschäftigen.
Spaßig wird es erst, wenn der Zähler keine Digitalanzeige hat, sondern
Ziffernwalzen, die nicht sauber von einer Ziffer auf die nächste
springen, sondern im Übergangsbereich nur Teile benachbarter Ziffern
zeigen.
Frank E. schrieb:> benötigt man kein> ausgewachsenes OCR-Programm
Ja, mag sein. Aber es hat eben nicht jeder immer die Zeit, Geduld, und
Wissen um sein eigene kleine OCR-Engine zu entwicklen. Gerade im
Hobbybereich möchte man manchmal einfach ein Ergebnis. Und so ist es
jedem Möglich sowas für seine Zwecke zu nutzen.
"Um den Sinus zu berechnen braucht man ja wohl keine standard Funktion,
das kann jeder selber von Hand machen... sofern Zeit und Lust
vorhanden."
Selbe Aussage, anderes Beispiel ;)
Frank E. schrieb:> sofern man Zeit und Lust hat, sich> damit zu beschäftigen.
Genau das ist der Punkt.
Mancheiner würde diese Aufgabe womöglich mit Matlab/Octave, oder einem
Container mit AWS-Cloud lösen. Ich mach es halt so. :)
Wolfgang schrieb:> Spaßig wird es erst, wenn der Zähler keine Digitalanzeige hat, sondern> Ziffernwalzen
Genau das hab ich ja. Hab hier nur erstmal "schöne" Zählerstände
genommen. Und ja, da wünsche ich mir gerade einen Zähler mit
Digitalanzeige :D
Grüße