Saltar al contenido principal
Los ejemplos de C# son aplicables solo a FRE para Windows.
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. Los objetos CheckmarkBlock y CheckmarkGroup proporcionan acceso a los bloques de estos tipos. Para obtener estos objetos, debe usar los métodos correspondientes del objeto Block.
Para reconocer marcas de verificación, debe tener una licencia de ABBYY FineReader Engine que admita el módulo OMR.
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. Una marca de verificación corregida es una marca que se colocó en la casilla y que luego el usuario tachó.

Detección de marcas de verificación en la imagen

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 en TRUE. Una vez finalizado el análisis, el layout contendrá un objeto CheckmarkBlock por cada marca de verificación encontrada en la imagen. No se agruparán en 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), o si utiliza un único método para el procesamiento completo (por ejemplo, IFRDocument::Process), se completarán los resultados del reconocimiento de marcas de verificación.
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 );
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

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 y 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 y 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 a partir de una imagen que contenga un grupo de marcas de verificación. Por ejemplo, puede usar el método CreateFRDocumentFromImage del objeto Engine.
  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); para ello, use las propiedades y los métodos de la colección FRPages.
  3. Obtenga el objeto Layout correspondiente a esta página mediante la propiedad IFRPage::Layout.
  4. Para cada grupo de marcas de verificación:
  5. Cree un objeto Region mediante el método IEngine::CreateRegion y agréguele rectángulos con el método IRegion::AddRect.
  6. Cree un objeto 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 (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 fundamental establecer correctamente el tipo y la región de la marca de verificación para obtener un resultado de reconocimiento correcto.
  1. Para cada marca de verificación del grupo:
  2. Cree el objeto Region con el método IEngine::CreateRegion y agréguele rectángulos con el método IRegion::AddRect.
  3. Cree un nuevo bloque de marca de verificación en el grupo con el método ICheckmarkGroup::AddNew (use el objeto Region creado como parámetro de entrada).
  4. Obtenga el objeto CheckmarkBlock (use el método IBlock::GetAsCheckmarkBlock) y establezca los parámetros necesarios (CheckmarkType, IsCorrectionEnabled).
  5. Establezca los parámetros necesarios del grupo de marcas de verificación (MinimumCheckedInGroup, MaximumCheckedInGroup).
  6. Para reconocer las marcas de verificación, use cualquiera de los métodos disponibles que permiten realizar el reconocimiento, como IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, etc.
...
// 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);
}
...

Reconocer una sola marca de verificación

  1. Cree un objeto FRDocument a partir de una imagen con una marca de verificación. Por ejemplo, puede usar el método CreateFRDocumentFromImage del objeto Engine.
  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); use las propiedades y los métodos de la colección FRPages.
  3. Obtenga el objeto Layout correspondiente a esta página mediante la propiedad IFRPage::Layout.
  4. Cree el objeto Region con el método IEngine::CreateRegion y añádale rectángulos con el método IRegion::AddRect.
  5. Cree un objeto 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 (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) y establezca los parámetros necesarios (CheckmarkType, IsCorrectionEnabled).
Es fundamental establecer correctamente el tipo y la región de la marca de verificación para obtener un resultado de reconocimiento correcto.
  1. Para reconocer la marca de verificación, use cualquiera de los métodos de reconocimiento disponibles, como IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, etc.
...
// 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();
...

Aprender a reconocer marcas de verificación personalizadas

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). 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 a partir de esta imagen. Por ejemplo, puede usar el método CreateFRDocumentFromImage del objeto Engine.
  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); use las propiedades y los métodos de la colección FRPages.
  4. Obtenga el objeto Layout correspondiente a esta página mediante la propiedad IFRPage::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 mediante el método IEngine::CreateRegion y agréguele los rectángulos de una región de marca de verificación con el método IRegion::AddRect.
  7. Cree un objeto 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 (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) y establezca su propiedad CheckmarkType en CMT_Custom.
Es fundamental definir correctamente el tipo y la región de la marca de verificación para obtener un resultado de reconocimiento correcto.
  1. Entrene FineReader Engine para que reconozca este tipo de marcas de verificación: llame al método LearnCheckmarks del objeto FRPage.
  2. Como resultado, la propiedad 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 (solo Windows) o el método SaveToFile del objeto CheckmarkTrainingData.
  3. 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.
  4. 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 o cargarlo desde un archivo o desde la memoria mediante el método LoadFromMemory (solo Windows) o el método LoadFromFile del objeto CheckmarkTrainingData.
  5. Llame a cualquiera de los métodos de reconocimiento del objeto FRDocument o FRPage; por ejemplo, al método IFRDocument::Recognize.
  6. Las propiedades BlackThreshold y 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.

Consulte también

CheckmarkBlock CheckmarkGroup Trabajar con Layout y bloques