Riconoscimento ottico OCR tramite VB.Net e C#

Articolo che illustra la creazione di una semplice applicazioni in stile windows application per il riconoscimento ottico, ossia rilevare il testo dalle immagini.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

Introduzione

In questo articolo vedremo come utilizzare in .Net 4, una tecnica per rilevare il testo in un file immagine o quelli che vengono generati tramite l’utilizzo di uno scanner.
Questa tecnica è detta comunemente OCR, sul web, ci sono varie tecniche e componenti, noi utilizzeremo il componente di “Microsoft Office Document Imaging” che fa parte degli strumenti di Microsoft Office, ed in particolare, della versione 2003 o 2007 (purtroppo la versione 2010 non dispone).
Questo componente, fa parte del programma “Microsoft Office Document Imaging” che si trova nel menu di office e precisamente nella cartella “Strumenti di Microsoft Office”, come si vede dalla figura 1



Figura 1

Creazione del progetto

Si crea un nuovo progetto di tipo “Windows Application”, in riferimento al linguaggio  di programmazione di proprio interesse.
Dopo aver creato il progetto, andate nella barra degli strumenti, per aggiungere il controllo “Microsoft Office Document Imaging Viewer Control” un controllo activex, che permette di visualizzare nella nostra form, l’immagine tif.
Quindi facciamo click con il tasto destro nella barra degli strumenti, e nel menu di scelta rapida che viene visualizzato scegliamo la voce “Choose Items”, e nella finestra che viene aperta, selezionate la pagina “Com Components” e tra i vari elementi, mettete la spunta alla voce “Microsoft Office Document Imaging Viewer Control 12.0” dove il numero 12.0 indica la versione di office, in questo caso la versione di Office 2007, altrimenti potremmo avere 11 che sta per office 2003.
Nella figura 2, viene mostrata tale operazione.



Figura 2


Confermate il tutto, tramite il pulsante ok, trascinate nella form il controllo appena inserito ed aggiungete sempre nella form, un pulsante, il quale avrà il compito di visualizzare il testo della nostra immagine.

Aggiungete nella form, un riferimento all’oggetto “Microsoft Office Document Imaging”, in modo che si carica un oggetto per la gestione dei file immagini.
Nella finestra esplora soluzione, fate click con il tasto destro, sulla voce “Riferimenti”, nel menu di scelta rapida che viene aperto, selezionate, la voce “Aggiungi riferimento” o “Add Reference”, nella finestra che viene aperta, selezionate la pagina “Com” e tra i vari elementi, selezionate la voce “Microsoft Office Document Imaging 12.0 type library” il tutto come mostrato in figura 3.





Figura 3



Confermate il tutto, tramite il pulsante “Ok”.
In questo modo abbiamo aggiunto al progetto, un riferimento alla libreria di “Microsoft Office Document Imaging” che ci permette di leggere e manipolare i dati di una nostra immagine.

Stesura del codice

Passiamo in modalità codice, nell’evento load, utilizziamo il controllo ActiveX inserito precedemente per visualizzare la nostra immagine.
Qui di seguito si riporta un esempio di codice per il linguaggio VB.Net e C#

VB.Net
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        AxMiDocView1.FileName = "C:\test\prova.tif"
    End Sub
C#
private void Form1_Load(object sender, EventArgs e)
        {
            axMiDocView1.FileName = @"C:\test\prova.tif";
        }



La proprietà “FileName” del controllo ActiveX “AxMiDocView1”, imposta il nome del file da visualizzare.
Nell’evento click del pulsante, scriviamo il codice per leggere il testo del file immagine.
Il codice farà uso della libreria (dll) Microsoft Office Document Imaging, aggiunta precedentemente.
Qui di seguito si riporta il codice di esempio per l’utilizzo di tale libreria, nei due linguaggi .Net VB.Net e C#.


VB.Net
Private Sub BtnLeggi_Click(sender As System.Object, e As System.EventArgs) Handles BtnLeggi.Click
        Try
            AxMiDocView1.FileName = ""
            'oggetto per la gestione del documento
            Dim modiDoc As New MODI.Document()
            'imposto il file tif da leggere
            modiDoc.Create("C:\test\prova.tif")
            'imposto il formato - italiano
            modiDoc.OCR(MODI.MiLANGUAGES.miLANG_ITALIAN, True, True)
            'creo oggetto per la gestione delle singola pagina
            Dim img As MODI.Image = modiDoc.Images(0)
            'rilevo i dati
            Dim layout As MODI.Layout = img.Layout
            Dim testo As String = ""
            'ciclo per tutte le parole
            For elemento = 0 To layout.Words.Count - 1
                Dim lettera As MODI.Word = layout.Words(elemento)
                testo += lettera.Text + " "
            Next
            modiDoc.Close(False)
                MessageBox.Show(testo)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
C#
private void BtnLeggi_Click(object sender, EventArgs e)
        {
            try
            {
                axMiDocView1.FileName = "";
                //oggetto per la gestione del documento
                MODI.Document modiDoc = new MODI.Document();
                //imposto il file tif da leggere
                modiDoc.Create(@"C:\test\prova.tif");
                //imposto il formato - italiano
                modiDoc.OCR(MODI.MiLANGUAGES.miLANG_ITALIAN, true, true);
                //creo oggetto per la gestione delle singola pagina
                MODI.Image img = (MODI.Image)modiDoc.Images[0];
                //rilevo i dati
                MODI.Layout layout = img.Layout;
                string testo = "";
                //ciclo per tutte le parole
                for (int elemento = 0; elemento < layout.Words.Count; elemento++)
                {
                    MODI.Word lettera = (MODI.Word)layout.Words[elemento];
                    testo += lettera.Text + " ";
                }
                modiDoc.Close(false);
                MessageBox.Show(testo);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


Come si vede dal codice, si è impostato il controllo “AxMiDocView1”, senza file, questo perché la lettura del file, non generi un errore.
Gli oggetti utilizzati sono Modi.Document, che permette di gestire i file, Modi.image, le singole pagine, perché possiamo avere file, formati da n pagine, la classe Modi.Layout, permette di gestire il testo di quella singola pagina.
Tramite la classe Modi.Word, rileviamo le singole parole.
Il metodo create di document, imposta il nome del file, mentre il metodo Ocr, che accetta argomenti la lingua e l’impostazione di pagina, permette di rilevare i documenti dall’immagine.
Ora non ci resta che creare il nostro file immagine, possiamo utilizzare il programma Paint, o file provenienti dallo scanner, o altro modo.
Il file prova.tif, si trova nella cartella test in C:\, naturalmente il lettore è libero di impostare un percorso e nome a propria scelta.
Terminata la creazione del file, non ci resta che testare la nostra applicazione, facendo click su esegui o su f5.

Conclusioni

L'articolo ha fornito le basi per utilizzare la libreria Microsoft document Imaging, presente in Microsoft Office 2003 o Microsoft Office 2007. Con questo componenti si è visto come creare un piccolo programma per la lettura del testo nei file immagine.  Tecnica che si può utilizzare in qualsiasi tipologia di programma, in maggioranza nelle applicazioni per la gestione documentale.