Passer au contenu principal
Les exemples C# s’appliquent uniquement à FRE for Windows.
ABBYY FineReader Engine 12 prend en charge deux types de blocs pour les coches : coche et groupe de coches. Un bloc de groupe de coches est un ensemble de blocs de type coche. Ces types de blocs ont les constantes correspondantes BT_Checkmark et BT_CheckmarkGroup dans l’énumération BlockTypeEnum. Les objets CheckmarkBlock et CheckmarkGroup permettent d’accéder aux blocs de ces types. Pour obtenir ces objets, vous devez utiliser les méthodes correspondantes de l’objet Block.
Pour reconnaître les coches, vous devez disposer d’une licence ABBYY FineReader Engine prenant en charge le module OMR.
Vous pouvez reconnaître des coches individuelles ainsi que des groupes de coches. Une case à cocher correspond à un objet CheckmarkBlock. Les états possibles d’une case à cocher sont les suivants : cochée, non cochée, corrigée. Ils correspondent à CheckmarkCheckStateEnum. Une coche corrigée est une coche placée dans la case à cocher, puis barrée par l’utilisateur.

Détection des coches sur l’image

Les coches peuvent être détectées sur l’image lors de l’analyse de la mise en page. Pour activer la détection des coches, définissez la propriété IPageAnalysisParams::DetectCheckmarks sur TRUE. Une fois l’analyse terminée, la mise en page contiendra un objet CheckmarkBlock pour chaque coche détectée sur l’image. Elles ne seront pas regroupées dans des CheckmarkGroup. Le type de coche sera détecté automatiquement. Après avoir appelé une méthode qui effectue la reconnaissance (par exemple, IFRDocument::Recognize), ou si vous utilisez une méthode unique pour un traitement complet (par exemple, IFRDocument::Process), les résultats de reconnaissance des coches seront disponibles.
FREngine.IEngine engine;
FREngine.IFRDocument frdoc;
// Nous supposons que le document a été créé et que des images y ont été ajoutées
// Créez DocumentProcessingParams et définissez les paramètres
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
FREngine.IPageProcessingParams ppp = dpp.PageProcessingParams;
ppp.PageAnalysisParams.DetectCheckmarks = true;
// Utilisez les paramètres pour le traitement
frDoc.Process( dpp );
Si les résultats de la détection automatique des coches ne vous satisfont pas, ou si vous devez reconnaître des groupes de coches ou des coches personnalisées, indiquez manuellement les zones contenant les coches. Les sections suivantes décrivent différents scénarios :

Reconnaissance d’un groupe de coches

Pour un groupe de coches, vous pouvez spécifier le nombre minimal et maximal de coches cochées dans le groupe (MinimumCheckedInGroup et MaximumCheckedInGroup, respectivement). Ces valeurs peuvent être définies via l’objet CheckmarkGroup et seront utilisées lors de la reconnaissance. Toutes les coches d’un même groupe doivent avoir les mêmes valeurs pour les propriétés IsCorrectionEnabled et CheckmarkType. L’état de la coche est calculé en fonction du pourcentage de pixels noirs dans la région. Il est le plus faible pour une coche non cochée, plus élevé pour une coche cochée et le plus élevé pour une coche corrigée. Par conséquent, pour obtenir un résultat de reconnaissance correct, il est essentiel de :
  • définir correctement le type de coche, car les coches de type CMT_Circle et CMT_Square ont un contour noir, dont il faut tenir compte lors du calcul du pourcentage ;
  • spécifier avec précision la région de la coche, car le pourcentage de noir est calculé sur l’ensemble de la région, et si celle-ci inclut des zones non pertinentes, l’estimation peut être moins fiable.
Pour reconnaître un groupe de coches :
  1. Créez un objet FRDocument à partir d’une image contenant un groupe de coches. Par exemple, vous pouvez utiliser la méthode CreateFRDocumentFromImage de l’objet Engine.
  2. Récupérez la page contenant l’image des coches dans la collection de pages du document (IFRDocument::Pages) — utilisez les propriétés et les méthodes de la collection FRPages.
  3. Récupérez l’objet Layout correspondant à cette page via la propriété IFRPage::Layout.
  4. Pour chaque groupe de coches :
  5. Créez un objet Region à l’aide de la méthode IEngine::CreateRegion, puis ajoutez-y des rectangles à l’aide de la méthode IRegion::AddRect.
  6. Créez un objet Block de type groupe de coches et ajoutez-le à la collection des blocs de mise en page (ILayout::Blocks) à l’aide de la méthode ILayoutBlocks::AddNew (utilisez la constante BT_CheckmarkGroup et l’objet Region créé comme paramètres d’entrée. La méthode exige également l’index du bloc dans la mise en page comme troisième paramètre d’entrée).
  7. Récupérez l’objet CheckmarkGroup (utilisez la méthode IBlock::GetAsCheckmarkGroup).
Il est essentiel de définir correctement le type et la région de la coche pour obtenir un résultat de reconnaissance correct.
  1. Pour chaque coche du groupe :
  2. Créez l’objet Region à l’aide de la méthode IEngine::CreateRegion et ajoutez-y des rectangles à l’aide de la méthode IRegion::AddRect.
  3. Créez un nouveau bloc de coche dans le groupe à l’aide de la méthode ICheckmarkGroup::AddNew (utilisez l’objet Region créé comme paramètre d’entrée).
  4. Récupérez l’objet CheckmarkBlock (à l’aide de la méthode IBlock::GetAsCheckmarkBlock) et définissez les paramètres requis (CheckmarkType, IsCorrectionEnabled).
  5. Définissez les paramètres nécessaires du groupe de coches (MinimumCheckedInGroup, MaximumCheckedInGroup).
  6. Pour reconnaître les coches, utilisez l’une des méthodes de reconnaissance disponibles, par exemple IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, etc.
...
// Récupérer un objet Layout
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Définir la région du bloc
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Créer un bloc de type groupe de coches et l’ajouter à la fin de la collection de mise en page
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_CheckmarkGroup, region, layout.Blocks.Count);
FREngine.ICheckmarkGroup checkmarkGroup = block.GetAsCheckmarkGroup();
// Créer des blocs de type coche
// et les ajouter au groupe de coches
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);
}
...

Reconnaissance d’une seule coche

  1. Créez un objet FRDocument à partir d’une image contenant une coche. Par exemple, vous pouvez utiliser la méthode CreateFRDocumentFromImage de l’objet Engine.
  2. Récupérez la page contenant l’image des coches dans la collection de pages du document (IFRDocument::Pages) — utilisez les propriétés et méthodes de la collection FRPages.
  3. Récupérez l’objet Layout correspondant à cette page via la propriété IFRPage::Layout.
  4. Créez l’objet Region à l’aide de la méthode IEngine::CreateRegion, puis ajoutez-y des rectangles à l’aide de la méthode IRegion::AddRect.
  5. Créez un objet Block de type coche et ajoutez-le à la collection de blocs de mise en page (ILayout::Blocks) à l’aide de la méthode ILayoutBlocks::AddNew (utilisez la constante BT_Checkmark et l’objet Region créé comme paramètres d’entrée).
  6. Récupérez l’objet CheckmarkBlock (à l’aide de la méthode IBlock::GetAsCheckmarkBlock) et définissez les paramètres requis (CheckmarkType, IsCorrectionEnabled).
Il est essentiel de définir correctement le type et la région de la coche afin d’obtenir un résultat de reconnaissance correct.
  1. Pour reconnaître la coche, utilisez l’une des méthodes de reconnaissance disponibles, telles que IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, etc.
...
// Récupérer un objet Layout
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Définir la région du bloc
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Créer un bloc de type case cochée et l'ajouter à la fin de la collection de mise en page
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_Checkmark, region, layout.Blocks.Count);
FREngine.ICheckmarkBlock checkmark = block.GetAsCheckmarkBlock();
...

Apprendre à reconnaître des coches de type personnalisé

ABBYY FineReader Engine peut reconnaître des coches de forme standard : des coches dans des carrés, des coches sur un fond vide et des coches dans des cercles (voir les constantes de CheckmarkTypeEnum). Comme vous pouvez le voir dans la description des constantes de l’énumération CheckmarkTypeEnum, il existe un autre type de coche pouvant être reconnu : CMT_Custom. Il est destiné aux coches de type non standard. Si les images que vous souhaitez reconnaître contiennent des coches de type non standard, vous pouvez entraîner FineReader Engine à reconnaître ce type de coches. Pour reconnaître des coches de type non standard :
  1. Recherchez une image contenant des coches non marquées du type que vous souhaitez reconnaître. Il peut s’agir de l’image d’un formulaire vierge contenant ces coches.
  2. Créez un objet FRDocument à partir de cette image. Par exemple, vous pouvez utiliser la méthode CreateFRDocumentFromImage de l’objet Engine.
  3. Récupérez la page contenant l’image des coches à partir de la collection de pages du document (IFRDocument::Pages) à l’aide des propriétés et méthodes de la collection FRPages.
  4. Récupérez l’objet Layout correspondant à cette page via la propriété IFRPage::Layout.
  5. Spécifiez la région et le type de chaque bloc de coche sur la page :
  6. Créez l’objet Region à l’aide de la méthode IEngine::CreateRegion, puis ajoutez-y les rectangles correspondant à la région de la coche à l’aide de la méthode IRegion::AddRect.
  7. Créez un objet Block de type coche et ajoutez-le à la collection de blocs de mise en page (ILayout::Blocks) à l’aide de la méthode ILayoutBlocks::AddNew (utilisez la constante BT_Checkmark et l’objet Region créé comme paramètres d’entrée).
  8. Récupérez l’objet CheckmarkBlock (à l’aide de la méthode IBlock::GetAsCheckmarkBlock) et définissez sa propriété CheckmarkType sur CMT_Custom.
Il est essentiel de définir correctement le type et la région de la coche pour obtenir un résultat de reconnaissance correct.
  1. Entraînez FineReader Engine à reconnaître ce type de coches : appelez la méthode LearnCheckmarks de l’objet FRPage.
  2. Ainsi, la propriété TrainingData de l’objet CheckmarkBlock que vous avez créé avant l’entraînement contiendra des informations sur le type de coche personnalisé. Ces informations pourront alors être utilisées pour reconnaître d’autres coches du même type. Vous pouvez les enregistrer dans un fichier ou en mémoire à l’aide de la méthode SaveToMemory (Windows uniquement) ou de la méthode SaveToFile de l’objet CheckmarkTrainingData.
  3. Créez des objets FRDocument à partir des images contenant des coches de ce type, spécifiez des blocs de coches sur les pages et définissez le type de coche sur CMT_Custom. La procédure est décrite aux étapes 2 à 5.
  4. Initialisez la propriété TrainingData de chaque objet CheckmarkBlock avec l’objet CheckmarkTrainingData obtenu lors de l’entraînement. Par exemple, vous pouvez copier l’objet à l’aide de la méthode CopyFrom ou le charger à partir d’un fichier ou depuis la mémoire à l’aide de la méthode LoadFromMemory (Windows uniquement) ou de la méthode LoadFromFile de l’objet CheckmarkTrainingData.
  5. Appelez l’une des méthodes de reconnaissance de l’objet FRDocument ou FRPage, par exemple la méthode IFRDocument::Recognize.
  6. Les propriétés BlackThreshold et SuspiciousDistance de l’objet CheckmarkBlock vous permettent d’affiner davantage les paramètres si vous n’êtes pas satisfait des résultats de reconnaissance. Après l’entraînement, les valeurs par défaut de ces propriétés sont remplacées par des valeurs qui devraient fonctionner dans la plupart des cas. Lorsque vous chargez l’objet CheckmarkTrainingData pour un bloc de coches, les valeurs de ces propriétés sont également chargées. Vous pouvez modifier les valeurs de ces propriétés et relancer la reconnaissance des coches (en répétant l’étape 10), puis, lorsque vous avez trouvé la meilleure configuration, enregistrer de nouveau l’objet CheckmarkTrainingData et utiliser le nouvel objet pour reconnaître les coches de votre type personnalisé.

Voir aussi

CheckmarkBlock CheckmarkGroup Utilisation de la mise en page et des blocs