Nel caso del riconoscimento a livello di field, vengono riconosciuti brevi frammenti di testo per acquisire dati da determinati field. La qualità del riconoscimento è fondamentale in questo scenario.Questo scenario può essere utilizzato anche come parte di scenari più complessi in cui occorre estrarre dati significativi dai documenti (ad esempio, per acquisire dati da documenti cartacei in sistemi informativi e database oppure per classificare e indicizzare automaticamente i documenti nei sistemi di gestione documentale).In questo scenario, il sistema riconosce diverse righe di testo solo in alcuni field oppure l’intero testo in una piccola immagine. Il sistema calcola un indice di affidabilità per ogni carattere riconosciuto. Gli indici di affidabilità possono quindi essere utilizzati durante la verifica dei risultati del riconoscimento. Inoltre, il sistema può memorizzare più varianti di riconoscimento per parole e caratteri nel testo, che possono poi essere utilizzate in algoritmi di voto per migliorare la qualità del riconoscimento.L’elaborazione di piccoli frammenti di testo in questo scenario differisce per alcuni aspetti dagli stessi passaggi in altri scenari:
Pre-elaborazione di immagini scansionate o fotografie
Le immagini da riconoscere possono includere segni e rumore di fondo, entrambi in grado di ostacolare il riconoscimento. Per questo motivo, in questa fase vengono rimossi eventuali segni indesiderati e il rumore di fondo.
Riconoscimento di piccoli frammenti di testo
Quando si riconoscono piccoli frammenti di testo, il tipo di dati da riconoscere è noto in anticipo. Pertanto, la qualità del riconoscimento può essere migliorata tramite l’uso di dizionari esterni, espressioni regolari, lingue di riconoscimento personalizzate e alfabeti, nonché imponendo restrizioni sul numero di caratteri in una string. I field di testo possono contenere testo stampato, scritto a stampatello e scritto a mano.
Utilizzo dei dati riconosciuti
Questo scenario richiede la massima accuratezza di riconoscimento per ridurre al minimo il lavoro di verifica dei dati. Il sistema può calcolare un indice di affidabilità per ogni parola o carattere riconosciuto e fornire più varianti di riconoscimento, tra le quali diversi motori possono quindi scegliere il candidato migliore applicando algoritmi di voto.
Gli esempi di codice forniti in questo argomento sono specifici per Windows.
Di seguito è riportata una descrizione dettagliata del metodo consigliato per l’utilizzo di ABBYY FineReader Engine 12 in questo scenario. Il metodo suggerito utilizza le impostazioni di elaborazione ritenute più appropriate per questo scenario.
Passaggio 1. Caricamento di ABBYY FineReader Engine
Per iniziare a lavorare con ABBYY FineReader Engine, è necessario creare l’oggetto Engine. L’oggetto Engine è l’oggetto di livello superiore nella gerarchia degli oggetti di ABBYY FineReader Engine e fornisce varie impostazioni globali, alcuni metodi di elaborazione e metodi per la creazione degli altri oggetti.Per creare l’oggetto Engine, è possibile utilizzare la funzione InitializeEngine. Vedere anche altri modi per caricare l’oggetto Engine (Win).
// Inizializzare queste variabili con il percorso di FREngine.dll, il Customer Project ID di FineReader Engine,// e, se applicabile, il percorso del token della licenza online e la password della licenza onlinewchar_t* FreDllPath;wchar_t* CustomerProjectId;wchar_t* LicensePath; // se non si utilizza una licenza online, assegnare stringhe vuote a queste variabiliwchar_t* LicensePassword;// HANDLE per FREngine.dllstatic HMODULE libraryHandle = 0;// Oggetto globale FineReader EngineFREngine::IEnginePtr Engine;void LoadFREngine(){ if( Engine != 0 ) { // Già caricato return; } // Primo passaggio: caricare FREngine.dll if( libraryHandle == 0 ) { libraryHandle = LoadLibraryEx( FreDllPath, 0, LOAD_WITH_ALTERED_SEARCH_PATH ); if( libraryHandle == 0 ) { throw L"Errore durante il caricamento di ABBYY FineReader Engine"; } } // Secondo passaggio: ottenere l'oggetto Engine typedef HRESULT ( STDAPICALLTYPE* InitializeEngineFunc )( BSTR, BSTR, BSTR, BSTR, BSTR, VARIANT_BOOL, FREngine::IEngine** ); InitializeEngineFunc pInitializeEngine = ( InitializeEngineFunc )GetProcAddress( libraryHandle, "InitializeEngine" ); if( pInitializeEngine == 0 || pInitializeEngine( CustomerProjectId, LicensePath, LicensePassword, L"", L"", VARIANT_FALSE, &Engine ) != S_OK ) { UnloadFREngine(); throw L"Errore durante il caricamento di ABBYY FineReader Engine"; }}
Passaggio 2. Caricamento delle impostazioni per lo scenario
Le impostazioni più adatte possono essere selezionate usando il metodo LoadPredefinedProfile dell’oggetto Engine. Questo metodo riceve il nome del profilo come parametro di input. Le impostazioni più adatte possono essere selezionate usando il profilo predefinito denominato FieldLevelRecognition. Per ulteriori informazioni sui profili, vedere Uso dei profili.
// Carica un profilo predefinitoEngine->LoadPredefinedProfile( L"FieldLevelRecognition" );
Se desideri modificare le impostazioni usate per l’elaborazione, utilizza i corrispondenti oggetti parametro. Per ulteriori informazioni, consulta la sezione Ottimizzazione aggiuntiva riportata di seguito.
Passaggio 3. Caricamento e pre-elaborazione delle immagini
ABBYY FineReader Engine fornisce un oggetto FRDocument per elaborare documenti multipagina. Per caricare le immagini di un documento e pre-elaborarle, è necessario creare l’oggetto FRDocument e aggiungervi le immagini. Puoi eseguire una delle seguenti operazioni:
Creare un oggetto FRDocument usando il metodo CreateFRDocumentFromImage dell’oggetto Engine. Questo metodo crea un oggetto FRDocument e carica le immagini dal file specificato.
// Apre un file immagine e crea l'oggetto FRDocumentFREngine::IFRDocumentPtr frDocument = Engine->CreateFRDocumentFromImage( L"C:\\MyImage.tif", 0 );
Passaggio 4. Configurazione dei field da riconoscere
Ora devi creare blocchi che contengano i field e, per ciascuno di essi, specificare il tipo di blocco e le caratteristiche note dei dati contenuti al suo interno.Esegui l’analisi del layout del documento usando il metodo Analyze, oppure aggiungi manualmente i blocchi che contengono i field da riconoscere. Per istruzioni, consulta Uso di Layout e Block.Per ogni field, puoi ora specificarne i parametri di riconoscimento. Ad esempio, se un field contiene testo, usa la proprietà ITextBlock::RecognizerParams:
imposta il tipo di testo mediante la proprietà TextTypes dell’oggetto RecognizerParams. Ad esempio, se il field contiene cifre scritte nel formato del codice postale, usa il tipo di testo TT_Index.
imposta la lingua usando il metodo SetPredefinedTextLanguage. L’uso di lingue predefinite speciali (solo Windows) può essere utile se conosci il tipo di informazioni contenute nel field. Ad esempio, se il field contiene un indirizzo negli Stati Uniti, seleziona la lingua predefinita English_US_Address. In questo modo il testo verrà riconosciuto in modo più affidabile.
imposta le proprietà SaveCharacterRecognitionVariants e SaveWordRecognitionVariants dell’oggetto RecognizerParams se devi usare le varianti di riconoscimento per un’ulteriore verifica del risultato, come descritto più avanti nel passaggio 6. Tieni presente che questa impostazione non è disponibile per testi manoscritti o in stampatello.
// Analizza il layout del documentofrDocument.Analyze( null, null, null );// Supponiamo di sapere che il primo blocco// nel layout contiene un indirizzo negli Stati UnitiFREngine.ITextBlock addressBlock = frDocument.Pages[0].Layout.Blocks[0].GetAsTextBlock();FREngine.IRecognizerParams paramsAddressBlock = addressBlock.RecognizerParams;paramsAddressBlock.SetPredefinedTextLanguage( "English_US_Address" );// Abilita la raccolta delle varianti di riconoscimentoparamsAddressBlock.SaveCharacterRecognitionVariants = true;paramsAddressBlock.SaveWordRecognitionVariants = true;// Configura allo stesso modo le proprietà degli altri blocchi del layout...
// Analizza il layout del documentofrDocument->Analyze( 0, 0, 0 );// Supponiamo di sapere che il primo blocco// nel layout contiene un indirizzo negli Stati UnitiFREngine::ILayoutBlocksPtr layoutBlocks = frDocument->Pages->Item( 0 )->Layout->Blocks;FREngine::IRecognizerParamsPtr paramsAddressBlock = layoutBlocks->Item( 0 )->GetAsTextBlock()->RecognizerParams;paramsAddressBlock->SetPredefinedTextLanguage( L"English_US_Address" );// Abilita la raccolta delle varianti di riconoscimentoparamsAddressBlock->SaveCharacterRecognitionVariants = VARIANT_TRUE;paramsAddressBlock->SaveWordRecognitionVariants = VARIANT_TRUE;// Configura allo stesso modo le proprietà degli altri blocchi del layout...
Passaggio 5. Riconoscimento
Poiché il layout del documento è già stato analizzato e da te ulteriormente modificato, non richiamare i metodi di analisi. Usa il metodo Recognize, che esegue il riconoscimento e la sintesi delle pagine per tutte le pagine del documento. In questo scenario, devi estrarre i dati dai field e non esportare il documento riconosciuto; pertanto, non avrai bisogno della sintesi del documento.
// Riconosci il documento// Non è necessario specificare parametri perché sono impostati dal profilo di elaborazionefrDocument.Recognize( null, null );
// Riconosci il documento// Non è necessario specificare parametri perché sono impostati dal profilo di elaborazionefrDocument->Recognize( 0, 0 );
Passaggio 6. Utilizzare i dati riconosciuti
Usa l’oggetto Text per accedere al frammento di testo riconosciuto (puoi ottenere questo oggetto per un blocco di testo tramite la proprietà ITextBlock::Text). Usa la proprietà Paragraphs per ottenere la raccolta di paragrafi nel frammento e il metodo IParagraphs::Item per accedere ai singoli paragrafi. La proprietà IParagraph::Text consente di accedere al testo riconosciuto di un paragrafo.Puoi usare IParagraph::Words per ottenere la raccolta di parole in un paragrafo. Usa il metodo IWords::Item per accedere alle singole parole della raccolta. La proprietà IWord::Text restituisce la riga che contiene la parola riconosciuta. Usa il metodo GetRecognitionVariants dell’oggetto Word o il metodo GetWordRecognitionVariants dell’oggetto Paragraph per ottenere le varianti di riconoscimento di una parola.Puoi accedere agli attributi dei singoli caratteri tramite il metodo GetCharParams dell’oggetto Paragraph. Questo metodo fornisce accesso all’oggetto CharParams, che contiene i parametri del carattere riconosciuto. Le varianti di riconoscimento di un carattere sono accessibili tramite la proprietà ICharParams::CharacterRecognitionVariants.Per informazioni dettagliate sull’utilizzo del testo, vedi Lavorare con il testo. Per informazioni sull’uso del motore negli algoritmi di voto, vedi Uso di Voting API.Dopo aver terminato di lavorare con l’oggetto FRDocument, rilascia tutte le risorse utilizzate da questo oggetto. Usa il metodo IFRDocument::Close.
Passaggio 7. Scaricamento di ABBYY FineReader Engine
Dopo aver terminato il lavoro con ABBYY FineReader Engine, è necessario scaricare l’oggetto Engine. Per farlo, usa la funzione esportata DeinitializeEngine.
Puoi usare il file FREngineDistribution.csv per creare automaticamente un elenco dei file necessari al corretto funzionamento della tua applicazione. Per l’elaborazione con questo scenario, seleziona nella colonna 5 (RequiredByModule) i seguenti valori:CoreCore.ResourcesOpeningOpening, ProcessingProcessingProcessing.OCRProcessing.OCR, Processing.ICRProcessing.OCR.NaturalLanguagesProcessing.OCR.NaturalLanguages, Processing.ICR.NaturalLanguagesSe modifichi lo scenario standard, aggiorna di conseguenza i moduli richiesti. Devi inoltre specificare le lingue dell’interfaccia, le lingue di riconoscimento ed eventuali funzionalità aggiuntive usate dalla tua applicazione (ad esempio, Opening.PDF se devi aprire file PDF, oppure Processing.OCR.CJK se devi riconoscere testi in lingue CJK). Per ulteriori dettagli, consulta Working with the FREngineDistribution.csv File.
Di seguito sono riportate le sezioni della guida in cui puoi trovare ulteriori informazioni sulla configurazione dei parametri per le varie fasi di elaborazione:
Lingue predefinite speciali in ABBYY FineReader Engine - Windows L’elenco delle lingue di riconoscimento che contengono unità linguistiche speciali: indirizzi, data e ora, nomi di persona e così via. Queste lingue possono essere utilizzate per il riconoscimento dei field.
Lavorare con i dati riconosciuti
Lavorare con il testo Lavorare con il testo riconosciuto, i paragrafi, le parole e i caratteri.
Uso di Voting API Lavorare con le parole e con le alternative per il riconoscimento dei caratteri.