Tesseract: C# Tesseract 3.02 Wie ich auf jedes Zeichen eines Wortes aus Bild zugreife

Erstellt am 12. Jan. 2014  ·  3Kommentare  ·  Quelle: charlesw/tesseract

Hallo, ich bin Neuling hier.
Zuerst muss ich für jedes Zeichen des Wortes aus dem Bild ein Rechteck zeichnen.
In der alten Version von Tesseract habe ich festgestellt, dass wir auf jeden Charakter zugreifen können, indem Sie

foreach (tessnet2.Character c in word.CharList)
e.Graphics.DrawRectangle............

demo

Aber jetzt arbeite ich an C# Winform mit Tesseract 3.02

TesseractEngine a = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process(image);
foreach ( ....... in Seite1)
{
// Rechteck zeichnen aus (Bounding Box jedes Zeichens)
}

Frage 1: Wie greife ich auf jedes Zeichen von page1 zu?

Ich probiere viele Methoden wie PageIteratorLevel aus und bekomme einen Teil der Seite wie erste Zeile, erstes Wort oder erster Block, aber ich kann das erste Zeichen nicht abrufen.
Nun, ich stelle fest, dass im Ergebnistext von HOCRtext von Seite1 jedes Element wie Wort, Zeile, Block den Wert der Begrenzungsbox hat.

Frage 2: Wie erhalte ich den Wert des Begrenzungsrahmens jedes Elements? ( Ich habe nur 1 Methode "TryGetBoundingBox" gefunden, die nur boolean zurückgibt.

Danke.

question

Hilfreichster Kommentar

Antwort zu Q1:

Sehen Sie sich das bereitgestellte Konsolenbeispiel an, da es ein Beispiel dafür gibt, wie die Ergebnisse durchlaufen werden. Etwas wie Folgendes sollte jedoch funktionieren:

using (var iter = page.GetIterator()) {
    do {
        do {
            do {
                if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) {
                    // do whatever you need to do when a block (top most level result) is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) {
                    // do whatever you need to do when a paragraph is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) {
                    // do whatever you need to do when a line of text is encountered is encountered.
                }                                               
                if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) {
                    // do whatever you need to do when a word is encountered is encountered.
                }

                // get bounding box for symbol
                Rect symbolBounds;
                if(iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) {
                    // do whatever you want with bounding box for the symbol
                }
            } while(iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Block));
        } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}

Beachten Sie, dass die allgemeine Ergebnishierarchie wie folgt lautet:

Block -> Para -> Textzeile -> Wort -> Symbol

Dh die Ergebnismenge kann viele Blöcke enthalten, die wiederum viele Absätze usw. enthalten können.

Antwort zu Frage 2:

Wie oben beschrieben, gibt die Methode TryGetBoundingBox die Grenzen in einem out-Parameter zurück. Ähnlich wie bei Dictionary.TryGetValue .

Alle 3 Kommentare

Antwort zu Q1:

Sehen Sie sich das bereitgestellte Konsolenbeispiel an, da es ein Beispiel dafür gibt, wie die Ergebnisse durchlaufen werden. Etwas wie Folgendes sollte jedoch funktionieren:

using (var iter = page.GetIterator()) {
    do {
        do {
            do {
                if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) {
                    // do whatever you need to do when a block (top most level result) is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) {
                    // do whatever you need to do when a paragraph is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) {
                    // do whatever you need to do when a line of text is encountered is encountered.
                }                                               
                if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) {
                    // do whatever you need to do when a word is encountered is encountered.
                }

                // get bounding box for symbol
                Rect symbolBounds;
                if(iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) {
                    // do whatever you want with bounding box for the symbol
                }
            } while(iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Block));
        } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}

Beachten Sie, dass die allgemeine Ergebnishierarchie wie folgt lautet:

Block -> Para -> Textzeile -> Wort -> Symbol

Dh die Ergebnismenge kann viele Blöcke enthalten, die wiederum viele Absätze usw. enthalten können.

Antwort zu Frage 2:

Wie oben beschrieben, gibt die Methode TryGetBoundingBox die Grenzen in einem out-Parameter zurück. Ähnlich wie bei Dictionary.TryGetValue .

Hallo Karl,

Hoffe es geht dir super.

Ich bin neu in diesem Zeug, ich kann den erforderlichen Text aus einem kleinen Bild oder Testbild erhalten, aber nicht aus dem tatsächlichen Bild:

  1. wie man eine BIB# aus einem Foto extrahiert.
    NotWorking

  2. So erkennen Sie einen BIB#-Bereich aus dem gesamten Foto.
    H1764

Vielen Dank.

Verwenden Sie opencv, um die Region zu suchen und zuzuschneiden. Es gibt einen Typen mit in Python geschriebenen Demos, die nicht allzu schwer in .net zu übersetzen sind.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen