Zum Hauptinhalt springen
C#-Beispiele gelten nur für FRE unter Windows.
ABBYY FineReader Engine 12 unterstützt zwei Blocktypen für Häkchen: Häkchen und Häkchengruppe. Ein Häkchengruppenblock ist eine Sammlung von Häkchenblöcken. Diese Blocktypen haben die entsprechenden Konstanten BT_Checkmark und BT_CheckmarkGroup in der Enumeration BlockTypeEnum. Die Objekte CheckmarkBlock und CheckmarkGroup bieten Zugriff auf Blöcke dieser Typen. Um diese Objekte zu erhalten, sollten Sie die entsprechenden Methoden des Objekts Block verwenden.
Zum Erkennen von Häkchen benötigen Sie eine ABBYY FineReader Engine-Lizenz, die das Modul OMR unterstützt.
Sie können sowohl einzelne Häkchen als auch Häkchengruppen erkennen. Jedem Kontrollkästchen entspricht ein CheckmarkBlock-Objekt. Mögliche Status eines Kontrollkästchens: angekreuzt, nicht angekreuzt, korrigiert. Sie entsprechen CheckmarkCheckStateEnum. Ein korrigiertes Häkchen ist eine Markierung, die in das Kontrollkästchen gesetzt und anschließend vom Benutzer durchgestrichen wurde.

Erkennen von Häkchen im Bild

Häkchen können während der Layout-Analyse im Bild erkannt werden. Um die Häkchenerkennung zu aktivieren, setzen Sie die Eigenschaft IPageAnalysisParams::DetectCheckmarks auf TRUE. Nach Abschluss der Analyse enthält das Layout für jedes im Bild gefundene Häkchen ein CheckmarkBlock-Objekt. Sie werden nicht zu CheckmarkGroups gruppiert. Der Häkchentyp wird automatisch erkannt. Nachdem Sie eine Methode aufgerufen haben, die die Erkennung ausführt (zum Beispiel IFRDocument::Recognize), oder wenn Sie eine einzelne Methode für die vollständige Verarbeitung verwenden (zum Beispiel IFRDocument::Process), werden die Ergebnisse der Häkchenerkennung eingetragen.
FREngine.IEngine engine;
FREngine.IFRDocument frdoc;
// Wir gehen davon aus, dass das Dokument bereits erstellt wurde und ihm Bilder hinzugefügt wurden
// Erstellen Sie DocumentProcessingParams und legen Sie die Parameter fest
FREngine.IDocumentProcessingParams dpp = engine.CreateDocumentProcessingParams();
FREngine.IPageProcessingParams ppp = dpp.PageProcessingParams;
ppp.PageAnalysisParams.DetectCheckmarks = true;
// Verwenden Sie die Parameter für die Verarbeitung
frDoc.Process( dpp );
Wenn Sie mit den Ergebnissen der automatischen Häkchenerkennung nicht zufrieden sind oder Häkchengruppen oder benutzerdefinierte Häkchen erkennen müssen, geben Sie die Häkchenbereiche manuell an. In den folgenden Abschnitten werden verschiedene Szenarien beschrieben:

Erkennen einer Gruppe von Häkchen

Für eine Häkchengruppe können Sie eine Mindest- und eine Maximalanzahl markierter Kontrollkästchen in der Gruppe angeben (MinimumCheckedInGroup bzw. MaximumCheckedInGroup). Diese Werte können über das CheckmarkGroup-Objekt festgelegt werden und werden bei der Erkennung verwendet. Alle Häkchen innerhalb einer Häkchengruppe müssen für die Eigenschaften IsCorrectionEnabled und CheckmarkType dieselben Werte haben. Der Status des Häkchens wird anhand des Prozentsatzes schwarzer Pixel in der Region berechnet. Er ist bei einem nicht markierten Häkchen am niedrigsten, bei einem markierten Häkchen höher und bei einem korrigierten Häkchen am höchsten. Für ein korrektes Erkennungsergebnis ist daher Folgendes entscheidend:
  • den Häkchentyp korrekt festzulegen, da Häkchen vom Typ CMT_Circle und CMT_Square einen schwarzen Rahmen haben, der bei der Berechnung des Prozentsatzes berücksichtigt werden muss;
  • die Region des Häkchens exakt anzugeben, da der Anteil schwarzer Pixel über die gesamte Region berechnet wird und die Schätzung ungenauer werden kann, wenn irrelevante Bereiche in die Region einbezogen werden.
So erkennen Sie eine Häkchengruppe:
  1. Erstellen Sie ein Objekt FRDocument aus einem Bild mit einer Häkchengruppe. Sie können beispielsweise die Methode CreateFRDocumentFromImage des Objekts Engine verwenden.
  2. Rufen Sie die Seite mit dem Bild der Häkchen aus der Seitensammlung des Dokuments ab (IFRDocument::Pages) — verwenden Sie dazu die Eigenschaften und Methoden der Sammlung FRPages.
  3. Rufen Sie das Objekt Layout ab, das dieser Seite über die Eigenschaft IFRPage::Layout zugeordnet ist.
  4. Für jede Häkchengruppe:
  5. Erstellen Sie ein Objekt Region mit der Methode IEngine::CreateRegion und fügen Sie ihm mit der Methode IRegion::AddRect Rechtecke hinzu.
  6. Erstellen Sie ein Objekt Block vom Typ Häkchengruppe und fügen Sie es mithilfe der Methode ILayoutBlocks::AddNew in die Sammlung der Layout-Blöcke (ILayout::Blocks) ein (verwenden Sie die Konstante BT_CheckmarkGroup und das erstellte Region-Objekt als Eingabeparameter. Die Methode erfordert außerdem den Blockindex im Layout als dritten Eingabeparameter).
  7. Rufen Sie das CheckmarkGroup-Objekt ab (verwenden Sie die Methode IBlock::GetAsCheckmarkGroup).
Für ein korrektes Erkennungsergebnis ist es entscheidend, Typ und Region des Häkchens korrekt festzulegen.
  1. Für jedes Häkchen in der Gruppe:
  2. Erstellen Sie das Region-Objekt mit der Methode IEngine::CreateRegion und fügen Sie ihm mit der Methode IRegion::AddRect Rechtecke hinzu.
  3. Erstellen Sie mit der Methode ICheckmarkGroup::AddNew einen neuen Häkchenblock in der Gruppe (verwenden Sie das erstellte Region-Objekt als Eingabeparameter).
  4. Rufen Sie das CheckmarkBlock-Objekt ab (verwenden Sie dazu die Methode IBlock::GetAsCheckmarkBlock) und setzen Sie die erforderlichen Parameter (CheckmarkType, IsCorrectionEnabled).
  5. Setzen Sie die erforderlichen Parameter der Häkchengruppe (MinimumCheckedInGroup, MaximumCheckedInGroup).
  6. Verwenden Sie zum Erkennen der Häkchen eine der verfügbaren Erkennungsmethoden, z. B. IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages usw.
...
// Ein Layout-Objekt abrufen
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Blockregion festlegen
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Einen Block vom Typ Häkchengruppe erstellen und ihn am Ende der Sammlung zum Layout hinzufügen
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_CheckmarkGroup, region, layout.Blocks.Count);
FREngine.ICheckmarkGroup checkmarkGroup = block.GetAsCheckmarkGroup();
// Blöcke vom Typ Häkchen erstellen
// und sie zur Häkchengruppe hinzufügen
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);
}
...

Erkennung eines einzelnen Häkchens

  1. Erstellen Sie aus einem Bild mit einem Häkchen ein FRDocument-Objekt. Dazu können Sie beispielsweise die Methode CreateFRDocumentFromImage des Engine-Objekts verwenden.
  2. Rufen Sie die Seite mit dem Bild der Häkchen aus der Seitensammlung des Dokuments ab (IFRDocument::Pages) — verwenden Sie dazu die Eigenschaften und Methoden der FRPages-Sammlung.
  3. Rufen Sie über die Eigenschaft IFRPage::Layout das Layout-Objekt ab, das dieser Seite entspricht.
  4. Erstellen Sie das Objekt Region mit der Methode IEngine::CreateRegion und fügen Sie ihm mit der Methode IRegion::AddRect Rechtecke hinzu.
  5. Erstellen Sie ein Block-Objekt vom Typ Häkchen und fügen Sie es mit der Methode ILayoutBlocks::AddNew in die Sammlung der Layout-Blöcke (ILayout::Blocks) ein (verwenden Sie die Konstante BT_Checkmark und das erstellte Region-Objekt als Eingabeparameter).
  6. Rufen Sie das CheckmarkBlock-Objekt ab (verwenden Sie dazu die Methode IBlock::GetAsCheckmarkBlock) und setzen Sie die erforderlichen Parameter (CheckmarkType, IsCorrectionEnabled).
Für ein korrektes Erkennungsergebnis ist es entscheidend, Typ und Region des Häkchens richtig festzulegen.
  1. Um das Häkchen zu erkennen, verwenden Sie eine der verfügbaren Erkennungsmethoden, z. B. IFRPage::Recognize, IFRPage::RecognizeBlocks, IFRDocument::Recognize, IFRDocument::RecognizePages usw.
...
// Ein Layout-Objekt abrufen
FREngine.IFRDocument document = Engine.CreateFRDocumentFromImage("D:\\Sample.tiff", null);
FREngine.ILayout layout = document.Pages[0].Layout;
// Blockregion festlegen
FREngine.IRegion region = Engine.CreateRegion();
region.AddRect(0, 0, 100, 50);
// Einen Block vom Typ Häkchen erstellen und am Ende der Sammlung zum Layout hinzufügen
FREngine.IBlock block = layout.Blocks.AddNew(FREngine.BlockTypeEnum.BT_Checkmark, region, layout.Blocks.Count);
FREngine.ICheckmarkBlock checkmark = block.GetAsCheckmarkBlock();
...

Erkennung benutzerdefinierter Häkchen trainieren

ABBYY FineReader Engine kann Häkchen in Standardformen erkennen: Häkchen in Quadraten, Häkchen auf leerem Hintergrund und Häkchen in Kreisen (siehe die Konstanten von CheckmarkTypeEnum). Wie Sie der Beschreibung der Enumerationskonstanten von CheckmarkTypeEnum entnehmen können, gibt es noch einen weiteren erkennbaren Häkchentyp — CMT_Custom. Dieser ist für Häkchen nicht standardmäßiger Form vorgesehen. Wenn die Bilder, die Sie erkennen möchten, Häkchen eines nicht standardmäßigen Typs enthalten, können Sie FineReader Engine darauf trainieren, diesen Häkchentyp zu erkennen. So erkennen Sie Häkchen eines nicht standardmäßigen Typs:
  1. Suchen Sie ein Bild mit einigen nicht markierten Häkchen des Typs, den Sie erkennen möchten. Das kann beispielsweise ein Bild eines leeren Formulars sein, das diese Häkchen enthält.
  2. Erstellen Sie aus diesem Bild ein FRDocument-Objekt. Sie können dazu beispielsweise die Methode CreateFRDocumentFromImage des Engine-Objekts verwenden.
  3. Rufen Sie die Seite mit dem Bild der Häkchen aus der Seitensammlung des Dokuments ab (IFRDocument::Pages) — verwenden Sie dazu die Eigenschaften und Methoden der Sammlung FRPages.
  4. Rufen Sie das Layout-Objekt für diese Seite über die Eigenschaft IFRPage::Layout ab.
  5. Geben Sie die Region und den Typ jedes Häkchenblocks auf der Seite an:
  6. Erstellen Sie das Objekt Region mit der Methode IEngine::CreateRegion und fügen Sie ihm mit der Methode IRegion::AddRect die Rechtecke einer Häkchenregion hinzu.
  7. Erstellen Sie ein Block-Objekt vom Typ Häkchen und fügen Sie es mithilfe der Methode ILayoutBlocks::AddNew in die Sammlung der Layout-Blöcke (ILayout::Blocks) ein (verwenden Sie die Konstante BT_Checkmark und das erstellte Region-Objekt als Eingabeparameter).
  8. Rufen Sie das CheckmarkBlock-Objekt ab (verwenden Sie dazu die Methode IBlock::GetAsCheckmarkBlock) und setzen Sie seine Eigenschaft CheckmarkType auf CMT_Custom.
Es ist unbedingt erforderlich, Typ und Region des Häkchens korrekt festzulegen, um ein korrektes Erkennungsergebnis zu erhalten.
  1. Trainieren Sie FineReader Engine so, dass diese Art von Häkchen erkannt wird: Rufen Sie dazu die Methode LearnCheckmarks des FRPage-Objekts auf.
  2. Dadurch enthält die Eigenschaft TrainingData des CheckmarkBlock-Objekts, das Sie vor dem Training erstellt haben, Informationen über den benutzerdefinierten Häkchentyp. Diese Informationen können nun verwendet werden, um andere Häkchen desselben Typs zu erkennen. Sie können sie mit der Methode SaveToMemory (nur Windows) oder der Methode SaveToFile des Objekts CheckmarkTrainingData in einer Datei oder im Speicher speichern.
  3. Erstellen Sie FRDocument-Objekte aus den Bildern, die Häkchen dieses Typs enthalten, geben Sie Häkchenblöcke auf den Seiten an und setzen Sie den Häkchentyp auf CMT_Custom. Das Verfahren ist in den Schritten 2 bis 5 beschrieben.
  4. Initialisieren Sie die Eigenschaft TrainingData jedes CheckmarkBlock-Objekts mit dem CheckmarkTrainingData-Objekt, das beim Training erzeugt wurde. Sie können das Objekt beispielsweise mit der Methode CopyFrom kopieren oder es mit der Methode LoadFromMemory (nur Windows) oder der Methode LoadFromFile des CheckmarkTrainingData-Objekts aus einer Datei oder aus dem Speicher laden.
  5. Rufen Sie eine beliebige Erkennungsmethode des FRDocument- oder FRPage-Objekts auf, z. B. die Methode IFRDocument::Recognize.
  6. Mit den Eigenschaften BlackThreshold und SuspiciousDistance des CheckmarkBlock-Objekts können Sie die Einstellungen weiter anpassen, wenn Sie mit den Erkennungsergebnissen nicht zufrieden sind. Nach dem Training werden die Standardwerte dieser Eigenschaften durch Werte ersetzt, die in den meisten Fällen voraussichtlich funktionieren. Wenn Sie das CheckmarkTrainingData-Objekt für einen Häkchenblock laden, werden auch die Werte dieser Eigenschaften geladen. Sie können mit geänderten Werten dieser Eigenschaften experimentieren und die Häkchen erneut erkennen lassen (Schritt 10 wiederholen). Wenn Sie die beste Konfiguration gefunden haben, speichern Sie das CheckmarkTrainingData-Objekt erneut und verwenden das neue Objekt, um Häkchen Ihres benutzerdefinierten Typs zu erkennen.

Siehe auch

CheckmarkBlock CheckmarkGroup Arbeiten mit Layout und Blöcken