Offline Texterkennung für Windows Store und Windows Phone Apps (OCR - Optical Character Recognition)

Vielleicht hat jemand von Euch meinen MVA Kurs zur Windows App Entwicklung gesehen, in dem ich das OCR Scannen über den Bing Texterkennungsservice erkläre oder meinen zugehörigen Blogpost gelesen.

Dazu gibt es sowohl schlechte als auch gute News.

Die schlechten Neuigkeiten:

Das OCR Scanning funktioniert in dieser Form nicht mehr, der zugehörige serverseitige Bing-Dienst wurde “deprecated”.

Technisch verlief die Texterkennung so, dass man clientseitig ein Bild aufgenommen hat, das dann an den Bing-Dienst übermittelt wurde. Dort wurde das Bild auf Text untersucht und der erkannte Text an den Client zurückgeschickt. Der Vorteil lag auf der Hand: Am Client war keinerlei Logik notwendig. Der Nachteil liegt auch auf der Hand: Ohne Internetverbindung läuft gar nichts.

Die guten Neuigkeiten:

Es gibt inzwischen eine Lib, die über Nuget verfügbar ist und in Windows Store und Windows Phone Apps eingebunden werden kann und OCR-Scanning unglaublich einfach macht. Die Aufrufe passen in ein paar wenige Zeilen Code. Hier steht Schritt für Schritt wie’s geht.

1. Wir müssen unserem Windows Phone 8.1 oder Windows Store App Projekt das Nuget PackageMicrosoft OCR Library for Windows Runtime” hinzufügen.

image

Wie ich gerade feststelle, liegt hier inzwischen auch Version 1.0.0 und das “preview” ist aus dem Titel verschwunden.

2. Wir benötigen eine Referenz auf das Bild, aus dem wir Text erkennen wollen.

 public WriteableBitmap bitmap; 
 3. Wir müssen die OcrEngine instanziieren und dabei angeben, welche Sprache wir erkennen wollen.
 OcrEngine engine = new OcrEngine(OcrLanguage.English); 
 4. Wir lassen den Text erkennen und erhalten ein “result”.
 var result = await engine.RecognizeAsync((uint)bitmap.PixelHeight,  
  (uint)bitmap.PixelWidth, bitmap.PixelBuffer.ToArray()); 
 5. Das Result besteht aus all dem Text, der erkannt wurde, gegliedert in Zeilen und Worte. Wir können hier also zwei foreach Loops verschachteln, 
und den gesammten Text in einen String packen:
 
string text = String.Empty; foreach (var line in result.Lines)<br>{    foreach (var word in line.Words)    <br>      {       <br>       text += " " + word.Text;    <br>       }<br>} 

Fertig. In text steht jetzt der erkannte Text. Exceptionhandling wäre noch nachzuliefern Smiley

 Insgesamt ein meiner Meinung nach sehr sehr einfach verwendbarer Mechanismus, der Text sehr zuverlässig erkennt. Und durch die Offlinefähigkeit 
werden natürlich auch potentielle Datensicherheitsbedenken hinfällig, da die gescannten Daten – die ja Dokumente und Verträge sein könnten – 
nicht mehr irgendwohin übermittelt werden.
 Viel Spaß beim Scannen!