> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Reconocimiento de marcas de verificación

> Reconozca marcas de verificación individuales y grupos de marcas de verificación con ABBYY FineReader Engine usando los tipos de bloque BT_Checkmark / BT_CheckmarkGroup y el módulo de licencia OMR.

<Note>
  Los ejemplos de C# son aplicables solo a FRE para Windows.
</Note>

ABBYY FineReader Engine 12 admite dos tipos de bloques para las marcas de verificación: marca de verificación y grupo de marcas de verificación. Un bloque de grupo de marcas de verificación es una colección de bloques de marcas de verificación. Estos tipos de bloque tienen las constantes correspondientes BT\_Checkmark y BT\_CheckmarkGroup en la enumeración [BlockTypeEnum](/es/fine-reader/engine/api-reference/enumerations/blocktypeenum). Los objetos [CheckmarkBlock](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock) y [CheckmarkGroup](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup) proporcionan acceso a los bloques de estos tipos. Para obtener estos objetos, debe usar los métodos correspondientes del objeto [Block](/es/fine-reader/engine/api-reference/layout-related-objects/block).

<Warning>
  Para reconocer marcas de verificación, debe tener una licencia de ABBYY FineReader Engine que admita el módulo [OMR](/es/fine-reader/engine/licensing/modules#omr).
</Warning>

Puede reconocer tanto marcas de verificación individuales como grupos de marcas de verificación.

Cada casilla corresponde a un objeto CheckmarkBlock. Los posibles estados de la casilla son: marcada, no marcada, corregida. Corresponden a [CheckmarkCheckStateEnum](/es/fine-reader/engine/api-reference/enumerations/checkmarkcheckstateenum). Una marca de verificación corregida es una marca que se colocó en la casilla y que luego el usuario tachó."

<div id="detecting-checkmarks-on-the-image">
  ## Detección de marcas de verificación en la imagen
</div>

Las marcas de verificación pueden detectarse en la imagen durante el análisis del layout. Para habilitar la detección de marcas de verificación, establezca la propiedad [IPageAnalysisParams::DetectCheckmarks](/es/fine-reader/engine/api-reference/parameter-objects/preprocessing-analysis-recognition-and-synthesis-parameters/pageanalysisparams#detectcheckmarks) en TRUE.

Una vez finalizado el análisis, el layout contendrá un objeto [CheckmarkBlock](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock) por cada marca de verificación encontrada en la imagen. No se agruparán en [CheckmarkGroup](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup). El tipo de marca de verificación se detectará automáticamente.

Después de llamar a un método que realiza el reconocimiento (por ejemplo, [IFRDocument::Recognize](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/recognize-method)), o si utiliza un único método para el procesamiento completo (por ejemplo, [IFRDocument::Process](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/process-method)), se completarán los resultados del reconocimiento de marcas de verificación.

<Accordion title="Código C#">
  ```csharp theme={null}
  FREngine.IEngine engine;
  FREngine.IFRDocument frdoc;
  // Suponemos que el documento ya se ha creado y que se han añadido imágenes al documento
  // Cree DocumentProcessingParams y establezca los parámetros
  FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
  FREngine.IPageProcessingParams ppp = dpp.PageProcessingParams;
  ppp.PageAnalysisParams.DetectCheckmarks = true;
  // Use los parámetros para el procesamiento
  frDoc.Process( dpp );
  ```
</Accordion>

Si no está satisfecho con los resultados de la detección automática de marcas de verificación o necesita reconocer grupos de marcas de verificación o marcas de verificación personalizadas, especifique manualmente las regiones de las marcas de verificación. En las siguientes secciones se describen distintos escenarios:

* [Reconocimiento de un grupo de marcas de verificación](/es/fine-reader/engine/guided-tour/advanced-techniques/recognizing-checkmarks#group)
* [Reconocimiento de una sola marca de verificación](/es/fine-reader/engine/guided-tour/advanced-techniques/recognizing-checkmarks#single)
* [Aprender a reconocer marcas de verificación de tipo personalizado](/es/fine-reader/engine/guided-tour/advanced-techniques/recognizing-checkmarks#custom)

<div id="recognizing-a-group-of-checkmarks">
  ## Reconocimiento de un grupo de marcas de verificación
</div>

En un grupo de marcas de verificación, puede especificar un número mínimo y un número máximo de casillas marcadas en el grupo ([MinimumCheckedInGroup](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup#minimumcheckedingroup) y [MaximumCheckedInGroup](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup#maximumcheckedingroup), respectivamente). Estos valores pueden configurarse mediante el objeto CheckmarkGroup y se utilizarán durante el reconocimiento.

Todas las marcas de verificación de un mismo grupo deben tener los mismos valores en las propiedades [IsCorrectionEnabled](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock#iscorrectionenabled) y [CheckmarkType](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock#checkmarktype).

El estado de la marca de verificación se calcula en función del porcentaje de píxeles negros de la región. Este porcentaje es el más bajo en una marca sin seleccionar, mayor en una marca seleccionada y el más alto en una marca corregida. Por lo tanto, para obtener un resultado de reconocimiento correcto, es fundamental:

* establecer correctamente el tipo de marca de verificación, porque las marcas de tipo CMT\_Circle y CMT\_Square tienen un contorno negro que debe tenerse en cuenta al calcular el porcentaje;
* especificar la región exacta de la marca de verificación, porque el porcentaje de píxeles negros se calculará en toda la región y, si la región incluye áreas irrelevantes, la estimación puede empeorar.

Para reconocer un grupo de marcas de verificación:

1. Cree un objeto [FRDocument](/es/fine-reader/engine/api-reference/document-related-objects/frdocument) a partir de una imagen que contenga un grupo de marcas de verificación. Por ejemplo, puede usar el método [CreateFRDocumentFromImage](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createfrdocumentfromimage-method) del objeto [Engine](/es/fine-reader/engine/api-reference/engine-object-iengine-interface).

2. Obtenga la página con la imagen de las marcas de verificación de la colección de páginas del documento ([IFRDocument::Pages](/es/fine-reader/engine/api-reference/document-related-objects/frdocument#pages)); para ello, use las propiedades y los métodos de la colección [FRPages](/es/fine-reader/engine/api-reference/document-related-objects/frpages).

3. Obtenga el objeto [Layout](/es/fine-reader/engine/api-reference/layout-related-objects/layout) correspondiente a esta página mediante la propiedad [IFRPage::Layout](/es/fine-reader/engine/api-reference/document-related-objects/frpage#layout).

4. Para cada grupo de marcas de verificación:

5. Cree un objeto [Region](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/region) mediante el método [IEngine::CreateRegion](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) y agréguele rectángulos con el método [IRegion::AddRect](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/region/addrect-method).

6. Cree un objeto [Block](/es/fine-reader/engine/api-reference/layout-related-objects/block) del tipo grupo de marcas de verificación y agréguelo a la colección de bloques del layout (ILayout::Blocks) mediante el método [ILayoutBlocks::AddNew](/es/fine-reader/engine/api-reference/layout-related-objects/layoutblocks/addnew-method) (use la constante BT\_CheckmarkGroup y el objeto Region creado como parámetros de entrada. El método también requiere como tercer parámetro de entrada el índice del bloque en el layout).

7. Obtenga el objeto CheckmarkGroup (use el método [IBlock::GetAsCheckmarkGroup](/es/fine-reader/engine/api-reference/layout-related-objects/block/getascheckmarkgroup-method)).

<Warning>
  Es fundamental establecer correctamente el tipo y la región de la marca de verificación para obtener un resultado de reconocimiento correcto.
</Warning>

5. Para cada marca de verificación del grupo:

6. Cree el objeto Region con el método IEngine::CreateRegion y agréguele rectángulos con el método IRegion::AddRect.

7. Cree un nuevo bloque de marca de verificación en el grupo con el método [ICheckmarkGroup::AddNew](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup/addnew-method) (use el objeto Region creado como parámetro de entrada).

8. Obtenga el objeto CheckmarkBlock (use el método [IBlock::GetAsCheckmarkBlock](/es/fine-reader/engine/api-reference/layout-related-objects/block/getascheckmarkblock-method)) y establezca los parámetros necesarios (CheckmarkType, IsCorrectionEnabled).

9. Establezca los parámetros necesarios del grupo de marcas de verificación (MinimumCheckedInGroup, MaximumCheckedInGroup).

10. Para reconocer las marcas de verificación, use cualquiera de los métodos disponibles que permiten realizar el reconocimiento, como [IFRPage::Recognize](/es/fine-reader/engine/api-reference/document-related-objects/frpage/recognize-method), [IFRPage::RecognizeBlocks](/es/fine-reader/engine/api-reference/document-related-objects/frpage/recognizeblocks-method), [IFRDocument::Recognize](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/recognize-method), [IFRDocument::RecognizePages](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/recognizepages-method), etc.

<Accordion title="Código C#">
  ```csharp theme={null}
  ...
  // Obtener un objeto Layout
  FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
  FREngine.ILayout layout = document.Pages[0].Layout;
  // Establecer la región del bloque
  FREngine.IRegion region = Engine.CreateRegion();
  region.AddRect(0, 0, 100, 50);
  // Crear un bloque del tipo grupo de marcas de verificación
  // y agregarlo al final de la colección en el diseño
  FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_CheckmarkGroup, region, layout.Blocks.Count);
  FREngine.ICheckmarkGroup checkmarkGroup = block.GetAsCheckmarkGroup();
  // Crear bloques del tipo marca de verificación
  // y agregarlos al grupo de marcas de verificación
  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);
  }
  ...
  ```
</Accordion>

<div id="recognizing-a-single-checkmark">
  ## Reconocer una sola marca de verificación
</div>

1. Cree un objeto [FRDocument](/es/fine-reader/engine/api-reference/document-related-objects/frdocument) a partir de una imagen con una marca de verificación. Por ejemplo, puede usar el método [CreateFRDocumentFromImage](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createfrdocumentfromimage-method) del objeto [Engine](/es/fine-reader/engine/api-reference/engine-object-iengine-interface).
2. Obtenga la página con la imagen de la marca de verificación de la colección de páginas del documento ([IFRDocument::Pages](/es/fine-reader/engine/api-reference/document-related-objects/frdocument#pages)); use las propiedades y los métodos de la colección [FRPages](/es/fine-reader/engine/api-reference/document-related-objects/frpages).
3. Obtenga el objeto [Layout](/es/fine-reader/engine/api-reference/layout-related-objects/layout) correspondiente a esta página mediante la propiedad [IFRPage::Layout](/es/fine-reader/engine/api-reference/document-related-objects/frpage#layout).
4. Cree el objeto [Region](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/region) con el método [IEngine::CreateRegion](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) y añádale rectángulos con el método [IRegion::AddRect](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/region/addrect-method).
5. Cree un objeto [Block](/es/fine-reader/engine/api-reference/layout-related-objects/block) de tipo marca de verificación y agréguelo a la colección de bloques del layout (ILayout::Blocks) con el método [ILayoutBlocks::AddNew](/es/fine-reader/engine/api-reference/layout-related-objects/layoutblocks/addnew-method) (use la constante BT\_Checkmark y el objeto Region creado como parámetros de entrada).
6. Obtenga el objeto CheckmarkBlock (use el método [IBlock::GetAsCheckmarkBlock](/es/fine-reader/engine/api-reference/layout-related-objects/block/getascheckmarkblock-method)) y establezca los parámetros necesarios (CheckmarkType, IsCorrectionEnabled).

<Warning>
  Es fundamental establecer correctamente el tipo y la región de la marca de verificación para obtener un resultado de reconocimiento correcto.
</Warning>

7. Para reconocer la marca de verificación, use cualquiera de los métodos de reconocimiento disponibles, como [IFRPage::Recognize](/es/fine-reader/engine/api-reference/document-related-objects/frpage/recognize-method), [IFRPage::RecognizeBlocks](/es/fine-reader/engine/api-reference/document-related-objects/frpage/recognizeblocks-method), [IFRDocument::Recognize](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/recognize-method), [IFRDocument::RecognizePages](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/recognizepages-method), etc.

<Accordion title="Código C#">
  ```csharp theme={null}
  ...
  // Obtener un objeto Layout
  FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
  FREngine.ILayout layout = document.Pages[0].Layout;
  // Establecer la región del bloque
  FREngine.IRegion region = Engine.CreateRegion();
  region.AddRect(0, 0, 100, 50);
  // Crear un bloque de tipo marca de verificación y agregarlo al final de la colección del layout
  FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_Checkmark, region, layout.Blocks.Count);
  FREngine.ICheckmarkBlock checkmark = block.GetAsCheckmarkBlock();
  ...
  ```
</Accordion>

<div id="learning-to-recognize-checkmarks-of-custom-type">
  ## Aprender a reconocer marcas de verificación personalizadas
</div>

ABBYY FineReader Engine puede reconocer marcas de verificación de los tipos estándar: marcas de verificación dentro de cuadrados, marcas de verificación sobre un fondo vacío y marcas de verificación dentro de círculos (consulte las constantes de [CheckmarkTypeEnum](/es/fine-reader/engine/api-reference/enumerations/checkmarktypeenum)). Como puede ver en la descripción de las constantes de la enumeración CheckmarkTypeEnum, hay otro tipo de marca de verificación que se puede reconocer: CMT\_Custom. Está destinado a marcas de verificación no estándar. Si las imágenes que va a reconocer contienen marcas de verificación no estándar, puede entrenar FineReader Engine para reconocer este tipo de marcas.

Para reconocer marcas de verificación no estándar:

1. Busque una imagen con algunas marcas de verificación sin marcar del tipo que desea reconocer. Puede ser una imagen de un formulario vacío que contenga esas marcas.

2. Cree un objeto [FRDocument](/es/fine-reader/engine/api-reference/document-related-objects/frdocument) a partir de esta imagen. Por ejemplo, puede usar el método [CreateFRDocumentFromImage](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createfrdocumentfromimage-method) del objeto [Engine](/es/fine-reader/engine/api-reference/engine-object-iengine-interface).

3. Obtenga la página con la imagen de las marcas de verificación de la colección de páginas del documento ([IFRDocument::Pages](/es/fine-reader/engine/api-reference/document-related-objects/frdocument#pages)); use las propiedades y los métodos de la colección [FRPages](/es/fine-reader/engine/api-reference/document-related-objects/frpages).

4. Obtenga el objeto [Layout](/es/fine-reader/engine/api-reference/layout-related-objects/layout) correspondiente a esta página mediante la propiedad [IFRPage::Layout](/es/fine-reader/engine/api-reference/document-related-objects/frpage#layout).

5. Especifique la región y el tipo de cada bloque de marca de verificación de la página:

6. Cree el objeto [Region](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/region) mediante el método [IEngine::CreateRegion](/es/fine-reader/engine/api-reference/engine-object-iengine-interface/creation-methods/createlessobjectgreater-methods) y agréguele los rectángulos de una región de marca de verificación con el método [IRegion::AddRect](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/region/addrect-method).

7. Cree un objeto [Block](/es/fine-reader/engine/api-reference/layout-related-objects/block) de tipo marca de verificación y agréguelo a la colección de bloques del layout (ILayout::Blocks) mediante el método [ILayoutBlocks::AddNew](/es/fine-reader/engine/api-reference/layout-related-objects/layoutblocks/addnew-method) (use la constante BT\_Checkmark y el objeto Region creado como parámetros de entrada).

8. Obtenga el objeto CheckmarkBlock (use el método [IBlock::GetAsCheckmarkBlock](/es/fine-reader/engine/api-reference/layout-related-objects/block/getascheckmarkblock-method)) y establezca su propiedad [CheckmarkType](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock#checkmarktype) en CMT\_Custom.

<Warning>
  Es fundamental definir correctamente el tipo y la región de la marca de verificación para obtener un resultado de reconocimiento correcto.
</Warning>

6. Entrene FineReader Engine para que reconozca este tipo de marcas de verificación: llame al método [LearnCheckmarks](/es/fine-reader/engine/api-reference/document-related-objects/frpage/learncheckmarks-method) del objeto FRPage.
7. Como resultado, la propiedad [TrainingData](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock#trainingdata) del objeto CheckmarkBlock que creó antes del entrenamiento contendrá información sobre el tipo personalizado de marca de verificación. Esta información podrá utilizarse para reconocer otras marcas de verificación del mismo tipo. Puede guardarla en un archivo o en memoria mediante el método [SaveToMemory](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/savetomemory-method) (solo Windows) o el método [SaveToFile](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/savetofile-method) del objeto [CheckmarkTrainingData](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarktrainingdata).
8. Cree objetos FRDocument a partir de las imágenes que contengan marcas de verificación de este tipo, especifique bloques de marcas de verificación en las páginas y establezca el tipo de marca de verificación en CMT\_Custom. El procedimiento se describe en los pasos 2 a 5.
9. Inicialice la propiedad TrainingData de cada objeto CheckmarkBlock con el objeto CheckmarkTrainingData obtenido durante el entrenamiento. Por ejemplo, puede copiar el objeto mediante el método [CopyFrom](/es/fine-reader/engine/visual-components-reference/supplementary-objects/spellwordcollection/copyfrom-method) o cargarlo desde un archivo o desde la memoria mediante el método [LoadFromMemory](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/loadfrommemory-method) (solo Windows) o el método [LoadFromFile](/es/fine-reader/engine/api-reference/supplementary-objects-and-methods/loadfromfile-method) del objeto CheckmarkTrainingData.
10. Llame a cualquiera de los métodos de reconocimiento del objeto FRDocument o FRPage; por ejemplo, al método [IFRDocument::Recognize](/es/fine-reader/engine/api-reference/document-related-objects/frdocument/recognize-method).
11. Las propiedades [BlackThreshold](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock#blackthreshold) y [SuspiciousDistance](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock#suspiciousdistance) del objeto CheckmarkBlock le permiten ajustar aún más la configuración si no está satisfecho con los resultados del reconocimiento. Después del entrenamiento, los valores predeterminados de estas propiedades se sustituyen por valores que deberían funcionar en la mayoría de los casos. Cuando carga el objeto CheckmarkTrainingData para un bloque de marcas de verificación, también se cargan los valores de estas propiedades. Puede probar a cambiar los valores de estas propiedades y volver a reconocer las marcas de verificación (repitiendo el paso 10) y, cuando haya encontrado la mejor configuración, volver a guardar el objeto CheckmarkTrainingData y usar el nuevo objeto para reconocer las marcas de verificación de su tipo personalizado.

<div id="see-also">
  ## Consulte también
</div>

[CheckmarkBlock](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkblock)

[CheckmarkGroup](/es/fine-reader/engine/api-reference/layout-related-objects/checkmarkgroup)

[Trabajar con Layout y bloques](/es/fine-reader/engine/guided-tour/advanced-techniques/working-with-layout-and-blocks)
