Forum: PC-Programmierung Python OCR - (Gas/Strom)Zählerstand ablesen


von Kaj G. (Firma: RUB) (bloody)


Angehängte Dateien:

Lesenswert?

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 :)
1
#!/usr/bin/env python
2
3
from PIL import Image
4
import subprocess
5
6
7
def clean_file(file_path, new_file_path):
8
    img = Image.open(file_path)
9
10
    #   Set threshold for image and save
11
    img = img.point(lambda x: 0 if x<170 else 255)
12
    img.save(new_file_path)
13
14
    #   call tesseract to do ocr on the new image
15
    subprocess.run(['tesseract', new_file_path, 'output'])
16
17
    #   open and read the result
18
    out = open('output.txt', 'r')
19
    print(out.read())
20
    out.close()
21
22
def main():
23
    clean_file('./test.jpg', './test_clean.jpg')
24
25
if __name__ == '__main__':
26
    main()
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

von Kaj G. (Firma: RUB) (bloody)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von S R (Gast)


Lesenswert?

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?

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

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

: Bearbeitet durch User
von Kaj G. (Firma: RUB) (bloody)


Angehängte Dateien:

Lesenswert?

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 :)

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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.

von Schnittstellenbeschneider (Gast)


Lesenswert?

> ... sofern man Zeit und Lust hat, sich
> damit zu beschäftigen.

Da ist mal einer verhungert, weil seine Partnerin Zeit ihm auf dauer 
so fern blieb.

von Wolfgang (Gast)


Lesenswert?

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.

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

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

von Bernd W. (berndwiebus) Benutzerseite


Lesenswert?

Hallo Kaj.

Kaj G. schrieb:

> 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

Danke!

Danke für Deinen kurzen Bericht. Solche "Stupse" in die richtung sind 
manchmal sehr hilfreich!

Mit freundlichem Gruß: Bernd Wiebus alias dl1eic
http://www.l02.de

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.