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 ..........
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.
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.
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:
cómo extraer un BIB # de una fotografía.
Cómo reconocer un área de BIB # de toda la fotografía.
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.
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:
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 haceDictionary.TryGetValue
.