Mustererkennung bei Bilder (Autokennzeichen)
Hallo
Ich versuche derzeit ein kleines Visual Basic Programm zu schreiben um Autokennzeichen erfassen zu können.
Als Muster hab ich mir ein Kennzeichen aus dem Internet besorgt.
Da ich nur das Schwarze vom Bild brauch (ich weiß, dass es auch blaue, grüne oder rote Kennzeichen gibt, denen ich aber erstmal keine Aufmerksamkeit schenken möchte), hab ich mir einen Filter gebastelt.
Jeder Pixel, bei dem ein Rot-, Grün- oder Blauwert 30 überschreitet, wird weiß gemacht.
Dabei entsteht das folgende Bild:
Anschließend dachte ich mir, ich lege eine 3x3 Matrix drüber.
Das sieht dann so aus
Natürlich werden diese Striche nicht bei der Mustererkennung verwendet, sondern dienen erstmal nur zu Verständnis.Ist aber auch ein bisschen blöd, da ja die grauen Striche selbst auch 1 Pixel breit sind... egal...
Im nächsten Schritt soll dann jedes Kästchen in der Matrix, in welcher mindestens 2 von 9 schwarz sind, komplett geschwärzt werden (leider noch kein Bild verfügbar).
Ist mein Ansatz soweit gut oder gäbe es bis hier Verbesserungsvorschläge?
Denn dann jetzt das schwierigste: Die Erkennung der Buchstaben und Zahlen.
Ich dachte mir, ich lass das Programm zuerst einmal den obersten linken schwarzen Punkt finden und dann prüfen, wie weit es nach rechts bzw nach unten geht und z.B. zuerst versuchen, ein Rechteck zu finden (dann hätte man zum Beispiel schon mal den Fuß vom H, könnte dann schon eingrenzen E, F, H, I, L, M, N, usw)
Ist das gut so?
ODER
Wäre es zu empfehlen, jeden Buchstaben im Vorfeld als kleine Bitmap oder als Polygon einzuspeichern und dann dementsprechend zu skalieren?
Wäre echt dankbar wenn mir jemand helfen könnte bei meinem bislang schwierigsten Projekt...
Ich versuche derzeit ein kleines Visual Basic Programm zu schreiben um Autokennzeichen erfassen zu können.
Als Muster hab ich mir ein Kennzeichen aus dem Internet besorgt.
Da ich nur das Schwarze vom Bild brauch (ich weiß, dass es auch blaue, grüne oder rote Kennzeichen gibt, denen ich aber erstmal keine Aufmerksamkeit schenken möchte), hab ich mir einen Filter gebastelt.
Jeder Pixel, bei dem ein Rot-, Grün- oder Blauwert 30 überschreitet, wird weiß gemacht.
Dabei entsteht das folgende Bild:
Anschließend dachte ich mir, ich lege eine 3x3 Matrix drüber.
Das sieht dann so aus
Natürlich werden diese Striche nicht bei der Mustererkennung verwendet, sondern dienen erstmal nur zu Verständnis.Ist aber auch ein bisschen blöd, da ja die grauen Striche selbst auch 1 Pixel breit sind... egal...
Im nächsten Schritt soll dann jedes Kästchen in der Matrix, in welcher mindestens 2 von 9 schwarz sind, komplett geschwärzt werden (leider noch kein Bild verfügbar).
Ist mein Ansatz soweit gut oder gäbe es bis hier Verbesserungsvorschläge?
Denn dann jetzt das schwierigste: Die Erkennung der Buchstaben und Zahlen.
Ich dachte mir, ich lass das Programm zuerst einmal den obersten linken schwarzen Punkt finden und dann prüfen, wie weit es nach rechts bzw nach unten geht und z.B. zuerst versuchen, ein Rechteck zu finden (dann hätte man zum Beispiel schon mal den Fuß vom H, könnte dann schon eingrenzen E, F, H, I, L, M, N, usw)
Ist das gut so?
ODER
Wäre es zu empfehlen, jeden Buchstaben im Vorfeld als kleine Bitmap oder als Polygon einzuspeichern und dann dementsprechend zu skalieren?
Wäre echt dankbar wenn mir jemand helfen könnte bei meinem bislang schwierigsten Projekt...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305617
Url: https://administrator.de/contentid/305617
Ausgedruckt am: 24.11.2024 um 22:11 Uhr
13 Kommentare
Neuester Kommentar
Zu OCR gibts einen Berg an Videos auf Youtube.
z.B.
https://www.youtube.com/watch?v=Kjdu8SjEtG0
Nutze Emgu oder willst du das Rad unbedingt neu erfinden?
Wenn ja, würde ich wiefolgt vorgehen: (grob)
Set von Vergleichmaterial definieren, also alle verfügbaren Zeichen/Ziffern/Symbole.
Das Nummernschild dann in Teile splitten.
Wenn du nun etwas erkennen willst und ein Bild als Quelle lädst suche dir den ersten Buchstaben und zerlege ebenfalls nach Einzelbestandteilen.
Danach werden die Bestandteile mit dem vordefinierten Set verglichen.
Für die Erfolgsquote Schwellwerte festlegen und wenn du Teil-Quelle und Teil-Ziel vergleichst, z.B. Pixelweise, dann decken sich zu einem bestimmsten % Satz die Pixel in Schwarz. Zähle die Deckungsgleichen Pixel mit und rechne ein paar Pixel Abweichung ein.
Das Ganze sollte natürlich nur auf gleich scalierte Blöcke Anwendung finden. Da müsste man nochmal ne runde drüber grübeln wie man sicherstellt das beides korrekt scaliert.
Was auch noch als Rahmenbedingung feststehen muss ist das die Nummernschilder plan fotografiert wurden, hast du einen Winkel drin kommt da schon ein Sack voll Mathe oben drauf um die Winkel rauszurechnen.
z.B.
https://www.youtube.com/watch?v=Kjdu8SjEtG0
Nutze Emgu oder willst du das Rad unbedingt neu erfinden?
Wenn ja, würde ich wiefolgt vorgehen: (grob)
Set von Vergleichmaterial definieren, also alle verfügbaren Zeichen/Ziffern/Symbole.
Das Nummernschild dann in Teile splitten.
Wenn du nun etwas erkennen willst und ein Bild als Quelle lädst suche dir den ersten Buchstaben und zerlege ebenfalls nach Einzelbestandteilen.
Danach werden die Bestandteile mit dem vordefinierten Set verglichen.
Für die Erfolgsquote Schwellwerte festlegen und wenn du Teil-Quelle und Teil-Ziel vergleichst, z.B. Pixelweise, dann decken sich zu einem bestimmsten % Satz die Pixel in Schwarz. Zähle die Deckungsgleichen Pixel mit und rechne ein paar Pixel Abweichung ein.
Das Ganze sollte natürlich nur auf gleich scalierte Blöcke Anwendung finden. Da müsste man nochmal ne runde drüber grübeln wie man sicherstellt das beides korrekt scaliert.
Was auch noch als Rahmenbedingung feststehen muss ist das die Nummernschilder plan fotografiert wurden, hast du einen Winkel drin kommt da schon ein Sack voll Mathe oben drauf um die Winkel rauszurechnen.
Wo beginnt das Kennzeichen im Bild?
Wie du oben schon selber vorgeschlagen hast, suche und finde das Rechteck ^^.
Innerhalb des richtigen Rechteckes beginnen die Buchstaben immer beim gleichen prozentualen Abstand zum Rahmen des Rechteckes. Auch hier minimale Abweichungen einrechnen. So findest du das Kennzeichen und die Position der Buchstaben.
Wie du oben schon selber vorgeschlagen hast, suche und finde das Rechteck ^^.
Innerhalb des richtigen Rechteckes beginnen die Buchstaben immer beim gleichen prozentualen Abstand zum Rahmen des Rechteckes. Auch hier minimale Abweichungen einrechnen. So findest du das Kennzeichen und die Position der Buchstaben.
Ist doch nichts fertiges. In .NET umsetzen muss er es trotzdem noch selbst. Da bleibt noch genug zu bedenken und verstehen muss er es ebenfalls noch.
Zum anschließenden Überprüfen seiner eigenen Herangehensweisen kann das ganz nützlich sein.
Was kommt morgen?: "Wie baue ich mir ein Flugzeug , kann mir da jemand helfen ?!"
Scheint seinen Fragen nach zu urteilen sehr sprunghaft zu sein der Jung, erst Heatmap, dann TOR dann Kennzeichen, ...
Zum anschließenden Überprüfen seiner eigenen Herangehensweisen kann das ganz nützlich sein.
Was kommt morgen?: "Wie baue ich mir ein Flugzeug , kann mir da jemand helfen ?!"
Scheint seinen Fragen nach zu urteilen sehr sprunghaft zu sein der Jung, erst Heatmap, dann TOR dann Kennzeichen, ...
Zitat von @Aicher1998:
Ich dachte mir, ich lass das Programm zuerst einmal den obersten linken schwarzen Punkt finden
Ich dachte mir, ich lass das Programm zuerst einmal den obersten linken schwarzen Punkt finden
Ach wenn denn nur bei der 1 und der 9 der linkste Punkt auch gleichzeitig der oberste wäre...^^
Ich persönlich würde davon ausgehen, dass ich es mit einer Festbreitenschrift zu tun habe und das Kennzeichen in entsprechende Abschnitte unterteilen.
Für jeden Abschnitt gehst Du alle möglichen Zeichen durch und guckst, zu wie viel % der Abschnitt mit einer Referenzgrafik übereinstimmt.
Achja - Es gibt auch H-Kennzeichen, Wechselkennzeichen, kurze Kennzeichen (z.B. mit nur 1 Buchstaben und 1 Zahl wie z.B. "H E 1", Kennzeichen in Mittel- und in Engschrift, zweizeilige Kennzeichen usw. usf.
Ich frage mich ernsthaft, warum Du dich damit beschäftigst. Wenn Du es benötigst, dann solltest Du etwas vorgefertigtes nehmen. Wenn Du etwas derartiges entwickeln möchtest, dann solltest Du dir das Know-How eigentlich selber aneignen (können)...
Es hat keiner gesagt das das eine Aufgabe ist die man mal eben so zwischen Frühstück und Mittagessen codet. Damit haben sich schon vor dir ganze Programmiergruppen die Nächte um die Ohren geschlagen um die Erkennung so zu optimieren das sie auch fast in jedem Fall möglich ist.
Thx, Ist mir etwas zu hoch ^^
... das zum Thema "Schulschwänzen" ...