Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1902, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Xamarin.Forms e i Cognitive Services di Microsoft - OCR

Nel post precedente abbiamo iniziato a parlare di Computer Vision API nell'ambito dei Cognitive Services di Microsoft, sfruttati all'interno di un'app multi-piattaforma scritta in Xamarin.Forms per il riconoscimento di ciò che ci circonda.

Computer Vision include anche un servizio dedicato all'OCR (Optical Character Recognition) e che serve per il riconoscimento di testo all'interno di immagini. Riprendiamo quindi il progetto iniziato la volta precedente, non dobbiamo fare aggiunte di librerie perché abbiamo già tutto e va bene ancora la stessa subscription key.

Gli oggetti con cui lavoriamo

La classe VisionServiceClient espone un metodo chiamato RecognizeTextAsync, che riconosce il testo su un'immagine passata come Stream. Il suo uso, quindi, è molto semplice. Opzionalmente posso specificare la lingua, dal momento che il servizio cerca di riconoscerla da solo e opzionalmente posso passare un bool per determinare se voglio conoscere l'orientamento del testo. Questo metodo restituisce un oggetto di tipo OcrResults, che ha 4 proprietà: Language, stringa che identifica la lingua rilevata; Orientation, stringa che determina l'orientamento; TextAngle, double che rileva l'angolazione del testo; Regions, un array di oggetti Region che determina le aree in cui il testo è stato rilevato. Region, a sua volta, oltre a definire il rettangolo che contiene il testo, ha una proprietà Lines di tipo array di Line, oguna delle quali identifica una riga e ognuna con una proprietà Words, di tipo array di Word. Word è una classe che, tra le altre, ha una proprietà Text che contiene la singola parola.
Il livello di fedeltà e la granularità dell'analisi sono quindi molto alti.

Come per la volta scorsa, aiutiamoci con Peek Definition e Go To Definition dell'editor per vedere la definizione completa delle classi menzionate sopra.

Preparazione dell'interfaccia

Come ricorderete, nel post precedente avevamo definito una TabbedPage come pagina principale a cui aggiungere le varie pagine singole. Quindi creiamo dapprima una nuova ContentPage XAML chiamata OcrPage.xaml e poi aggiungiamola al costruttore della MainPage.xaml.cs in questo modo:

public partial class MainPage : TabbedPage 
{
     public MainPage()
     {
         InitializeComponent();
         this.Children.Add(new ComputerVisionPage());
         this.Children.Add(new OcrPage());
     }
}

Il codice XAML

Lo XAML di questa pagina non è particolarmente complesso, in quanto mostra la lingua rilevata (binding a OcrResults.Language) ed offre lo spazio per mostrare il risultato dell'analisi. Con "offre lo spazio" intendo che tutta la parte di visualizzazione del testo viene generata a runtime, attesa la struttura delle classi, e per evitare binding molto complessi. Ecco quindi lo XAML:


Il code-behind e l'invocazione di RecognizeTextAsync

Ancora una volta riutilizziamo i gestori di evento dei pulsanti già visti le volte scorse. L'unica cosa su cui veramente richiamo l'attenzione è un metodo che ho chiamato PopulateUIWithRegions, a cui viene passato il risultato dell'analisi e che si occupa di iterare le linee di testo e di mostrarle nella UI (ci sono i commenti, comunque):


Il risultato

Il risultato dipende *moltissimo* dalla risoluzione dell'immagine e dalla qualità del testo. Immagini con bassa risoluzione e testo sgranato non saranno riconoscibili in dettaglio. Ciò premesso, ecco come in una app UWP appare il riconoscimento del testo su un'immagine:



Due note importanti: la lingua è stata riconosciuta dal servizio (it) e il testo è stato riconosciuto anche se come parte di un'immagine (e non un documento puro, per intenderci).

Il risultato è assolutamente identico anche su Android e iOS.

La prossima volta parleremo di celebrity recognition.

Alessandro

Print | posted on giovedì 26 gennaio 2017 00:00 | Filed Under [ Xamarin ]

Powered by:
Powered By Subtext Powered By ASP.NET