Tesseract: C # Tesseract 3.02 Cómo accedo a cada carácter de la palabra desde la imagen

Creado en 12 ene. 2014  ·  3Comentarios  ·  Fuente: charlesw/tesseract

Hola, soy un novato aquí.
Primero, necesito dibujar un rectángulo en cada carácter de la palabra de la imagen.
en la versión antigua de tesseract encontré que podemos acceder a cada carácter por

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

demo

Pero ahora estoy trabajando en C # winform con Tesseract 3.02

TesseractEngine a = nuevo TesseractEngine (@ "./ tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process (imagen);
foreach (....... en la página 1)
{
// dibujar un rectángulo de (cuadro delimitador de cada carácter)
}

Pregunta 1: ¿cómo accedo a cada carácter de page1.

Intento muchos métodos como PageIteratorLevel y obtengo una parte de la página como la primera línea, la primera palabra o el primer bloque, pero no puedo obtener el primer carácter de ellos.
Bueno, me doy cuenta de que en el texto de resultado de HOCRtext de la página1, cada elemento como palabra, línea, bloque tiene el valor del cuadro delimitador.

Pregunta 2: ¿cómo obtengo el valor del cuadro delimitador de cada elemento? (Encontré solo 1 método "TryGetBoundingBox" que devuelve solo boolean.

gracias.

question

Comentario más útil

Respuesta para Q1:

Consulte la muestra de la consola que se proporciona, ya que ofrece un ejemplo de cómo iterar a través de los resultados, sin embargo, algo como lo siguiente debería funcionar:

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

Tenga en cuenta que la jerarquía general de resultados es la siguiente:

Bloque -> Para -> TextLine -> Palabra -> Símbolo

Es decir, el conjunto de resultados puede contener muchos bloques, que a su vez pueden contener muchos párrafos, etc.

Respuesta a la pregunta 2:

Como se indicó anteriormente, el método TryGetBoundingBox devuelve los límites en un parámetro de salida. Al igual que lo hace Dictionary.TryGetValue .

Todos 3 comentarios

Respuesta para Q1:

Consulte la muestra de la consola que se proporciona, ya que ofrece un ejemplo de cómo iterar a través de los resultados, sin embargo, algo como lo siguiente debería funcionar:

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

Tenga en cuenta que la jerarquía general de resultados es la siguiente:

Bloque -> Para -> TextLine -> Palabra -> Símbolo

Es decir, el conjunto de resultados puede contener muchos bloques, que a su vez pueden contener muchos párrafos, etc.

Respuesta a la pregunta 2:

Como se indicó anteriormente, el método TryGetBoundingBox devuelve los límites en un parámetro de salida. Al igual que lo hace Dictionary.TryGetValue .

Hola charles

Espero que lo estés haciendo genial.

Soy nuevo en esto, puedo obtener el texto requerido de una imagen pequeña o una imagen de prueba, pero no de la imagen real:

  1. cómo extraer un BIB # de una fotografía.
    NotWorking

  2. Cómo reconocer un área de BIB # de toda la fotografía.
    H1764

Gracias.

Utilice opencv para buscar y recortar la región. Hay un tipo con demostraciones escritas en Python que no son demasiado difíciles de traducir a .net.

¿Fue útil esta página
0 / 5 - 0 calificaciones