Digits mit OCR auslesen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    Digits mit OCR auslesen

    Hallo Zusammen,

    dieses Forum hat mir bisher viel Inspiration gegeben, jedoch gibt es nun ein Thema welches ich nicht lösen kann.

    Ich möchte einen digitalen Energiekosten-Zähler mit einer Webcam erfassen (siehe Bild im Anhang) und die "Digits", also die Ziffern, digitalisieren mittels OCR oder ähnlicher Methode. Die Webcam funktioniert und auch ein Bild wird in der PictureBox einwandfrei angezeigt.

    Jetzt bin ich auf der Suche nach einer Möglichkeit die "Digits" über OCR auszulesen, bisherige Ansätze ergeben nur unleserliche Zeichen. Hat jemand eine Idee wie man es realsieren könnte?

    Die anzeigbaren Zeichen sind "0123456789" nur eben im Digits Format und in zwei Größen (siehe Bild).

    Ein alternativer Ansatz zur OCR-Methode ist indem man bestimmte Bereiche (x,y) mit einem Bereich unmittelbar daneben zwecks Kontrast (x-5, y) vergleicht und erkennt ob dort das 1. Feld "dunkel" oder "hell" ähnlich 2. Feld (x-5, y) ist. Also beim Digit "0" müssten also 6 absolute Bereiche "dunkel" sein und ein bestimmter Bereich "hell".

    Quellcode

    1. Beispiel die Zahl 0 im Digit-Format:
    2. _
    3. | |
    4. | |
    5. -


    Kennt dort jemand tipps? Wie man z.B. VB sagen kann dass es sich um "hell" oder "dunkel" handelt?

    edit:
    Angehängt habe ich eine Idee zur OCR-Alternative: Messfelder bestimmen. Wie ich oben mit "hell" und "dunkel" beschrieben habe.

    Quellcode

    1. Die roten Felder: Messfeld zur Bestimmung des Digits "hell" oder "dunkel"
    2. Die gelben Felder: Hilfsfelder zur Bestimmung des "hell" Wertes
    3. Das grüne Feld: Handelt es sich um ein Komma oder nicht bei der Gesamtzahl


    Grundsätzlich sollte jede Zahl mehrere gelbe Felder haben.

    Ich würde also eine Funktion Programmieren die die Koordinaten einem "roten" Feld hat und eines "gelben"

    Quellcode

    1. Funktion "Erkenne_Digit_Bereich (rot_x, rot_y, gelb_x, gelb y)


    Gehen wir davon aus das Bild ist in Graustufen. Weiß jemand wie ich ermitteln kann wieviel heller oder dunkler das rote Feld im Vergleich zum gelben Feld ist (Kontrast)?


    Bin für jeden Tipp dankbar.
    Bilder
    • edit.jpg

      11,45 kB, 318×326, 152 mal angesehen
    • messfelder.jpg

      14,77 kB, 318×326, 131 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „riverboy“ ()

    Wenn gesichert ist, dass die Kameraposition stabil ist, würde ich sogar so weit gehen, die einzelnen Ziffern und Positionen zu teachen, da musst Du nur noch ein paar Linien durchlegen und auswerten, ob da hell-dunkel-hell-Übergäbge sind oder nicht, und hast Deine Ziffern gefunden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe mal etwas mit "Bilderkennung" herumgebastelt, vllt hilft es dir ja weiter: freakjns.blogspot.de/2011/11/b…torial-bilderkennung.html
    Denke es sollte damit möglich sein beim Verändern der Kamerapositon die Ziffern ausfindig zu machen.

    Um die Helligkeit einer Farbe zu bestimmen solltest du sie in den HSV-Farbraum umwandeln: de.wikipedia.org/wiki/HSV-Farb…ion_von_RGB_und_HSV.2FHSL

    Die Geschichte mit der Bilderkennung ist aber sehr Fehleranfällig. Wenn 20cm vor dem Messgerät eh eine Webcam angebracht würde es nichts ausmachen 4 kleine Aufkleber (am besten eine "herausstechende" Farbe an die vier Ecken anzubringen. Diese würden sich ganz leicht per Software finden lassen und du könntest das Bild verzerren, sodass die vier Eckpunkte den Eckpunkten einer Computergrafik entsprechen (=> dan Ganze also perfekt Viereckig ist). Wenn du nun die Positionen der Digits als Verhältnis zur Breite/Höhe angibst würde nichtmal die Auflösung eine Rolle spielen (solange die Software alles ausreichend erkennen kann) - ist aber nicht nötig da du das Bild auch einfach entsprechend vergößern/verkleiner könntest und so auch Pixelkoordinaten funktionieren.

    Vorbearbeiten würde ich das Bild in jedem Fall. Dafür könnte die ColorMatrix-Klasse hilfreich sein. Habe sowas noch nicht gemacht aber ich könnte mir Vorstellen, dass es eine Art "Weißagleichmatrix" gibt - du könntest die Durchschnittsfarbe des Bildes als Weiß festlegen sodass die dunklen Digits herausstechen. Im Idealfall wäre das Bild hinterher Monochrom und das Verarbeiten wäre um einiges leichter.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FreakJNS“ ()