Tesseract: C # Tesseract 3.02 Como eu acesso cada caractere da palavra da imagem

Criado em 12 jan. 2014  ·  3Comentários  ·  Fonte: charlesw/tesseract

Olá, sou novato aqui.
Primeiro, preciso desenhar um retângulo em cada caractere da palavra da imagem.
na versão antiga do tesseract descobri que podemos acessar cada personagem por

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

demo

Mas, agora estou trabalhando em C # winform com Tesseract 3.02

TesseractEngine a = new TesseractEngine (@ "./ tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process (imagem);
foreach (....... na página 1)
{
// desenha um retângulo de (caixa delimitadora de cada caractere)
}

Questão 1: como acesso cada personagem da página1.

Eu tento muitos métodos como o PageIteratorLevel e obtenho alguma parte da página como primeira linha, primeira palavra ou primeiro bloco, mas não consigo obter o primeiro caractere deles.
Bem, eu noto que no texto do resultado do HOCRtext da página 1, cada elemento como palavra, linha, bloco tem o valor da caixa delimitadora.

Pergunta 2: como obtenho o valor da caixa delimitadora de cada elemento. (Encontrei apenas 1 método "TryGetBoundingBox" que retorna apenas booleano.

obrigado.

question

Comentários muito úteis

Resposta para Q1:

Confira o exemplo de console fornecido, pois dá um exemplo de como iterar os resultados, no entanto, algo como o seguinte deve 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));
}

Observe que a hierarquia geral de resultados é a seguinte:

Bloco -> Para -> Linha de Texto -> Palavra -> Símbolo

Ou seja, o conjunto de resultados pode conter muitos blocos, que por sua vez podem conter muitos parágrafos e assim por diante.

Resposta para a pergunta 2:

Conforme descrito acima, o método TryGetBoundingBox retorna os limites em um parâmetro de saída. Muito parecido com Dictionary.TryGetValue .

Todos 3 comentários

Resposta para Q1:

Confira o exemplo de console fornecido, pois dá um exemplo de como iterar os resultados, no entanto, algo como o seguinte deve 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));
}

Observe que a hierarquia geral de resultados é a seguinte:

Bloco -> Para -> Linha de Texto -> Palavra -> Símbolo

Ou seja, o conjunto de resultados pode conter muitos blocos, que por sua vez podem conter muitos parágrafos e assim por diante.

Resposta para a pergunta 2:

Conforme descrito acima, o método TryGetBoundingBox retorna os limites em um parâmetro de saída. Muito parecido com Dictionary.TryGetValue .

Oi charles,

Espero que você esteja bem.

Eu sou novo nessas coisas, posso obter o texto necessário de uma pequena imagem ou imagem de teste, mas não da imagem real:

  1. como extrair um BIB # de uma fotografia.
    NotWorking

  2. Como reconhecer uma área BIB # de toda a fotografia.
    H1764

Obrigado.

Use o opencv para encontrar e cortar a região. Há um cara com demos escritos em Python que não são muito difíceis de traduzir para .net.

Esta página foi útil?
0 / 5 - 0 avaliações