Projekt Maschinelles sehen Dozent: D. Lanz, W. Jenni Autoren: T. Kurmann, S. Eichenberger Burgdorf, 19.01.2010 OCR am Einzahlungsschein
Inhaltsverzeichnis Aufgabenstellung:... 2 Einleitung:... 2 Auftrag für Projektarbeit... 2 Analyse... 3 Design:... 5 Benutzerinteraktion:... 5 Überblick der Klassen... 5 Basic OCR... 6 Initialisierung:... 6 getdata... 6 Classify... 7 ExtendedOCR... 8 Grafische Oberfläche:... 9 Schlussbetrachtung:... 10 Maschinelles sehen 1
Aufgabenstellung: Einleitung: Um bei einem Einzahlungsschein der Post nicht sämtliche Angaben abtippen zu müssen, ist unser Ziel einen Programm zu schreiben, welches den Betrag, die Kontonummer und die Referenznummer automatisch von einem Bild einliest. Dazu soll der ESR-Code im weissen Bereich des Einzahlungsscheins erkannt und umgewandelt werden. Diese Daten werden dann in einem Textfeld angezeigt, damit man sie einfach in die Zwischenablage kopieren kann. Auftrag für Projektarbeit Die Bilder können entweder von der HD oder der Webcam geladen werden. Allfällige Verzerrungen müssen korrigiert werden, danach wird ein Binärbild erzeugt. Aus diesem Binärbild werden dann die einzelnen Zahlen extrahiert und auf einer grafischen Oberfläche angezeigt. Maschinelles sehen 2
Analyse Wir entschieden uns die Aufgabe mit einer Kombination von QT (Nokia) und OpenCV zu lösen. Dadurch sind wir System unabhängiger und schneller als mit Matlab. Beides sind Opensource Lösungen, wodurch wir keine Lizenzen verletzen. Als Programmiersprache verwenden wir C++, da sowohl QT als auch OpenCV für diese Sprache ausgelegt sind. QT ist eine Library welche Funktionen für grafische Benutzeroberflächen zur Verfügung stellt. Sie wurde von Trolltech entwickelt. Im Jahr 2008 übernahm der Mobiltelefon Hersteller Nokia Trolltech. Die Library zeichnet sich vor allem dadurch aus, dass sie sehr gut dokumentiert ist und ein zwei Lizenzen Modell anbietet. Zum einen gibt es eine Opensource Lizenz (GPL2) und eine Kommerziell verwendbare welche jedoch gekauft werden muss. Näheres zu QT auf http://qt.nokia.com/. OpenCV ist eine offene Bildverarbeitung Bibliothek, welche unter der BSD Lizenz veröffentlicht wird. Sie wurde von Intel ins Leben gerufen und wird heute vor allem durch Willow Garage weiterentwickelt und gepflegt. Ein erster Ansatz war, das Ganze mit Template Matching zu lösen. Nach einigen Recherchen im Internet fanden wir dann aber eine Lösung mit dem k-nearest-neighbour-algorithmus. Diesen kann man mit einem eindimensionalen Vektor trainieren. Dieser Vektor beinhaltet in unserem Fall eine Reihe von Pixeln (1 oder 0). 1 2 3 4 5 6 7 8 9 10 11 12 Bild [1 2 3 4 5 6 7 8 9 10 11 12] Vektor Man übergibt nun dem Algorithmus zu jedem Klassifikator einige dieser Vektoren (Bilder) und trainiert ihn damit. Von OpenCV wird für knn folgende Klasse zur Verfügung gestellt CvKNearest. Hat man nun ein Bild das man Klassifizieren will, vergleicht er dieses mit allen Vektoren und gibt den Klassifikator zurück, der am besten mit dem Bild übereinstimmt. Über den Faktor k bestimmt man wie viele Vektoren zur Klassifikation herbeigezogen werden sollen. Mit k=3 würde der Punkt in der Mitte als Dreieck durchgehen. Erhöht man k auf 5 wird er als Rechteck klassifiziert. Mit diesem Algorithmus wird also ein Template Matching gemacht, jedoch können mehrere vergleiche zur Resultats Bildung herangezogen werden. Das erhöht die Treffsicherheit. Maschinelles sehen 3
Zum Aufbau des ESR-Code fanden wir ein Dokument der Post welches ihn sehr gut beschreibt (siehe Dokument Kodierung.pdf ). Maschinelles sehen 4
Design: Benutzerinteraktion: Der Benutzer kann wählen ob er ein Bild von der Kamera oder der Festplatte nehmen will. Danach wählt er einen Bereich auf dem Bild, den er in einen String umwandeln will. Dieser String wird danach in Betrag, Account und Referenznummer unterteilt und in einem Fenster angezeigt. Von dort kann man alle notwendigen Daten kopieren und in das e-banking Programm übertragen. Überblick der Klassen Maschinelles sehen 5
Das ganze Programm besteht aus 5 Klassen, welche alle ihre eigenen Aufgaben erledigen. Das QMainWin ist das Hauptfenster, in ihm kann man Bilder laden, das Kamerabild einfrieren, etc. Das QOpenCVWidget verwaltet den Bereich im MainWin welcher das Bild anzeigt und bietet die Funktion zur Bereichswahl des Codes an. QYellowReaderResult ist ein neues Fenster das, dass Resultat anzeigt. Es bleibt immer im Vordergrund. ExtendedOCR zerlegt den Ausschnitt vom Bild in einzelne Objekte und füttert dies dem BasicOCR das die Umwandlung vom Bild in Schriftzeichen vornimmt. ExtendedOCR setzt die einzelnen Schriftzeichen dann zusammen und sortiert sie anhand der Bildposition. Basic OCR Initialisierung: Lädt und trainiert den k-nearest neightbour Algorithmus. getdata Lädt die Trainingsdaten und bereitet sie für den KNN-Algorithmus vor. Jedes Bild wird dabei noch vorverarbeitet damit man eventuelle Ränder eliminieren kann und eine feste Grösse hat. Maschinelles sehen 6
Classify Klassifiziert das gewünschte Bild und gibt das Zeichen zurück, dass am nächsten an das Bild herankommt. Auch hier wird wie bei getdata das Bild vorverarbeitet, da sonst das Templatematching nicht funktionieren würde. Maschinelles sehen 7
ExtendedOCR Da man vom Hauptfenster ein Bild bekommt und nicht bloss die einzelnen Schriftzeichen, muss man das Bild in seine einzelnen Objekte zerlegen. Dies übernimmt die Klasse extendedocr. Von ihr kriegt man auch den konvertierten String zurück. Die Zeichen werden anhand der X und Y Koordinaten sortiert. Maschinelles sehen 8
Grafische Oberfläche: Wie die grafische Oberfläche aufgebaut ist, erkennt man am besten wenn man das Programm ausführt. Maschinelles sehen 9
Hinweise zum Projekt, Qt und OpenCV Programm installieren: Um jedem Benutzer die Möglichkeit zu geben Yellowreader auszuprobieren erzeugten wir von den Binaries einen Installer. Somit sollte es auf den meisten Windows Rechnern installierbar sein. Installer: http://code.google.com/p/yellowreader/downloads/ Programm selber kompilieren: Will man das Programm selber kompilieren empfehlen wir entweder den QT Builder von Nokia/QT zu verwenden oder bei Eclipse das Integration Toolkit als Plugin herunterzuladen (ebenfalls von Nokia). Als Compiler empfehlen wir TDMMingw da der normale MinGW noch auf Version 3.xx vom gcc aufsetzt (2010). Ausserdem braucht man zwingend die QT Libraries, welche es mit dem QT Builder automatisch installiert. Da unser Programm zudem noch OpenCV verwendet, muss man auch diese Libraries herunterladen. Wir stellten fest, dass das aktuelle Release (2.0) nicht einwandfrei funktioniert, deshalb sollte man es selber kompilieren oder unsere Version herunterladen. QT: http://qt.nokia.com/products TDMMingw: http://www.tdragon.net/recentgcc/ OpenCV offiziell: http://sourceforge.net/projects/opencvlibrary/ OpenCV unser build: http://code.google.com/p/yellowreader/downloads/ Wir machten die ganze Projektverwaltung über google code. Dort findet man auch den Quellcode des ganzen Projekts. Falls Interesse besteht, an dem Projekt weiter zu arbeiten, können wir gerne weiter Entwickler hinzufügen http://code.google.com/p/yellowreader/ Hat man das Projekt per svn heruntergeladen, muss man nur noch das.pro an den jeweiligen Computer anpassen (Pfade), von da an müsste man es kompilieren können. Das ganze Projekt Handling ist leider etwas schwierig, es können also ohne Probleme einige Stunden vergehen bis man eine Funktionierende Entwicklungsumgebung hat. Falls Fragen bestehen richten Sie sie an eichest@gmail.com oder tkurmann@gmail.com. Maschinelles sehen 10
Schlussbetrachtung: Unser Programm erfüllt die meisten Anforderungen die wir gestellt haben. Man kann ein Bild von der Kamera oder der HD laden. Man muss jedoch noch den Bereich auswählen der umgewandelt werden soll. Ist dies ein ECR-Code wird er relativ zuverlässig umgewandelt. Es gibt jedoch noch einige schwächen. So hatten wir keine Zeit mehr eine Entzerrung zu Implementieren, was vermutlich aber nicht viel am Ergebnis ändern würde. Den ein etwas anderer Ansatz ist das man bereits verzerrte Bilder für das trainieren des KNN braucht. Dies haben wir teilweise schon erledigt, würde man jedoch noch mehr Trainingsdaten haben (mindestens 10) würden sich die Ergebnisse noch einmal verbessern. Ausserdem muss man darauf achten, dass man das Bild nicht zu schräg hält. Das Problem dabei ist nicht nur die Drehung (diese wäre vermutlich der kleinere aufwand) sondern auch die Bereichswahl. Deshalb wäre es vermutlich gut noch eine Klasse einzuführen welche ein Bild einliest, darauf den weissen Bereich sucht und um diesen mit MinAreaRect2 ein Rechteck legt. Mithilfe dieser Funktion erhält man auch den Horizontalen Winkel. Nun müsste man das Bild um diesen Winkel drehen und dann auf dem neuen Bild den Code suchen und ausschneiden. Diesen Code kann man danach ohne weitere Probleme der Klasse extendedocr übergeben und alles sollte funktionieren. Leider hat uns dazu aber die Zeit nicht mehr gereicht. Herzlich bedanken möchten wir uns noch bei D. Burri, welcher uns half einen Einstieg in OpenCV und QT zu finden. Maschinelles sehen 11