Riconoscimento del testo da un file immagine OCR in C# UWP

L'articolo vuole fornire interessanti spunti sul mondo OCR ed in particolare sulle classi messe a disposizione in ambito Universal Windows Platform per gestire i testi presenti nei file immagini.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come realizzare un progetto utilizzando l’architettura Universal Windows Platform ( UWP) utilizzando il linguaggio di programmazione C# per rilevare il testo da un file di tipo immagine.

In questo articolo vedremo come utilizzare le classi per la gestione dei file immagini e quelle di OCR.


Creazione del progetto


Si crea un file immagine con il testo, possiamo anche scrivere del testo in un file di videoscrittura e poi tramite il programma di Windows “Strumento di cattura” lo salviamo come immagine.
A questo punto una volta creato o rimediato il file immagine lo salviamo in una nostra cartella o sul desktop.
Apriamo Visual Studio 2017 community e dopo aver selezionato il linguaggio di programmazione C#, selezioniamo la voce “Universal di Windows” e tra i modelli quello con la dicitura “App vuota”.
Aggiungiamo al file “MainPage.xaml” ossia la pagina che riguarda la parte grafica delle applicazioni un controllo di tipo Textblock, un controllo button ed un controllo image.
Qui di seguito il codice XAML

<TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="55,269,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/>
<Button x:Name="BtnOcr" Content="Ocr" HorizontalAlignment="Left" Margin="55,471,0,0" VerticalAlignment="Top" Click="BtnOcr_Click"/>
<Image Name="imgImmagineRilevata" HorizontalAlignment="Left" Height="274" Margin="731,151,0,0" VerticalAlignment="Top" Width="424"/>

Passiamo in visualizzazione anche tramite doppio click sul pulsante.
Nella parte di codice, inseriamo lo spazio dei nomi, per gestire le immagini , finestra di dialogo e il testo nei file immagini.
Qui di seguito la dichiarazione, che va inserito in alto sopra ai vari eventi e metodi.


C#
using Windows.Graphics.Imaging;
using Windows.Storage.Pickers;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Media.Ocr;

Nell’evento, che dev’esser di tipo asincrono, scriviamo il codice per la gestione dei file imagine.
In particolare, avremo un oggetto che visualizza una finestra di dialogo per selezionare il file immagine creato in precedenza, che contiene il testo, un oggetto di tipo Softwabitmap per la gestione dei file immagini e gli oggetti per gli ocr, in particolare un oggetto di tipo OcrEngine e OcrResult, per ricavare il testo.
Qui di seguito si riporta il codice completo per l’evento click del pulsante.
Inoltre nel controllo texblock verrà visualizzato il testo, mentre nel controllo image viene visualizzata l’immagine selezionata.


C#
private async void BtnOcr_Click(object sender, RoutedEventArgs e)
{
SoftwareBitmap bitmapImmagine;
var pickerFinestraDialogo = new FileOpenPicker()
{
SuggestedStartLocation = PickerLocationId.PicturesLibrary,
FileTypeFilter = { ".jpg", ".jpeg", ".png" },
};
var fileRilevato = await pickerFinestraDialogo.PickSingleFileAsync();
if (fileRilevato != null)
{
using (var stream = await fileRilevato.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
var decoder = await BitmapDecoder.CreateAsync(stream);
bitmapImmagine = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
var imgSource = new WriteableBitmap(bitmapImmagine.PixelWidth, bitmapImmagine.PixelHeight);
bitmapImmagine.CopyToBuffer(imgSource.PixelBuffer);
imgImmagineRilevata.Source = imgSource;
}
OcrEngine ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();
if (ocrEngine != null)
{
OcrResult ocrRisultato = await ocrEngine.RecognizeAsync(bitmapImmagine);
textBlock.Text = "Testo rilevato: " + ocrRisultato.Text;
}
}
}


Conclusioni

L’articolo ha voluto fornire al lettore le basi per la realizzione di applicazione o funzionalità di tipo OCR, riguardante appunto il rilevamento del testo nei file immagini.
Le potenzialità offerte della varie classi, offrono allo sviluppatore opportunità per gestire e creare dei veri programmi di gestione documentale professionali, oltre che vari programmi.
La semplicità dell’utilizzo delle classi messi a disposizione dal Framework rendono la scrittura del codice molto semplice ed intuitiva, in particolare quelli di tipo UWP.