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........
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.
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.
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 :
comment extraire un BIB# d'une photo.
Comment reconnaître une zone BIB# à partir de l'ensemble de la photographie.
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.
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 :
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 commeDictionary.TryGetValue
fait.