跳转到主要内容
C# 示例仅适用于 Windows 版 FRE。
ABBYY FineReader Engine 12 支持两种勾选标记块类型:checkmark 和 checkmark group。checkmark group 块是由多个 checkmark 块组成的集合。这两种块类型在 BlockTypeEnum 枚举中分别对应常量 BT_Checkmark 和 BT_CheckmarkGroup。CheckmarkBlockCheckmarkGroup 对象可用于访问这些类型的块。要获取这些对象,应使用 Block 对象中的相应方法。
要识别勾选标记,你必须拥有支持 OMR 模块的 ABBYY FineReader Engine 许可证。
你可以识别单个勾选标记,也可以识别勾选标记组。 一个复选框对应一个 CheckmarkBlock 对象。复选框可能具有以下状态:已选中、未选中、已更正。它们对应于 CheckmarkCheckStateEnum。已更正的勾选标记是指用户先在复选框中做了标记,之后又将其划掉的勾选标记。

检测图像中的勾选标记

在版面分析期间,可以检测图像中的勾选标记。要启用勾选标记检测,请将 IPageAnalysisParams::DetectCheckmarks 属性设置为 TRUE。 分析完成后,版面中会为图像上检测到的每个勾选标记包含一个 CheckmarkBlock 对象。它们不会被归入 CheckmarkGroup。勾选标记类型将自动检测。 调用执行识别的方法后 (例如 IFRDocument::Recognize) ,或者使用单个方法完成整个处理时 (例如 IFRDocument::Process) ,系统将填入勾选标记识别结果。
FREngine.IEngine engine;
FREngine.IFRDocument frdoc;
// 假定文档已创建,并且图像已添加到文档中
// 创建 DocumentProcessingParams 并设置参数
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
FREngine.IPageProcessingParams ppp = dpp.PageProcessingParams;
ppp.PageAnalysisParams.DetectCheckmarks = true;
// 使用这些参数进行处理
frDoc.Process( dpp );
如果您对自动勾选标记检测结果不满意,或者需要识别勾选标记组或自定义勾选标记,请手动指定勾选标记区域。以下各节介绍了不同的场景:

识别一组勾选标记

对于勾选标记组,您可以指定组内已勾选复选框的最小数量和最大数量 (分别为 MinimumCheckedInGroupMaximumCheckedInGroup) 。这些值可通过 CheckmarkGroup 对象设置,并将在识别过程中使用。 勾选标记组中的所有勾选标记,其 IsCorrectionEnabledCheckmarkType 属性值必须相同。 勾选标记的状态是根据该区域内黑色像素所占的百分比计算得出的。未勾选的勾选标记对应的值最小,已勾选的更大,而已更正的最大。因此,要获得正确的识别结果,必须:
  • 正确设置勾选标记类型,因为 CMT_Circle 和 CMT_Square 类型的勾选标记带有黑色边框,计算百分比时需要将其考虑在内;
  • 准确指定勾选标记的区域,因为黑色像素的百分比是基于整个区域计算的,如果区域中包含无关部分,估算结果可能会变差。
要识别勾选标记组:
  1. 从包含勾选标记组的图像创建一个 FRDocument 对象。例如,您可以使用 Engine 对象的 CreateFRDocumentFromImage 方法。
  2. 从文档的页面集合中获取包含勾选标记图像的页面 (IFRDocument::Pages) ——使用 FRPages 集合的属性和方法。
  3. 通过 IFRPage::Layout 属性,获取与该页面对应的 Layout 对象。
  4. 对于每个勾选标记组:
  5. 使用 IEngine::CreateRegion 方法创建一个 Region 对象,并使用 IRegion::AddRect 方法向其中添加矩形。
  6. 创建一个勾选标记组类型的 Block 对象,并使用 ILayoutBlocks::AddNew 方法将其添加到版面块集合 (ILayout::Blocks) 中 (使用 BT_CheckmarkGroup 常量和创建的 Region 对象作为输入参数。该方法还要求将版面中的块索引作为第三个输入参数) 。
  7. 获取 CheckmarkGroup 对象 (使用 IBlock::GetAsCheckmarkGroup 方法) 。
要获得正确的识别结果,必须正确设置勾选标记的类型和区域。
  1. 对于组中的每个勾选标记:
  2. 使用 IEngine::CreateRegion 方法创建 Region 对象,并使用 IRegion::AddRect 方法向其中添加矩形。
  3. 使用 ICheckmarkGroup::AddNew 方法在组中创建一个新的勾选标记块 (将创建好的 Region 对象作为输入参数) 。
  4. 获取 CheckmarkBlock 对象 (使用 IBlock::GetAsCheckmarkBlock 方法) ,并设置所需参数 (CheckmarkType、IsCorrectionEnabled) 。
  5. 设置勾选标记组的必要参数 (MinimumCheckedInGroup、MaximumCheckedInGroup) 。
  6. 要识别勾选标记,可使用任一可执行识别的方法,例如 IFRPage::RecognizeIFRPage::RecognizeBlocksIFRDocument::RecognizeIFRDocument::RecognizePages 等。
...
// 获取版面对象
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// 设置块区域
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// 创建一个勾选标记组类型的块,并将其添加到版面中的集合末尾
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_CheckmarkGroup, region, layout.Blocks.Count);
FREngine.ICheckmarkGroup checkmarkGroup = block.GetAsCheckmarkGroup();
// 创建勾选标记类型的块
// 并将其添加到勾选标记组中
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);
}
...

识别单个勾选标记

  1. 从包含勾选标记的图像创建一个 FRDocument 对象。例如,可以使用 Engine 对象的 CreateFRDocumentFromImage 方法。
  2. 从文档的页面集合 (IFRDocument::Pages) 中获取包含勾选标记图像的页面——使用 FRPages 集合的属性和方法。
  3. 通过 IFRPage::Layout 属性,获取与该页面对应的 Layout 对象。
  4. 使用 IEngine::CreateRegion 方法创建 Region 对象,并使用 IRegion::AddRect 方法向其中添加矩形。
  5. 创建一个勾选标记类型的 Block 对象,并使用 ILayoutBlocks::AddNew 方法将其添加到版面块集合 (ILayout::Blocks) 中 (使用 BT_Checkmark 常量和已创建的 Region 对象作为输入参数) 。
  6. 获取 CheckmarkBlock 对象 (使用 IBlock::GetAsCheckmarkBlock 方法) ,并设置所需参数 (CheckmarkType、IsCorrectionEnabled) 。
要获得正确的识别结果,必须正确设置勾选标记的类型和区域。
  1. 要识别勾选标记,请使用任一可用的识别方法,例如 IFRPage::RecognizeIFRPage::RecognizeBlocksIFRDocument::RecognizeIFRDocument::RecognizePages 等。
...
// 获取 Layout 对象
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// 设置块区域
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// 创建一个勾选标记类型的块,并将其添加到版面块集合末尾
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_Checkmark, region, layout.Blocks.Count);
FREngine.ICheckmarkBlock checkmark = block.GetAsCheckmarkBlock();
...

训练识别自定义类型的勾选标记

ABBYY FineReader Engine 可以识别标准形式的勾选标记:方框中的勾选标记、空白背景上的勾选标记以及圆圈中的勾选标记 (参见 CheckmarkTypeEnum 常量) 。如 CheckmarkTypeEnum 枚举常量的说明所示,还有一种可识别的勾选标记类型 — CMT_Custom。它用于非标准类型的勾选标记。如果要识别的图像中包含非标准类型的勾选标记,您可以训练 FineReader Engine 识别这种类型的勾选标记。 要识别非标准类型的勾选标记:
  1. 找到一张包含一些未勾选的目标类型勾选标记的图像。它可以是一张包含这些勾选标记的空白表单图像。
  2. 基于该图像创建一个 FRDocument 对象。例如,可以使用 Engine 对象的 CreateFRDocumentFromImage 方法。
  3. 从文档的页面集合中获取包含勾选标记图像的页面 (IFRDocument::Pages) —— 使用 FRPages 集合的属性和方法。
  4. 通过 IFRPage::Layout 属性,获取与该页面对应的 Layout 对象。
  5. 指定页面上每个勾选标记块的区域和类型:
  6. 使用 IEngine::CreateRegion 方法创建 Region 对象,并使用 IRegion::AddRect 方法向其中添加勾选标记区域的矩形。
  7. 创建一个勾选标记类型的 Block 对象,并使用 ILayoutBlocks::AddNew 方法将其添加到版面块集合 (ILayout::Blocks) 中 (使用 BT_Checkmark 常量和已创建的 Region 对象作为输入参数) 。
  8. 获取 CheckmarkBlock 对象 (使用 IBlock::GetAsCheckmarkBlock 方法) ,并将其 CheckmarkType 属性设置为 CMT_Custom。
必须正确设置勾选标记的类型和区域,才能获得正确的识别结果。
  1. 训练 FineReader Engine 以识别此类勾选标记:调用 FRPage 对象的 LearnCheckmarks 方法。
  2. 这样一来,您在训练前创建的 CheckmarkBlock 对象的 TrainingData 属性将包含有关自定义勾选标记类型的信息。这些信息现可用于识别其他同类型的勾选标记。您可以使用 SaveToMemory 方法 (仅限 Windows) 或 CheckmarkTrainingData 对象的 SaveToFile 方法将其保存到文件或内存中。
  3. 根据包含此类勾选标记的图像创建 FRDocument 对象,在页面上指定勾选标记块,并将勾选标记类型设置为 CMT_Custom。该过程见步骤 2 至 5。
  4. 使用训练期间获得的 CheckmarkTrainingData 对象初始化每个 CheckmarkBlock 对象的 TrainingData 属性。例如,您可以使用 CopyFrom 方法复制该对象,或者使用 CheckmarkTrainingData 对象的 LoadFromMemory 方法 (仅限 Windows) 或 LoadFromFile 方法从文件或内存中加载该对象。
  5. 调用 FRDocument 或 FRPage 对象的任一识别方法,例如 IFRDocument::Recognize 方法。
  6. 如果您对识别结果不满意,CheckmarkBlock 对象的 BlackThresholdSuspiciousDistance 属性可用于进一步微调设置。训练后,这些属性的默认值会被替换为在大多数情况下预期有效的值。为勾选标记块加载 CheckmarkTrainingData 对象时,这些属性的值也会一并加载。您可以尝试更改这些属性的值并重新识别勾选标记 (重复步骤 10) ;找到最佳配置后,再次保存 CheckmarkTrainingData 对象,并使用新对象识别您的自定义类型勾选标记。

另请参阅

CheckmarkBlock CheckmarkGroup 使用 Layout 和 Block