Pular para o conteúdo principal
Os exemplos em C# se aplicam somente ao FRE for Windows.
O ABBYY FineReader Engine 12 oferece suporte a dois tipos de bloco para marcas de seleção: marca de seleção e grupo de marcas de seleção. Um bloco de grupo de marcas de seleção é uma coleção de blocos de caixa de seleção. Esses tipos de bloco têm as constantes correspondentes BT_Checkmark e BT_CheckmarkGroup na enumeração BlockTypeEnum. Os objetos CheckmarkBlock e CheckmarkGroup fornecem acesso aos blocos desses tipos. Para obter esses objetos, você deve usar os métodos correspondentes do objeto Block.
Para reconhecer marcas de seleção, você deve ter uma licença do ABBYY FineReader Engine com suporte ao módulo OMR.
Você pode reconhecer tanto marcas de seleção individuais quanto grupos de marcas de seleção. Cada caixa de seleção corresponde a um objeto CheckmarkBlock. Possíveis estados da caixa de seleção: marcada, não marcada, corrigida. Eles correspondem a CheckmarkCheckStateEnum. Uma marca de seleção corrigida é uma marca de seleção que foi feita na caixa de seleção e depois riscada pelo usuário.

Detectando marcas de seleção na imagem

As marcas de seleção podem ser detectadas na imagem durante a análise de layout. Para habilitar a detecção de marcas de seleção, defina a propriedade IPageAnalysisParams::DetectCheckmarks como TRUE. Após a conclusão da análise, o layout conterá um objeto CheckmarkBlock para cada marca de seleção encontrada na imagem. Elas não serão agrupadas em CheckmarkGroup. O tipo de marca de seleção será detectado automaticamente. Depois de chamar um método que execute o reconhecimento (por exemplo, IFRDocument::Recognize), ou se você usar um único método para o processamento completo (por exemplo, IFRDocument::Process), os resultados do reconhecimento de marcas de seleção serão preenchidos.
FREngine.IEngine engine;
FREngine.IFRDocument frdoc;
// Pressupomos que o documento já foi criado e que as imagens foram adicionadas ao documento
// Criar DocumentProcessingParams e definir os parâmetros
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
FREngine.IPageProcessingParams ppp = dpp.PageProcessingParams;
ppp.PageAnalysisParams.DetectCheckmarks = true;
// Usar os parâmetros para o processamento
frDoc.Process( dpp );
Se você não estiver satisfeito com os resultados da detecção automática de marcas de seleção ou precisar reconhecer grupos de marcas de seleção ou marcas de seleção personalizadas, especifique manualmente as regiões das marcas de seleção. As seções a seguir descrevem diferentes cenários:

Reconhecimento de um grupo de marcas de seleção

Para um grupo de marcas de seleção, você pode especificar um número mínimo e um número máximo de caixas de seleção marcadas no grupo (MinimumCheckedInGroup e MaximumCheckedInGroup, respectivamente). Esses valores podem ser definidos por meio do objeto CheckmarkGroup e serão usados durante o reconhecimento. Todas as marcas de seleção de um grupo devem ter os mesmos valores para as propriedades IsCorrectionEnabled e CheckmarkType. O estado da marca de seleção é calculado com base na porcentagem de pixels pretos na região. Essa porcentagem é menor para a marca de seleção desmarcada, maior para a marcada e a maior de todas para a corrigida. Portanto, para obter o resultado correto de reconhecimento, é essencial:
  • definir corretamente o tipo de marca de seleção, porque as marcas de seleção do tipo CMT_Circle e CMT_Square têm uma borda preta, que precisa ser levada em conta ao calcular a porcentagem;
  • especificar a região exata da marca de seleção, porque a porcentagem de pixels pretos será calculada em toda a região e, se áreas irrelevantes forem incluídas nela, a estimativa poderá ser prejudicada.
Para reconhecer um grupo de marcas de seleção:
  1. Crie um objeto FRDocument a partir de uma imagem com um grupo de marcas de seleção. Por exemplo, você pode usar o método CreateFRDocumentFromImage do objeto Engine.
  2. Obtenha a página com a imagem das marcas de seleção da coleção de páginas do documento (IFRDocument::Pages) — use as propriedades e os métodos da coleção FRPages.
  3. Obtenha o objeto Layout, que corresponde a essa página, por meio da propriedade IFRPage::Layout.
  4. Para cada grupo de marcas de seleção:
  5. Crie um objeto Region usando o método IEngine::CreateRegion e adicione retângulos a ele usando o método IRegion::AddRect.
  6. Crie um objeto Block do tipo grupo de marcas de seleção e adicione-o à coleção de blocos do layout (ILayout::Blocks) usando o método ILayoutBlocks::AddNew (use a constante BT_CheckmarkGroup e o objeto Region criado como parâmetros de entrada. O método também exige o índice do bloco no layout como terceiro parâmetro de entrada).
  7. Obtenha o objeto CheckmarkGroup (use o método IBlock::GetAsCheckmarkGroup).
É essencial definir corretamente o tipo e a região da marca de seleção para obter o resultado correto de reconhecimento.
  1. Para cada marca de seleção no grupo:
  2. Crie o objeto Region usando o método IEngine::CreateRegion e adicione retângulos a ele com o método IRegion::AddRect.
  3. Crie um novo bloco de caixa de seleção no grupo usando o método ICheckmarkGroup::AddNew (use o objeto Region criado como parâmetro de entrada).
  4. Obtenha o objeto CheckmarkBlock (use o método IBlock::GetAsCheckmarkBlock) e defina os parâmetros necessários (CheckmarkType, IsCorrectionEnabled).
  5. Defina os parâmetros necessários do grupo de marcas de seleção (MinimumCheckedInGroup, MaximumCheckedInGroup).
  6. Para reconhecer as marcas de seleção, use qualquer um dos métodos de reconhecimento disponíveis, como IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, etc.
...
// Obtenha um objeto Layout
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Defina a região do bloco
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Crie um bloco do tipo grupo de marcas de seleção e adicione-o ao layout no final da coleção
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_CheckmarkGroup, region, layout.Blocks.Count);
FREngine.ICheckmarkGroup checkmarkGroup = block.GetAsCheckmarkGroup();
// Crie blocos do tipo caixa de seleção
// e adicione-os ao grupo de marcas de seleção
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);
}
...

Reconhecendo uma única marca de seleção

  1. Crie um objeto FRDocument a partir de uma imagem com uma marca de seleção. Por exemplo, você pode usar o método CreateFRDocumentFromImage do objeto Engine.
  2. Obtenha a página com a imagem das marcas de seleção na coleção de páginas do documento (IFRDocument::Pages) — use as propriedades e os métodos da coleção FRPages.
  3. Obtenha o objeto Layout correspondente a essa página por meio da propriedade IFRPage::Layout.
  4. Crie o objeto Region usando o método IEngine::CreateRegion e adicione retângulos a ele usando o método IRegion::AddRect.
  5. Crie um objeto Block do tipo marca de seleção e adicione-o à coleção de blocos do layout (ILayout::Blocks) usando o método ILayoutBlocks::AddNew (use a constante BT_Checkmark e o objeto Region criado como parâmetros de entrada).
  6. Obtenha o objeto CheckmarkBlock (use o método IBlock::GetAsCheckmarkBlock) e defina os parâmetros necessários (CheckmarkType, IsCorrectionEnabled).
É essencial definir corretamente o tipo e a região da marca de seleção para obter o resultado de reconhecimento correto.
  1. Para reconhecer a marca de seleção, use qualquer um dos métodos de reconhecimento disponíveis, como IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages, etc.
...
// Obter um objeto Layout
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Definir a região do bloco
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Criar um bloco do tipo marca de verificação e adicioná-lo ao layout no final da coleção
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_Checkmark, region, layout.Blocks.Count);
FREngine.ICheckmarkBlock checkmark = block.GetAsCheckmarkBlock();
...

Como reconhecer marcas de seleção de tipo personalizado

O ABBYY FineReader Engine pode reconhecer marcas de seleção no formato padrão: marcas de seleção em quadrados, marcas de seleção sobre um fundo em branco e marcas de seleção em círculos (consulte as constantes CheckmarkTypeEnum). Como você pode ver na descrição das constantes da enumeração CheckmarkTypeEnum, há mais um tipo de marca de seleção que pode ser reconhecido — CMT_Custom. Ele se destina a marcas de seleção de tipo não padrão. Se as imagens a serem reconhecidas contiverem marcas de seleção de tipo não padrão, você poderá treinar o FineReader Engine para reconhecer esse tipo de marca de seleção. Para reconhecer marcas de seleção de tipo não padrão:
  1. Encontre uma imagem com algumas marcas de seleção não marcadas do tipo que você deseja reconhecer. Pode ser a imagem de um formulário em branco que contenha essas marcas de seleção.
  2. Crie um objeto FRDocument a partir dessa imagem. Por exemplo, você pode usar o método CreateFRDocumentFromImage do objeto Engine.
  3. Obtenha a página com a imagem das marcas de seleção na coleção de páginas do documento (IFRDocument::Pages) — use as propriedades e os métodos da coleção FRPages.
  4. Obtenha o objeto Layout correspondente a essa página por meio da propriedade IFRPage::Layout.
  5. Especifique a região e o tipo de cada bloco de caixa de seleção na página:
  6. Crie o objeto Region usando o método IEngine::CreateRegion e adicione a ele os retângulos da região da marca de seleção usando o método IRegion::AddRect.
  7. Crie um objeto Block do tipo marca de seleção e adicione-o à coleção de blocos do layout (ILayout::Blocks) usando o método ILayoutBlocks::AddNew (use a constante BT_Checkmark e o objeto Region criado como parâmetros de entrada).
  8. Obtenha o objeto CheckmarkBlock (use o método IBlock::GetAsCheckmarkBlock) e defina sua propriedade CheckmarkType como CMT_Custom.
É essencial definir corretamente o tipo e a região da marca de seleção para obter o resultado correto do reconhecimento.
  1. Treine o FineReader Engine para reconhecer esse tipo de marca de seleção: chame o método LearnCheckmarks do objeto FRPage.
  2. Como resultado, a propriedade TrainingData do objeto CheckmarkBlock que você criou antes do treinamento conterá informações sobre o tipo personalizado de marca de seleção. Agora, essas informações podem ser usadas para reconhecer outras marcas de seleção do mesmo tipo. Você pode salvá-las em um arquivo ou na memória usando o método SaveToMemory (somente Windows) ou o método SaveToFile do objeto CheckmarkTrainingData.
  3. Crie objetos FRDocument a partir das imagens que contêm marcas de seleção desse tipo, especifique blocos de marcas de seleção nas páginas e defina o tipo de marca de seleção como CMT_Custom. O procedimento é descrito nas etapas 2 a 5.
  4. Inicialize a propriedade TrainingData de cada objeto CheckmarkBlock com o objeto CheckmarkTrainingData obtido durante o treinamento. Por exemplo, você pode copiar o objeto usando o método CopyFrom ou carregá-lo de um arquivo ou da memória usando o método LoadFromMemory (somente Windows) ou o método LoadFromFile do objeto CheckmarkTrainingData.
  5. Chame qualquer um dos métodos de reconhecimento do objeto FRDocument ou FRPage, por exemplo, o método IFRDocument::Recognize.
  6. As propriedades BlackThreshold e SuspiciousDistance do objeto CheckmarkBlock permitem ajustar ainda mais as configurações se você não estiver satisfeito com os resultados do reconhecimento. Após o treinamento, os valores padrão dessas propriedades são substituídos por valores que devem funcionar na maioria dos casos. Quando você carrega o objeto CheckmarkTrainingData para um bloco de marca de seleção, os valores dessas propriedades também são carregados. Você pode testar diferentes valores para essas propriedades e reconhecer novamente as marcas de seleção (repetindo a etapa 10) e, quando encontrar a melhor configuração, salvar o objeto CheckmarkTrainingData novamente e usar o novo objeto para reconhecer as marcas de seleção do seu tipo personalizado.

Consulte também

CheckmarkBlock CheckmarkGroup Como trabalhar com Layout e blocos