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 | 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
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
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
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
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
Imagens resultantes (após tratamento de imagem e OCR)
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.
Andre gostei muito sobre o post mas poderia colocar um mais explicado como se faz os tratamentos das imagens e tal;
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 🙂
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?
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!
Excelente artigo. Gostei muito da solução. Estou tendo problemas em encontrar a sequencia correta dos filtros para este tipo de imagem: http://webdourados.com.br/cap.jpg
Alguma sugestão? Obrigado.
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???
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.
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.
Olá, bom dia, gostaria de saber como faz para o programa reconhecer a fonte vermelha, que é o caso dos captchas do sintegra, obrigado.
Olá Bruno, Então, tudo que pretende fazer em relação a filtragem na imagem, você encontra especificado na documentação do Aforge.NET. Em relação a filtragem baseada em cores, você pode dar uma olhada aqui: http://www.aforgenet.com/framework/features/color_filtering.html.
Excelente é tudo que eu precisava, porém não está conseguindo ler o capcha da receita federal, pois este contém muita impureza e não estou conseguindo configurar adequadamente.
Olá Fabio,
Utilize uma ferramenta para testar quais os filtros são necessários para “limpar” sua imagem. Ele está disponível em: http://www.aforgenet.com/framework/tools/ipprototyper.html
Após achar os filtros certos, você pode adicioná-los ao código da sua aplicação.
Olá Fabio, vc teve sucesso com o da receita?
Estou na luta aqui tbm, se eu conseguir eu compartilho.
Abs.
Thank you. Very cool example