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 ..........
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.
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.
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:
como extrair um BIB # de uma fotografia.
Como reconhecer uma área BIB # de toda a fotografia.
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.
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:
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 comDictionary.TryGetValue
.