KennzeichenerkennungOpenCV

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

OpenCV 3 Kennzeichenerkennung mit C++

Als Ziel für unser Projekt haben wir uns vorgenommen, beliebige Autokennzeichen in einem Bild zu erkennen. Anwendungen für solche Kennzeichenerkennungen findet man oft an Parkhäusern, wie auch an der Hochschule, oder Allgemein bei Zufahrtskontrollen. Nach Rücksprache mit den Betreuern wird hierfür OpenCV und Visual Studio verwendet. Das Vorgehen zur Erkennung der Kennzeichen wurde anhand von einem Tutorial von Chris Dahms durchgeführt. (Link: https://www.youtube.com/watch?v=euG7-o9oPKg , aufgerufen am 20.12.2018)


Installation OpenCV3

OpenCV – kurz "Open Computer Vision" – ist eine freie, in C / C++ geschriebene Programmbibliothek mit Algorithmen für Bildverarbeitung und maschinelles sehen (Gesichtserkennung, 3D-Funktionalität, Filter, Kamerakalibrierung, maschinelles lernen usw.). Die Programmierung ist in C, C++, Python und Java möglich. Teilweise ist hierfür die Installation von Zusatzbibliotheken nötig. Der aktuellste Quellcode ist kostenlos als Download verfügbar. Die Stärken von OpenCV liegt in seiner hohen Geschwindigkeit und der großen Menge an verschiedensten Algorithmen, welche teilweise auf neuesten Forschungsergebnissen basieren. Die OpenCV-Bibliotheken können in verschiedene Entwicklungsumgebungen eingebunden werden, zum Beispiel in Microsoft Visual Studio. Zum kompilieren des Open-CV-Sourcecodes, d.h. um die Bibliotheken zu erzeugen, wird der C++ Compiler des Visual Studio verwendet.Wie genau der Sourcecode kompiliert wird regelt ein sogenanntes Makefile, welche von einem Make-Programm eingelesen wird. Dieses automatisiert dann die kompilation. Bei OpenCV wird hierfür "CMake" eingesetzt. Auch dieses ist frei verfügbar und muss installiert werden. Im Anschluss wird Cmake ausgeführt, welches eine GUI zum konfigurieren der Kompilation erstellt. Die Kompilation muss nun in Visual Studio ausgeführt werden. In Visual Studio müssen nun noch diverese Einstellungen gemacht werden (Linker-settings, Pfad der Bibliotheksverzeichnisse...). Nun kann das erste Projekt gestartet werden.


Bild einlesen und Bildbearbeitung

Grundsätzlich galt als Idee ein Bild mit einer Kamera aufzunehmen und bei diesem automatisch das Kennzeichen zu erkennen. Aufgrund von anfänglichen Problemen mit der Installation von Visual Studio und OpenCV mussten wir die Aufgabenstellung etwas verändern und haben uns dazu entschieden, dass wir das einlesen von einer echten Kamera nicht mehr implementieren, sondern nur Bilddateien vom Rechner einlesen.

Kennzeichen.jpg

Im Folgenden sind die einzelnen Schritte zur Erkennung eines KFZ- Kennzeichens aufgelistet:

Als erstes wird die farbige Originalaufnahme in ein Schwarzweißbild umgewandelt und anschließend wird das Schwarzweißbild getresholdet. Dies wird im Programm mit der Funktion preprocess() durchgeführt. Um alle möglichen Buchstaben im Bild zu erkennen werden alle Konturen mit Hilfe der Funktion findPossibleCharsInScene() im getresholdeten Bild herausgefiltert. Dabei wird oft eine Anzahl von mehreren tausend möglichen Buchstaben gefunden. Um diese Menge weiter zu filtern, wird jede Kontur einzeln anhand einer minimalen Breite, minimalen Höhe und anhand der Seitenverhältnisse mit bestimmten Grenzen betrachtet. Anschließend liegt eine Anzahl von etwa ein bis zweihundert möglicher Buchstaben vor. Den nächsten Schritt stellen die Funktionen findVectorOfVectorsOfMatchingChars() und extractPlate() dar. Dabei werden zueinander passende Buchstaben, anhand der Ausrichtung der Buchstaben im Bild gruppiert. Somit liegt eine kleine zweistellige Zahl von möglichen KFZ- Kennzeichen vor. Als nächstes werden dieselben Schritte für jede Gruppe von zueinander passenden Buchstaben, also für jedes mögliche KFZ- Kennzeichen durchgeführt. Anstelle der Betrachtung des ganzen Bildes, wird jetzt die Betrachtung jedes einzelnen möglichen Kennzeichens durchgeführt. An jedem möglichen Kennzeichen wird jetzt wieder der preprocess() durchgeführt.

Kennzeichen imgPlate.PNG


Kennzeichen imgThresh.PNG


Anstelle von findPossibleCharsInScene() wird jetzt findPossibleCharsInPlate() aufgerufen. Der Schritt findVectorOfVectorsOfMatchingChars() bleibt der gleiche und es werden somit anscheinend zusammengehörende Buchstaben innerhalb jedes einzelnen möglichen Kennzeichens wieder in Gruppen unterteilt. Zusätzlich wird noch die Funktion removeInnerOverlappingChars() aufgerufen, um übereinanderliegende Buchstaben zu entfernen. Die Buchstaben werden mithilfe von recognizeCharsInPlate() innerhalb jedes möglichen Kennzeichens erkannt.

Das Kennzeichen mit dem längsten String an Buchstaben stellt nun das erkannte Kennzeichen dar und wird auf der Konsole ausgegeben.

Kennzeichen Ausgabe.PNG

Kennzeichen imgOriginalScene.PNG

Link zur Anwendung im OSC: Download