Tesseract: C# Tesseract 3.02 Comment j'accède à chaque caractère de mot à partir d'une image

Créé le 12 janv. 2014  ·  3Commentaires  ·  Source: charlesw/tesseract

Salut, je suis novice ici.
Tout d'abord, je dois dessiner un rectangle sur chaque caractère du mot de l'image.
dans l'ancienne version de tesseract, j'ai trouvé que nous pouvons accéder à chaque personnage en

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

demo

Mais, maintenant je travaille sur winform C# avec Tesseract 3.02

TesseractEngine a = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process(image);
foreach ( ....... en page1)
{
// dessine un rectangle à partir du (cadre de délimitation de chaque caractère)
}

Question 1 : comment j'accède à chaque caractère de page1.

J'essaie de nombreuses méthodes comme PageIteratorLevel et j'obtiens une partie de la page comme la première ligne, le premier mot ou le premier bloc, mais je ne peux pas en obtenir le premier caractère.
Eh bien, je remarque que sur le texte de résultat de HOCRtext de la page1, chaque élément comme word, line , block a la valeur de Bounding box.

Question 2: comment j'obtiens la valeur de la boîte englobante de chaque élément. (Je n'ai trouvé qu'une seule méthode "TryGetBoundingBox" qui ne renvoie que des valeurs booléennes.

Merci.

question

Commentaire le plus utile

Réponse pour Q1 :

Consultez l'exemple de console fourni car il donne un exemple de la façon d'itérer les résultats, mais quelque chose comme ce qui suit devrait fonctionner :

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));
}

Notez que la hiérarchie générale des résultats est la suivante :

Bloc -> Para -> TextLine -> Word -> Symbole

C'est-à-dire que l'ensemble de résultats peut contenir de nombreux blocs, qui peuvent à leur tour contenir de nombreux paragraphes, etc.

Réponse à la question 2 :

Comme indiqué ci-dessus, la méthode TryGetBoundingBox renvoie les limites dans un paramètre de sortie. Tout comme Dictionary.TryGetValue fait.

Tous les 3 commentaires

Réponse pour Q1 :

Consultez l'exemple de console fourni car il donne un exemple de la façon d'itérer les résultats, mais quelque chose comme ce qui suit devrait fonctionner :

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));
}

Notez que la hiérarchie générale des résultats est la suivante :

Bloc -> Para -> TextLine -> Word -> Symbole

C'est-à-dire que l'ensemble de résultats peut contenir de nombreux blocs, qui peuvent à leur tour contenir de nombreux paragraphes, etc.

Réponse à la question 2 :

Comme indiqué ci-dessus, la méthode TryGetBoundingBox renvoie les limites dans un paramètre de sortie. Tout comme Dictionary.TryGetValue fait.

Salut Charles,

J'espère que vous allez bien.

Je suis nouveau dans ce domaine, je peux obtenir le texte requis à partir d'une petite image ou d'une image de test, mais pas à partir de l'image réelle :

  1. comment extraire un BIB# d'une photo.
    NotWorking

  2. Comment reconnaître une zone BIB# à partir de l'ensemble de la photographie.
    H1764

Merci.

Utilisez opencv pour rechercher et recadrer la région. Il y a un gars avec des démos écrites en Python qui ne sont pas trop difficiles à traduire en .net.

Cette page vous a été utile?
0 / 5 - 0 notes