Reconhecimento de texto em várias linhas

Home Fóruns Fórum Reconhecimento de Textos com OCR e Python Reconhecimento de texto em várias linhas

Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #29553
    Profile photo ofGuilherme_MirandaGuilherme Miranda
    Participante

    Boa noite Prof. Jones primeiramente gostaria de lhe parabenizar pelo excelente curso.
    Minha dúvida é sobre como fazer o rastreamento OCR em várias linhas, e unifica-las em uma só.

    Se possível gostaria de sua ajudar para criar o código para rastrear o Número do poste abaixo que está em 2 linha, como faria para tê-lo em apenas uma “515 097”.

    O segundo caso, o número está na vertical

    número da vestical

    #29663

    Olá Guilherme! Primeiramente, ficamos felizes que esteja gostando do curso!

    Sobre sua dúvida, você poderia usar uma função do Python para substituir por espaço (” “) os caracteres que determinam uma nova linha em sua string. Talvez o modo mais simples seria usando a função replace(), cujo primeiro parâmetro é o “alvo” que você quer substituir e o segundo parâmetro é o que você quer que fique no lugar.

    Por exemplo, vamos assumir que seu texto esteja em uma variável chamada “texto” (que é populada com o retorno da função que fez o OCR). Caso você tenha usado a função image_to_string() do Pytesseract o texto vem com a formatação que ele identificou na imagem, ou seja, incluindo as quebras de linha. Então para colocar espaço no lugar das quebras de linha basta fazer assim:

    texto = texto.replace("\n", " ")

    como resultado você terá

    '515 097'

    Caso use a função image_to_data() para fazer o OCR será fácil também, você pode primeiro inicializar uma nova variável com uma string vazia

    texto_completo = “”

    obs: você coloca isso antes do for que percorrerá cada resultado retornado pela função de OCR.

    E dentro do for, pra cada iteração, você vai deixar assim

    for i in range(0, len(resultado["text"])):
    
        ....
    
        texto = resultado["text"][i]
    
        texto_completo = texto_completo + texto + " "

    ao final, a variável texto_completo conterá esse resultado “515 097”

    Se você está utilizando uma abordagem que detecta antes o texto na imagem então para fazer isso que você quer vai ser um pouco mais complexo e exige uma codificação mais específica. Caso esteja usando um detector específico para textos (como o EAST por exemplo) provavelmente será um pouco mais fácil, já que ele deve agrupar os caracteres que estejam lado a lado (igual ao image_to_data), assim:

    “515”  “097”

    ou seja, são duas detecções separadas na imagem. Basta fazer um for para percorrer os resultados e concatenar cada bloco de texto, conforme nesse ultimo código que te passei acima (e também, antes de fazer o for, de preferência agrupe pela coordenada x e y onde a bounding box inicia, para evitar que o texto final fique na ordem errada).

    E caso esteja utilizando a técnica para detectar cada caractere individualmente será um pouquinho ainda mais trabalhoso e chato, mas o conceito é igual. Você terá que agrupar cada caractere próximo a partir da coordenada x (onde inicia a bounding box do caractere) e então programar um modo de separar os caracteres cuja coordenada y (do inicio da bounding box) esteja muito acima ou muito abaixo, o que configura como uma nova linha (já que se estivesse em uma nova linha teria a coordenada y bem próxima, lembrando que o y corresponde à “altura” do ponto de início dentro da imagem).

    Obs: pelo que vejo você deseja fazer a detecção de texto em cenários naturais, buscando texto em lugares que são “comuns” e esperados (no caso, postes). Sugiro considerar a possibilidade de criar um detector de objetos (com a técnica YOLO por exemplo) para que antes de realizar o OCR seja detectada a região de interesse do objeto na imagem que você quer realizar o reconhecimento de texto, e assim, após detectada a região é possível realizar o OCR apenas dentro da área da caixa delimitadora. Ou, se não for usar um detector, utilize técnicas de processamento para considerar apenas a área que você deseja realizar o OCR (igual no exemplo do projeto para deteçcão de placas de carros), pois caso contrário o Tesseract vai ter muita dificuldade de reconhecer  (já com o EasyOCR vai ser um pouco mais fácil). Isso é interessante para descartar tudo o que estiver fora da região de interesse na imagem – o que no seu exemplo seria o próprio poste – pois talvez em algumas das fotos tiradas haja a presença de texto em outros lugares, que não seja dentro do poste (por exemplo, a foto tirada pode conter ao fundo o número da casa ou outro número que não é de seu interesse detectar) e isso vai atrapalhar mais ainda seus resultados.

    • Esta resposta foi modificada 2 meses, 2 semanas atrás por Gabriel Alves.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Você deve fazer login para responder a este tópico.