Vai al contenuto principale
Gli esempi C# sono applicabili solo a FRE per Windows.
ABBYY FineReader Engine 12 supporta due tipi di blocchi per i segni di spunta: segno di spunta e gruppo di segni di spunta. Un blocco di gruppo di segni di spunta è una raccolta di blocchi di segni di spunta. A questi tipi di blocco corrispondono le costanti BT_Checkmark e BT_CheckmarkGroup nell’enumerazione BlockTypeEnum. Gli oggetti CheckmarkBlock e CheckmarkGroup consentono di accedere ai blocchi di questi tipi. Per ottenere questi oggetti, è necessario usare i metodi corrispondenti dell’oggetto Block.
Per riconoscere i segni di spunta, è necessario disporre di una licenza ABBYY FineReader Engine che supporti il modulo OMR.
È possibile riconoscere sia singoli segni di spunta sia gruppi di segni di spunta. A ogni casella di controllo corrisponde un oggetto CheckmarkBlock. Stati possibili della casella di controllo: selezionata, non selezionata, corretta. Corrispondono a CheckmarkCheckStateEnum. Un segno di spunta corretto è un segno di spunta apposto nella casella di controllo e successivamente barrato dall’utente.

Rilevamento dei segni di spunta nell’immagine

I segni di spunta possono essere rilevati nell’immagine durante l’analisi del layout. Per abilitare il rilevamento dei segni di spunta, imposta la proprietà IPageAnalysisParams::DetectCheckmarks su TRUE. Al termine dell’analisi, il layout conterrà un oggetto CheckmarkBlock per ogni segno di spunta rilevato nell’immagine. Non saranno raggruppati in CheckmarkGroup. Il tipo di segno di spunta verrà rilevato automaticamente. Dopo aver chiamato un metodo che esegue il riconoscimento (ad esempio IFRDocument::Recognize), oppure se utilizzi un unico metodo per l’elaborazione completa (ad esempio IFRDocument::Process), i risultati del riconoscimento dei segni di spunta verranno popolati.
FREngine.IEngine engine;
FREngine.IFRDocument frdoc;
// Si presume che il documento sia stato creato e che le immagini siano state aggiunte al documento
// Crea DocumentProcessingParams e imposta i parametri
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
FREngine.IPageProcessingParams ppp = dpp.PageProcessingParams;
ppp.PageAnalysisParams.DetectCheckmarks = true;
// Usa i parametri per l'elaborazione
frDoc.Process( dpp );
Se non sei soddisfatto dei risultati del rilevamento automatico dei segni di spunta oppure se devi riconoscere gruppi di segni di spunta o segni di spunta personalizzati, specifica manualmente le aree dei segni di spunta. Le sezioni seguenti descrivono diversi scenari:

Riconoscimento di un gruppo di segni di spunta

Per un gruppo di segni di spunta, è possibile specificare il numero minimo e massimo di segni di spunta selezionati nel gruppo (MinimumCheckedInGroup e MaximumCheckedInGroup, rispettivamente). Questi valori possono essere impostati tramite l’oggetto CheckmarkGroup e verranno usati durante il riconoscimento. Tutti i segni di spunta all’interno di un gruppo devono avere gli stessi valori per le proprietà IsCorrectionEnabled e CheckmarkType. Lo stato del segno di spunta viene calcolato in base alla percentuale di pixel neri presenti nella regione. È minimo per il segno di spunta non selezionato, maggiore per il segno di spunta selezionato e massimo per il segno di spunta corretto. Pertanto, per ottenere un risultato di riconoscimento corretto, è essenziale:
  • impostare correttamente il tipo di segno di spunta, perché i segni di tipo CMT_Circle e CMT_Square hanno un bordo nero, che deve essere preso in considerazione nel calcolo della percentuale;
  • specificare con precisione la regione del segno di spunta, poiché la percentuale di nero viene calcolata sull’intera regione e, se la regione include aree irrilevanti, la stima potrebbe peggiorare.
Per riconoscere un gruppo di segni di spunta:
  1. Creare un oggetto FRDocument a partire da un’immagine contenente un gruppo di segni di spunta. Ad esempio, è possibile utilizzare il metodo CreateFRDocumentFromImage dell’oggetto Engine.
  2. Ottenere la pagina con l’immagine dei segni di spunta dalla raccolta di pagine del documento (IFRDocument::Pages) — utilizzare le proprietà e i metodi della raccolta FRPages.
  3. Ottenere l’oggetto Layout corrispondente a questa pagina tramite la proprietà IFRPage::Layout.
  4. Per ogni gruppo di segni di spunta:
  5. Creare un oggetto Region utilizzando il metodo IEngine::CreateRegion e aggiungervi rettangoli tramite il metodo IRegion::AddRect.
  6. Creare un oggetto Block del tipo gruppo di segni di spunta e aggiungerlo alla raccolta dei blocchi del layout (ILayout::Blocks) utilizzando il metodo ILayoutBlocks::AddNew (utilizzare la costante BT_CheckmarkGroup e l’oggetto Region creato come parametri di input. Il metodo richiede anche l’indice del blocco nel layout come terzo parametro di input).
  7. Ottenere l’oggetto CheckmarkGroup (utilizzare il metodo IBlock::GetAsCheckmarkGroup).
È essenziale impostare correttamente il tipo e la regione del segno di spunta per ottenere un risultato di riconoscimento corretto.
  1. Per ogni segno di spunta nel gruppo:
  2. Creare l’oggetto Region utilizzando il metodo IEngine::CreateRegion e aggiungervi dei rettangoli con il metodo IRegion::AddRect.
  3. Creare un nuovo blocco segno di spunta nel gruppo utilizzando il metodo ICheckmarkGroup::AddNew (usare l’oggetto Region creato come parametro di input).
  4. Ottenere l’oggetto CheckmarkBlock (utilizzando il metodo IBlock::GetAsCheckmarkBlock) e impostare i parametri richiesti (CheckmarkType, IsCorrectionEnabled).
  5. Impostare i parametri necessari del gruppo di segni di spunta (MinimumCheckedInGroup, MaximumCheckedInGroup).
  6. Per riconoscere i segni di spunta, utilizzare uno dei metodi disponibili che eseguono il riconoscimento, ad esempio IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, ecc.
...
// Ottenere un oggetto Layout
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Impostare l'area del blocco
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Creare un blocco del tipo gruppo di segni di spunta e aggiungerlo al layout alla fine della raccolta
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_CheckmarkGroup, region, layout.Blocks.Count);
FREngine.ICheckmarkGroup checkmarkGroup = block.GetAsCheckmarkGroup();
// Creare blocchi del tipo segno di spunta
// e aggiungerli al gruppo di segni di spunta
for (int i = 0; i < 5; i++)
{
  FREngine.IRegion checkmarkRegion = Engine.CreateRegion();
  checkmarkRegion.AddRect(10, 10 + i * 20, 90, 10 + (i + 1) * 20);
  FREngine.ICheckmarkBlock checkmark = checkmarkGroup.AddNew(0, checkmarkRegion);
}
...

Riconoscimento di un singolo segno di spunta

  1. Crea un oggetto FRDocument da un’immagine contenente un segno di spunta. Ad esempio, puoi usare il metodo CreateFRDocumentFromImage dell’oggetto Engine.
  2. Recupera la pagina con l’immagine dei segni di spunta dalla raccolta di pagine del documento (IFRDocument::Pages) usando le proprietà e i metodi della raccolta FRPages.
  3. Recupera l’oggetto Layout corrispondente a questa pagina tramite la proprietà IFRPage::Layout.
  4. Crea l’oggetto Region usando il metodo IEngine::CreateRegion e aggiungivi dei rettangoli usando il metodo IRegion::AddRect.
  5. Crea un oggetto Block di tipo segno di spunta e aggiungilo alla raccolta dei blocchi del layout (ILayout::Blocks) usando il metodo ILayoutBlocks::AddNew (usa la costante BT_Checkmark e l’oggetto Region creato come parametri di input).
  6. Ottieni l’oggetto CheckmarkBlock (usa il metodo IBlock::GetAsCheckmarkBlock) e imposta i parametri richiesti (CheckmarkType, IsCorrectionEnabled).
È essenziale impostare correttamente il tipo e la regione del segno di spunta per ottenere un risultato di riconoscimento corretto.
  1. Per riconoscere il segno di spunta, usa uno dei metodi di riconoscimento disponibili, ad esempio IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, ecc.
...
// Recupera un oggetto Layout
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Imposta la regione del blocco
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Crea un blocco di tipo segno di spunta e aggiungilo al layout alla fine della raccolta
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_Checkmark, region, layout.Blocks.Count);
FREngine.ICheckmarkBlock checkmark = block.GetAsCheckmarkBlock();
...

Apprendere il riconoscimento di segni di spunta di tipo personalizzato

ABBYY FineReader Engine può riconoscere segni di spunta di tipo standard: segni di spunta in quadrati, segni di spunta su sfondo vuoto e segni di spunta in cerchi (vedere le costanti CheckmarkTypeEnum). Come indicato nella descrizione delle costanti dell’enumerazione CheckmarkTypeEnum, esiste un altro tipo di segno di spunta che può essere riconosciuto: CMT_Custom. Questo tipo è destinato ai segni di spunta non standard. Se le immagini da riconoscere contengono segni di spunta non standard, è possibile addestrare FineReader Engine a riconoscere anche questo tipo di segni di spunta. Per riconoscere segni di spunta di tipo non standard:
  1. Trovare un’immagine con alcuni segni di spunta non selezionati del tipo che si desidera riconoscere. Può trattarsi dell’immagine di un modulo vuoto che contiene tali segni di spunta.
  2. Creare un oggetto FRDocument da questa immagine. Ad esempio, è possibile usare il metodo CreateFRDocumentFromImage dell’oggetto Engine.
  3. Ottenere la pagina con l’immagine dei segni di spunta dalla raccolta di pagine del documento (IFRDocument::Pages) — usare le proprietà e i metodi della raccolta FRPages.
  4. Ottenere l’oggetto Layout corrispondente a questa pagina tramite la proprietà IFRPage::Layout.
  5. Specificare la regione e il tipo di ciascun blocco di segno di spunta nella pagina:
  6. Creare l’oggetto Region usando il metodo IEngine::CreateRegion e aggiungervi i rettangoli della regione del segno di spunta usando il metodo IRegion::AddRect.
  7. Creare un oggetto Block di tipo segno di spunta e aggiungerlo alla raccolta dei blocchi di layout (ILayout::Blocks) usando il metodo ILayoutBlocks::AddNew (usare la costante BT_Checkmark e l’oggetto Region creato come parametri di input).
  8. Ottenere l’oggetto CheckmarkBlock (usare il metodo IBlock::GetAsCheckmarkBlock) e impostare la proprietà CheckmarkType su CMT_Custom.
È essenziale impostare correttamente il tipo e la regione del segno di spunta per ottenere un risultato di riconoscimento corretto.
  1. Addestra FineReader Engine a riconoscere questo tipo di segni di spunta: chiama il metodo LearnCheckmarks dell’oggetto FRPage.
  2. Di conseguenza, la proprietà TrainingData dell’oggetto CheckmarkBlock creato prima dell’addestramento conterrà informazioni sul tipo di segno di spunta personalizzato. Queste informazioni potranno quindi essere usate per riconoscere altri segni di spunta dello stesso tipo. Puoi salvarle in un file o in memoria usando il metodo SaveToMemory (solo Windows) oppure il metodo SaveToFile dell’oggetto CheckmarkTrainingData.
  3. Crea oggetti FRDocument a partire dalle immagini che contengono segni di spunta di questo tipo, specifica i blocchi di segni di spunta nelle pagine e imposta il tipo di segno di spunta su CMT_Custom. La procedura è descritta nei passaggi da 2 a 5.
  4. Inizializza la proprietà TrainingData di ciascun oggetto CheckmarkBlock con l’oggetto CheckmarkTrainingData ottenuto durante l’addestramento. Per esempio, puoi copiare l’oggetto usando il metodo CopyFrom oppure caricarlo da un file o dalla memoria usando il metodo LoadFromMemory (solo Windows) oppure il metodo LoadFromFile dell’oggetto CheckmarkTrainingData.
  5. Chiama uno qualsiasi dei metodi di riconoscimento dell’oggetto FRDocument o FRPage, ad esempio il metodo IFRDocument::Recognize.
  6. Le proprietà BlackThreshold e SuspiciousDistance dell’oggetto CheckmarkBlock consentono di perfezionare ulteriormente le impostazioni se i risultati del riconoscimento non sono soddisfacenti. Dopo l’addestramento, i valori predefiniti di queste proprietà vengono sostituiti con valori che dovrebbero funzionare nella maggior parte dei casi. Quando carichi l’oggetto CheckmarkTrainingData per un blocco di segni di spunta, vengono caricati anche i valori di queste proprietà. Puoi sperimentare modificando i valori di queste proprietà e riconoscendo di nuovo i segni di spunta (ripetendo il passaggio 10) e, una volta trovata la configurazione migliore, salvare nuovamente l’oggetto CheckmarkTrainingData e usare il nuovo oggetto per riconoscere i segni di spunta del tuo tipo personalizzato.

Vedi anche

CheckmarkBlock CheckmarkGroup Lavorare con layout e blocchi