Reconhecimento de Captcha com AForge.NET e Tesseract

CAPTCHA é um acrônimo da expressão “Completely Automated Public Turing test to tell Computers and Humans Apart” ou “Teste de Turing público completamente automatizado para diferenciação entre computadores e humanos“. Ele tem por objetivo verificar se o usuário de determinado serviço é humano e não um algoritmo automatizado.

Muitos serviços, informações e controles disponibilizados na internet utilizam essa ferramenta para se proteger de ataques, web crawlers, etc, afim de não comprometer o bom funcionamento e segurança do sua aplicação.

Atualmente existem diversos tipos de CAPTCHA que são desenvolvidos e/ou utilizados por diversas empresas.


Receita Federal
Facebook Recaptcha
Recaptcha

Existem casos onde é necessário automatizar algumas tarefas. Mas quando você é barrado por uma verificação dessas, o que fazer? Pois bem, existem várias técnicas para realizar o reconhecimento automático de CAPTCHA. Uma delas é utilizando o AForge.NET juntamente com o Tesseract.

Conhecendo e baixando as ferramentas

O AForge.NET é um framework escrito em C# para desenvolvedores e pesquisadores trabalharem com tratamento de imagens, redes neurais, algoritmo genéticos, aprendizado de máquina, etc. É Facilmente encontrado com uma breve pesquisa ou pode ser baixado neste link

recogCaptcha_03

O Tesseract é uma ferramenta open source para OCR, com algumas combinações é possível reconhecer vários tipo de imagem em até 60 idiomas. A versão adaptada para o uso com c# pode ser encontra neste link

recogCaptcha_04

Criando o Projeto

Primeiro vamos criar um projeto simples WinForms apenas para referenciar as nossas ferramentas e exemplificar o uso das mesmas.

Abra o Visual Studio, clique em File > New Project. Na seção Windows escolha: Windows Forms Application. Defina um nome para ele e clique em OK

recogCaptcha_01

Adicionando arquivos e referências

O próximo passo é adicionarmos os arquivos e referências das ferramentas:

    • AForge.NET: Adicionar a referência para AForge.dll e AForge.Imaging.dll (Utilizaremos apenas elas para fazer o tratamento de imagem dos nossos captchas).

 

  • Tesseract: Adicionar a referência para Tesseract.dll. Adicionar na raiz do projeto a pasta “tessdata” que contém uma espécie de base de dados treinada para o reconhecimento OCR. É necessário adicionar as dll’s: liblept168.dll e libtesseract302.dll na raiz do projeto também.

ATENÇÃO: Em todos os arquivos adicionados do Tesseract é necessário marcar a opção “Copy to Output Direcoty” que pode ser definido clicando sobre o arquivo dentro do Visual Studio e indo em propriedades.

 

 

 

 

Implementação

Vamos adicionar 3 controles ao nosso Form:

  • OpenFileDialog: Servirá para selecionarmos a imagem do captcha.
  • PictureBox: Receberá o resultado do nosso tratamento de imagem
  • Label: Mostrará o resultado do reconhecimento do captcha

recogCaptcha_02

O código do OpenFileDialog ficará assim:

private void openImageButton_Click(object sender, EventArgs e)
{
    openFileDialog.ShowDialog();
}
 
private void openFileDialog_FileOk(object sender, CancelEventArgs e)
{
    Bitmap image = new Bitmap(openFileDialog.FileName);
    if (image != null)
    {
        System.IO.FileInfo fi = new System.IO.FileInfo(openFileDialog.FileName);
        resultLabel.Text = reconhecerCaptcha(image);
    }
    image.Dispose();
}

Aqui ele transforma a imagem selecionada em um Bitmap e passa como parâmetro para o método “reconhecerCaptcha”

private string reconhecerCaptcha(Image img)
{
    Bitmap imagem = new Bitmap(img);
    imagem = imagem.Clone(new Rectangle(0, 0, img.Width, img.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    Erosion erosion = new Erosion();
    Dilatation dilatation = new Dilatation();
    Invert inverter = new Invert();
    ColorFiltering cor = new ColorFiltering();
    cor.Blue = new AForge.IntRange(200, 255);
    cor.Red = new AForge.IntRange(200, 255);
    cor.Green = new AForge.IntRange(200, 255);
    Opening open = new Opening();
    BlobsFiltering bc = new BlobsFiltering();
    Closing close = new Closing();
    GaussianSharpen gs = new GaussianSharpen();
    ContrastCorrection cc = new ContrastCorrection();
    bc.MinHeight = 10;
    FiltersSequence seq = new FiltersSequence(gs, inverter, open, inverter, bc, inverter, open, cc, cor, bc, inverter);
    pictureBox.Image = seq.Apply(imagem);
    string reconhecido = OCR((Bitmap)pictureBox.Image);
    return reconhecido;
}

Aqui está toda a parte de tratamento de imagem, removendo informações desnecessárias na imagem, afim de ser melhor reconhecido pelo OCR. Utilizando as funcionalidades do AForge.NET é possível criar filtros conforme a necessidade e aplicá-los em uma sequência na imagem. Ele possui inúmeros filtros, como: Erosão, Dilatação, Contraste, Cor, entre outras.
Neste caso foi implementado alguns filtros específicos para um tipo de CAPTCHA. Caso você tenha outro padrão é necessário implementar ele utilizando outros filtros e/ou outra sequência.

O último passo é o reconhecimento OCR:

private string OCR(Bitmap b)
{
    string res = "";
    using (var engine = new TesseractEngine(@"tessdata", "eng", EngineMode.Default))
    {
        engine.SetVariable("tessedit_char_whitelist", "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        engine.SetVariable("tessedit_unrej_any_wd", true);
 
        using (var page = engine.Process(b, PageSegMode.SingleLine))
        res = page.GetText();
    }
    return res;
}

Aqui o trabalho é feito pelo Tesseract, onde é possível definir um conjunto de caracteres que serão aceitos no reconhecimento. Isso requer uma análise das possibilidades de combinação que o tipo de CAPTCHA que você está utilizando tem. Essa definição é uma espécie de “white list” que contribui evitando erros.

Resultados dos testes

Imagens Originais

captcha_1 captcha_2 captcha_3

Imagens resultantes (após tratamento de imagem e OCR)

captcha_result_1 captcha_result_2 captcha_result_3

Para quem se interessar, disponibilizei o projeto na íntegra no meu GitHub
https://github.com/andreluizsecco/RecogCaptcha

Documentação do AForge.NET
https://www.aforgenet.com/framework/docs

Documentação do Tesseract
https://code.google.com/p/tesseract-ocr/wiki/Documentation

 

Qualquer sugestão, dúvida ou esclarecimento, utilize os comentários abaixo.

10 comentários sobre “Reconhecimento de Captcha com AForge.NET e Tesseract

    1. Obrigado pelo feedback Eric! Vou ver se escrevo um artigo apenas sobre o AForge.NET que é responsável pelo tratamento de imagem. Fique de olho no blog 🙂

  1. André, boa tarde.
    Sou estudante de Engenharia da Computação e estou pesquisando bastante para fazer meu Trabalho de Conclusão utilizando OCR. Minha idéia é fazer um sistema de reembolso, e aplicar o OCR em cupons fiscais para facilitar a entrada dos dados no sistema. Mas estou penando para conseguir um resultado bom no OCR em cupons fiscais. (Estou utilizando o Tesseract) Por acaso você conhece alguma outra tecnologia que possa facilitar o meu trabalho?

    1. Olá Rodolfo, em relação ao reconhecimento de captchas eu teria outras alternativas para lhe indicar, porém não se aplicaria ao seu caso.
      Recomendo que dê uma olhada nos seguintes projetos de exemplo que implementam OCR e verifique se você consegue adaptar para o seu projeto:
      * http://www.codeproject.com/Articles/29172/Converting-Images-to-Text-using-Office-OCR-Op
      * http://www.codeproject.com/Articles/10130/OCR-with-Microsoft-Office
      * https://social.msdn.microsoft.com/Forums/en-US/48c9a1d1-3353-44f5-ba1f-ce1bd01dfa12/read-text-from-image-using-c?forum=csharplanguage

      Há alguns SDK’s, mas são pagos, como o ABBYY Fine Reader SDK.
      Espero que ajude!

  2. na instalação do tesseract não acompanha o tesseract.dll,
    da erro em alguns arquivos que durante a instalação, tenta fazer o download, o que fazer agora???

  3. Boa noite André.

    Em primeiro lugar ótimo artigo.
    Pergunto: Como posso usar esse componente no reconhecimento de placa de veículos?
    Tentei usar o Opencv, porem tive dificuldades pela complexidade do código.

    Se for possível dar um norte agradeço.

    1. Obrigado Antonio! Acredito que terá que usar a mesma lógica. Utilizar o Aforge.NET (testando vários filtros) e no momento que a foto ficar bem “limpa”, tentar o reconhecimento OCR via o Tesseract. Dá uma olhada nas documentações e no código. É bem tranquilo para implementar, porém terás que fazer vários testes para otimizar o reconhecimento.

  4. Olá, bom dia, gostaria de saber como faz para o programa reconhecer a fonte vermelha, que é o caso dos captchas do sintegra, obrigado.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *