メインコンテンツへスキップ
C# サンプルは、Windows 版 FRE でのみ使用できます。
ABBYY FineReader Engine 12 では、チェックマーク用に 2 種類のブロックタイプ (checkmarkcheckmark group) がサポートされています。チェックマークグループブロックは、複数のチェックマークブロックをまとめたものです。これらのブロックタイプには、BlockTypeEnum 列挙体でそれぞれ対応する定数 BT_Checkmark および BT_CheckmarkGroup が定義されています。CheckmarkBlock オブジェクトおよび CheckmarkGroup オブジェクトを使用すると、これらのタイプのブロックにアクセスできます。これらのオブジェクトを取得するには、Block オブジェクトの対応するメソッドを使用します。
チェックマークを認識するには、OMR モジュールに対応した ABBYY FineReader Engine ライセンスが必要です。
単一のチェックマークだけでなく、チェックマークグループも認識できます。 1 つのチェックボックスは 1 つの CheckmarkBlock オブジェクトに対応します。チェックボックスの状態には、checked、not checked、corrected があります。これらは CheckmarkCheckStateEnum に対応しています。corrected のチェックマークとは、チェックボックス内に記入された後、ユーザーによって取り消されたチェックマークのことです。

画像上のチェックマークの検出

チェックマークは、レイアウト解析中に画像上で検出できます。チェックマークの検出を有効にするには、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 オブジェクトで設定でき、認識時に使用されます。 チェックマーク グループ内のすべてのチェックマークでは、IsCorrectionEnabled プロパティと CheckmarkType プロパティの値が同じでなければなりません。 チェックマークの状態は、領域内に占める黒いピクセルの割合に基づいて判定されます。この割合は、未チェックのチェックマークで最も小さく、チェック済みのチェックマークではそれより大きく、修正済みのチェックマークで最も大きくなります。したがって、正しい認識結果を得るには、次の点が重要です。
  • チェックマークの種類を正しく設定すること。CMT_Circle 型と CMT_Square 型のチェックマークには黒い枠があるため、割合を計算する際にこれを考慮する必要があります。
  • チェックマークの領域を正確に指定すること。黒の割合は領域全体に対して計算されるため、無関係な領域が含まれていると、推定精度が低下する可能性があります。
チェックマーク グループを認識するには、次の手順を実行します。
  1. チェックマーク グループを含む画像から FRDocument オブジェクトを作成します。たとえば、Engine オブジェクトの CreateFRDocumentFromImage メソッドを使用できます。
  2. ドキュメントのページ コレクション (IFRDocument::Pages) から、チェックマーク画像を含むページを取得します。これには FRPages コレクションのプロパティとメソッドを使用します。
  3. IFRPage::Layout プロパティを介して、このページに対応する Layout オブジェクトを取得します。
  4. 各チェックマーク グループについて:
  5. IEngine::CreateRegion メソッドを使用して Region オブジェクトを作成し、IRegion::AddRect メソッドを使用して Rectangle を追加します。
  6. チェックマーク グループ型の Block オブジェクトを作成し、ILayoutBlocks::AddNew メソッドを使用してレイアウト ブロックのコレクション (ILayout::Blocks) に追加します (入力パラメーターとして BT_CheckmarkGroup 定数と作成した Region オブジェクトを使用します。また、このメソッドでは 3 番目の入力パラメーターとしてレイアウト内のブロック インデックスも必要です) 。
  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 など、認識を実行できる任意のメソッドを使用します。
...
// 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_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つのチェックマークを認識する

  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 列挙定数の説明にあるとおり、認識可能なチェックマーク型はもう 1 つあり、それが 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 プロパティに、カスタムチェックマークの種類に関する情報が格納されます。この情報は、同じ種類のほかのチェックマークを認識する際に使用できます。CheckmarkTrainingData オブジェクトの SaveToMemory メソッド (Windows のみ) または SaveToFile メソッドを使用して、これをファイルまたはメモリに保存できます。
  3. この種類のチェックマークを含む画像から FRDocument オブジェクトを作成し、ページ上でチェックマークのブロックを指定して、チェックマークの種類を CMT_Custom に設定します。手順については、ステップ 2 ~ 5 を参照してください。
  4. 各 CheckmarkBlock オブジェクトの TrainingData プロパティを、学習時に取得した CheckmarkTrainingData オブジェクトで初期化します。たとえば、CopyFrom メソッドを使用してオブジェクトをコピーするか、CheckmarkTrainingData オブジェクトの LoadFromMemory メソッド (Windows のみ) または LoadFromFile メソッドを使用して、ファイルまたはメモリから読み込むことができます。
  5. FRDocument または FRPage オブジェクトの認識メソッドのいずれかを呼び出します。たとえば、IFRDocument::Recognize メソッドです。
  6. 認識結果に満足できない場合は、CheckmarkBlock オブジェクトの BlackThreshold プロパティと SuspiciousDistance プロパティを使用して、設定をさらに調整できます。学習後は、これらのプロパティの既定値が、多くのケースで機能すると想定される値に置き換えられます。チェックマークブロック用の CheckmarkTrainingData オブジェクトを読み込むと、これらのプロパティの値もあわせて読み込まれます。これらのプロパティ値を変更してチェックマークを再認識し (ステップ 10 を繰り返す) 、最適な構成が見つかったら、CheckmarkTrainingData オブジェクトを再度保存し、その新しいオブジェクトを使用してカスタム種類のチェックマークを認識できます。

関連項目

CheckmarkBlock CheckmarkGroup レイアウトとブロックの操作