Montag, 3. Februar 2014

Texterkennung (OCR)

Auf Grund eines Leserkommentars habe ich mich etwas mit dem sehr interessanten Thema Texterkennung / Zeichenerkennung (im englischen "Optical Character Recognition" - OCR) beschäftigt und festgestellt, dass sich relativ einfach relativ gute Ergebnisse erreichen lassen.
Beim Thema OCR geht es um die automatische Erkennung von Texten und Zeichen aus Bildern - hier poste ich natürlich über OCR mittels C#.
Eine OCR Klasse selber zu schreiben, wäre nicht so einfach - allerdings gibt es viele fertige Klassen, auch für C#. Ich habe Puma.NET benutzt.
Zuerst einmal ist dieses von der obigen Homepage herunterzuladen. Möchte man Puma dann in einem Programm verwenden, muss man einen Verweis auf die Bibliothek "Puma.Net.dll" hinzufügen, welche sich bei mir im Ordner "C:\Program Files (x86)\Puma.NET\Assemblies" befindet.
Kompiliert man das eigene Projekt dann, müssen sich im Build Ordner die 3 Dateien "puma.interop.dll", "Puma.Net.dll" und "dibapi.dll" befinden. Letztere ist dort wahrscheinlich nicht vorhanden und muss deswegen aus dem Assembly Ordner von Puma manuell hineinkopiert werden.
Eine Sache ist noch einzurichten bevor man mit OCR arbeiten kann: Dem aktuellen Benutzer sind volle Rechte für den Ordner "COM Server" im Puma Verzeichnis zu geben.
Nun zum Code, schon mit 4 Zeilen kann eine komplette Texterkennung realisiert werden. Zur Einfachheit binden wir Puma.Net mittels using ein.
Dann müssen wir zuerst ein Objekt vom Typ PumaPage erstellen, diesem übergeben wir den Pfad zum einzulesenden Bild.
Als nächstes legen wir das Format der einzulesenden Zeichen fest, hier nehmen wir einfach TxtAscii. Über die Eigenschaft Language kann sogar die Sprache des einzulesenden Textes festgelegt werden.
Mit der Funktion RecognizeToString() wird dann versucht, Text aus dem Bild zu erkennen.
Hier der komplette Code:

PumaPage P1 = new PumaPage(@"C:\Users\Oliver\Documents\Visual Studio 2013\Projects\COCR\COCR\bin\Debug\Test.bmp");
P1.FileFormat = PumaFileFormat.TxtAscii;
P1.Language = PumaLanguage.German;
string Result = P1.RecognizeToString();

Bei maschinell geschriebenen Texten funktioniert das Programm sehr gut, wird die Schriftart aber etwas verschnörkelter lässt das Ergebnis sofort spürbar nach.

Kommentare:

  1. Wie immer sehr gut ;) Hättest du mal Lust zu zeigen, wie man einen Emulator selbst erstellen kann? Also zum Beispiel ein N64 Emulator oder sowas in der Art. Würde mich nämlich echt mal interessieren wie man dabei vorgehen muss und kann mir vorstellen, dass das auch nicht gerade leicht ist.

    AntwortenLöschen
    Antworten
    1. Uf, davon habe ich noch nie gehört mit C#, ist wahrscheinlich sehr umständlich ...

      Löschen
  2. Habe mit PumaNet auch Erfahrungen gesammelt, allerdings negative. Zum einen erhalte ich zuerst auch eine COM Exception und kurze Zeit danach eine "Engine halted with Code:0"
    Derzeit habe ich noch keine Lösung dafür gefunden. Alle drei DLL sind im Ordner und das COM Verzeichnis hat die notwendigen Berechtigungen (bzw. der aktuelle Nutzer)

    AntwortenLöschen
    Antworten
    1. Es kommt also zuerste eine COM Exception und das Programm läuft dann weiter?
      Denn die 2. Meldung ohne die 1. ist kein Fehler, die Exception wird lediglich ausgelöst, wenn das Programm keinen Text erkennt, die Schrift also zu undeutlich ist o.ä.
      Versuche, zum Ausprobieren zuerst eine Computerschrift in hoher Auflösung zu nehmen, die sollte problemlos erkannt werden.

      Löschen
  3. Erst einmal danke, dass du meine Anfrage wirklich umgesetzt hast. Du hast es wie immer schön geschrieben und für den Anfang einen leichten Weg gezeigt, um in dieses Thema einzusteigen.
    Hoffentlich werden wir noch viele gute Beiträge von dir sehen.

    PS: Werde den Blog weiterhin allen empfehlen, die die ein oder andere Idee gebrauchen können. :)

    AntwortenLöschen
  4. Bei meinen Versuchen mit PumaNet muss ich den Schluss ziehen, das es nur bedingt tauglich ist selbst bei ganz "einfachen" Aufgaben. Ein normaler Text in Courier New, Fett, wird erst ab Texthöhe ca. 20 akzeptabel erkannt. Schon bei Texthöhe 16 kommen sehr viele Fehlerkennungen. Unter Texthöhe 14 kommt die besagte Exception (Engine halted with Code:0). F. H.

    AntwortenLöschen
  5. Dieser Kommentar wurde vom Autor entfernt.

    AntwortenLöschen
  6. rhalte leider ebenfalls nur die Fehlermeldung "Engine halted with Code:0" :(
    Haben Sie ein Beispielbild welches 100% funktioniert?

    AntwortenLöschen
    Antworten
    1. Maschinell erstellter Text funktioniert immer gut - hier ein Bild, welches ich mit Paint erstellt habe und wessen Text bei mir erkannt wird: http://bloggeroliver.bplaced.net/example.png
      Geht das? Ansonsten auch einfach erst einzelne maschinelle Buchstaben testen - dies ist eine gute Testmöglichkeit.

      Löschen
  7. Bei mir hört es immer auf zu funktionieren, wenn ich zum Schritt Var = pumaPage.RecognizeToString(); kommt.
    Anscheinend will er trotz der Rechte nicht die dll Datei finden. :C

    AntwortenLöschen