识别复选标记
ABBYY FineReader Engine 12 支持两种复选标记块类型:复选标记和复选标记组。复选标记组块是一个复选标记块的集合。这些块类型在 BlockTypeEnum 枚举中有相应的常数 BT_Checkmark 和 BT_CheckmarkGroup。CheckmarkBlock 和 CheckmarkGroup 对象可提供对这些类型的块的访问。若要接收这些对象,您应该使用 Block 对象的相应方法。
重要事项!如要识别复选标记,您必须有支持 OMR 模块的 ABBYY FineReader Engine 许可证。
您可以识别单个复选标记和复选标记组。
一个复选框对应一个 CheckmarkBlock 对象。复选框可呈现状态:已勾选、未勾选、已纠正。这些状态对应 CheckmarkCheckStateEnum。已纠正的复选标记是在复选框中被用户划去的复选标记。
对于某复选标记组,您可以分别指定组中所勾选复选框的最小和最大数量(MinimumCheckedInGroup 和 MaximumCheckedInGroup)。这些值可以通过 CheckmarkGroup 对象进行设置,并且会用于识别过程。
一个复选标记组内所有复选标记的 IsCorrectionEnabled 和 CheckmarkType 属性值必须相同。
复选标记状态是根据区域中的黑色像素百分比来计算的。未勾选复选标记的该值最小,已勾选复选标记较大,已纠正复选标记最大。因此,若要得到合适的识别效果,做到以下几点至关重要:
- 正确设置复选标记类型,因为 CMT_Circle 和 CMT_Square 类型的复选标记有一个黑框,需要在计算百分比时考虑到这一点;
- 指定复选标记的确切区域,因为黑色百分比计算将涵盖整个区域,如果区域中包括一些不相关区域,估算质量将下降。
识别复选标记组
- 使用含复选标记组的图像创建 FRDocument 对象。例如,您可以使用 Engine 对象的 CreateFRDocumentFromImage 方法。
- 从文档页面集合获取带有复选标记图像的页面(IFRDocument::Pages)— 使用 FRPages 集合的属性和方法。
- 通过 IFRPage::Layout 属性获取与该页面相应的 Layout 对象。
- 对于每个复选标记组:
- 通过 IEngine::CreateRegion 方法创建 Region 对象,然后通过 IRegion::AddRect 方法向其添加矩形。
- 创建一个复选标记组类型的 Block 对象,将其添加到布局块集合 (ILayout::Blocks)中,通过 ILayoutBlocks::AddNew 方法(使用 BT_CheckmarkGroup 常数和创建的 Region 对象作为输入参数。该方法也要求将布局中的块索引作为第三个输入参数)。
- 获取 CheckmarkGroup 对象(通过 IBlock::GetAsCheckmarkGroup 方法)。
重要事项!若要获得正确的识别结果,正确设置复选标记的类型和区域至关重要。
- 对于组中的每个复选标记:
- 通过 IEngine::CreateRegion 方法创建 Region 对象,然后通过 IRegion::AddRect 方法向其添加矩形。
- 通过 ICheckmarkGroup::AddNew 方法在组中创建一个新的复选标记块 (使用创建的 Region 对象作为输入参数)。
- 获取 CheckmarkBlock 对象(通过 IBlock::GetAsCheckmarkBlock 方法)然后设置所需参数(CheckmarkType, IsCorrectionEnabled)。
- 设置必要的复选标记组参数(MinimumCheckedInGroup,MaximumCheckedInGroup)。
- 若要识别复选标记,请使用可执行识别的任何可用方法,比如 IFRPage::Recognize、IFRPage::RecognizeBlocks、 IFRDocument::Recognize、IFRDocument::RecognizePages 等等。
识别单个复选标记
- 使用含复选标记的图像创建 FRDocument 对象。例如,您可以使用 Engine 对象的 CreateFRDocumentFromImage 方法。
- 从文档页面集合获取带有复选标记图像的页面(IFRDocument::Pages)— 使用 FRPages 集合的属性和方法。
- 通过 IFRPage::Layout 属性获取与该页面相应的 Layout 对象。
- 通过 IEngine::CreateRegion 方法创建 Region 对象,然后通过 IRegion::AddRect 方法向其添加矩形。
- 创建一个复选标记类型的 Block 对象,将其添加到布局块集合 (ILayout::Blocks)中,通过 ILayoutBlocks::AddNew 方法(使用 BT_Checkmark 常数和创建的 Region 对象作为输入参数)。
- 接收CheckmarkBlock 对象(通过 IBlock::GetAsCheckmarkBlock 方法)然后设置所需参数(CheckmarkType, IsCorrectionEnabled)。
重要事项!若要获得正确的识别结果,正确设置复选标记的类型和区域至关重要。
- 若要识别复选标记,请使用任何可用的识别方法,诸如 IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages 等等。
识别自定义类型的复选标记
FineReader Engine 可识别标准形式的复选标记:正方形复选标记,空白背景下的复选标记,圆形复选标记(请参见 CheckmarkTypeEnum 常数)。如 CheckmarkTypeEnum 枚举常数说明所述,还有一个可以识别的复选标记类型:CMT_Custom。它用于非标准类型的复选标记。如果要识别的图像包含非标准类型的复选标记,您可以训练 FineReader Engine 识别这种类型的复选标记。
要识别非标准类型的复选标记:
- 找一个含有一些您想要识别的类型的未勾选复选标记的图像。它可以是一个包含复选标记的空白表单的图像。
- 从这个图像创建一个 FRDocument 对象。例如,您可以使用 Engine 对象的 CreateFRDocumentFromImage 方法。
- 从文档页面集合获取带有复选标记图像的页面(IFRDocument::Pages)— 使用 FRPages 集合的属性和方法。
- 通过 IFRPage::Layout 属性获取与该页面相应的 Layout 对象。
- 指定页面上每个复选标记块的区域和类型:
- 使用 IEngine::CreateRegion 方法创建 Region 对象,然后使用 IRegion::AddRect 方法向其添加复选标记区域的矩形。
- 创建一个复选标记类型的 Block 对象,将其添加到布局块集合 (ILayout::Blocks)中,使用 ILayoutBlocks::AddNew 方法(使用 BT_Checkmark 常数和创建的 Region 对象作为输入参数)。
- 获取 CheckmarkBlock 对象(使用 IBlock::GetAsCheckmarkBlock 方法),然后将其 CheckmarkType 属性设为 CMT_Custom。
重要事项!若要获得正确的识别结果,正确设置复选标记的类型和区域至关重要。
- 训练 FineReader Engine 识别这种类型的复选标记:调用 FRPage 对象的 LearnCheckmarks 方法。
- 因此,您在训练前创建的 CheckmarkBlock 对象的 TrainingData 属性将包含自定义复选标记类型的信息。该信息可用来识别同一类型的其它复选标记。您可以使用 CheckmarkTrainingData 对象的 SaveToFile 方法将其保存到文件或内存。
- 从包含该类型的复选标记的图像创建 FRDocument 对象,指定页面上的复选标记块,将复选标记类型设为 CMT_Custom。过程描述请见第二到第五步。
- 用训练期间获得的 CheckmarkTrainingData 对象初始化每个 CheckmarkBlock 对象的 TrainingData 的属性。例如,您可以使用 CopyFrom 方法复制对象,或使用 CheckmarkTrainingData 对象的 LoadFromFile 方法从文件或内存加载它。
- 调用 FRDocument 或 FRPage 对象的任何识别方法,例如 IFRDocument::Recognize 方法。
- 如果对识别结果不满意,您可以使用 CheckmarkBlock 对象的 BlackThreshold 和 SuspiciousDistance 属性进一步调整设置。训练后,这些属性的默认值会被某些值所替代,这些值是大多数情况下预计有效的值。当您加载某个复选标记块的 CheckmarkTrainingData 对象时,这些属性的值也会加载。您可以尝试更改这些属性的值然后重新识别复选标记(重复第10步),当找到最佳配置后,再次保存 CheckmarkTrainingData 对象,然后使用新对象识别自定义类型的复选标记。
另请参阅
03.07.2024 8:50:25