WPF, Silverlight, Windows Phone 8 und Windows-Store-App

Universal-Apps: Texterkennung aus Bildern mit der Microsoft OCR Library for Windows Runtime
Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: Universal-Apps: Texterkennung aus Bildern mit der Microsoft OCR Library for Windows Runtime“.

Die Texterkennung innerhalb von Bildern ist keine Neuheit und wird als OCR bezeichnet. Microsoft hatte passend dazu über das Bing-API einen Webdienst, der aus unbekannten Gründen wieder eingestellt wurde. Die gute Nachricht ist jedoch, dass Microsoft am 18. September 2014 eine passende OCR Library for Windows Runtime veröffentlichte.

OCR Library installieren

So kann bequem für das eigene Windows-Store-8.1- oder Windows-Phone-8.0-/8.1-Projekt die Texterkennung zum Einsatz kommen. Die Auflösung der Bilder muss mindestens mit 40 x 40 Pixel beginnen und geht bis maximal 2 600 x 2 600 Pixel. Unterstützt werden insgesamt einundzwanzig Sprachen, die in drei unterschiedliche Kategorien ausfallen:

  • Exzellent: Tschechisch, Dänisch, Holländisch, Englisch, Finnisch, Französisch, Deutsch, Ungarisch, Italienisch, Norwegisch, Polnisch, Portugiesisch, Spanisch und Schwedisch
  • Sehr gut: Chinesisch vereinfacht, Griechisch, Japanisch, Russisch und Türkisch
  • Gut: Chinesisch traditionell und Koreanisch

Die Library wird über PROJECT | Manage NuGet Packages mit dem Suchbegriff „Microsoft OCR“ installiert. Die Standard-Build-Einstellung für „Any CPU“ funktioniert dann nicht mehr wie gewohnt. Es muss explizit unter BUILD | Configuration Manager die gewünschte Plattform festgelegt werden, so wie es bei den meisten externen Libraries für die Windows Runtime der Fall ist. Das liegt daran, dass die externe Library auf der Visual C++ 2013 Runtime aufbaut.

Die OCR Library wird mittels OcrEngine-Klasse instanziiert. Beim Konstruktor wird festgelegt, welche Sprache zur Erkennung erwartet wird. Die Bilddaten müssen binär der RecognizeAsync-Methode überreicht werden, was oft ein Problem ist, da diese häufig mit ganz anderen Formaten im Speicher stehen, unabhängig davon, ob es ein Foto oder ein Bild aus den Ressourcen ist. Abhilfe schafft daher die WriteableBitmap-Klasse. Diese decodiert eine Image-Instanz zum binären Bytearray.

Das Ergebnis der Texterkennung wird dann mit einem OcrResult geliefert, die auf einer Collection-Hierarchie von Zeilen und Wörtern aufbaut. So setzt man eine Foreach-Schleife über OcrLine-Instanzen, verschachtelt mit einer weiteren Foreach-Schleife von OcrWord-Instanzen.

Als Beispiel wird ein Windows-Phone-8.1-Projekt verwendet, das ein Bild mit dem Text „Windows Developer“ beinhaltet. Das Bild wird normal als PNG-Datei im Assets-Verzeichnis abgelegt. Mit dem Auslösen des Buttons wird das Bild analysiert und der erkannte Text auf einem TextBlock-Steuerelement angezeigt. Der XAML-Sourcecode befindet sich in Listing 1. Die Implementierung der OCR-Library-Logik wird in Listing 2 gezeigt. Das Ergebnis sieht man in Abbildung 1.

 
    
    
    <button>Text erkennen</button>

 private async void OnTapped(object sender, TappedRoutedEventArgs e)
{
    var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("Assets\WindowsDeveloper.png");
    ImageProperties imgProp = await file.Properties.GetImagePropertiesAsync();
    WriteableBitmap bitmap;
    using (var imgStream = await file.OpenAsync(FileAccessMode.Read))
    {   
        bitmap = new WriteableBitmap((int)imgProp.Width, (int)imgProp.Height);
        bitmap.SetSource(imgStream);
    }

    OcrEngine ocrEngine = new OcrEngine(OcrLanguage.English);
    var result = await ocrEngine.RecognizeAsync((uint)bitmap.PixelHeight, (uint)bitmap.PixelWidth, bitmap.PixelBuffer.ToArray());

    if (result.Lines != null)
    {
        var stringBuilder = new StringBuilder();
        foreach (OcrLine line in result.Lines)
        {
            foreach (OcrWord word in line.Words)
            {
                stringBuilder.Append(word.Text + " ");
            }
            stringBuilder.Append(Environment.NewLine);
        }
        TbOutput.Text = stringBuilder.ToString();
    }
}
Abb. 1: Windows-Phone-8.1-App mit Texterkennung von einem Bild

Abb. 1: Windows-Phone-8.1-App mit Texterkennung von einem Bild

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -