tambem utilizada pelos servicos postais, o software faz a leitura dos zip codes (correspondente ao nosso CEP) e redirecionada para um lugar apropriado para a entrega. Um uso desta tecnologia anunciado recentemente sera feito em Sao Paulo, de acordo com o Olhar Digital, 500 cameras de alta resolucao serao instaladas nas rodovias da cidade e terao a funcao de identificar carros roubados ou que estejam com documentos irregulares, o OCR fara a leitura das placas dos carros e ira cruzar informacoes com um banco de dados. Fascinante!Mas, ha uma aplicacao bastante peculiar que pode ser usada na internet: usar algoritmos de OCR para resolver captchas. O script que realiza esta facanha foi escrito por Shaun Friedle e esta disponivel para uso com a extensao GraseMonkey, apelidado de Megaupload auto-fill captcha greasemonkey script justamente por ter sido criado para resolver os captchas que existiam no Megaupload.Um captcha qualquerMas como funciona isto? A primeira coisa que o algoritmo faz e a leitura da imagem, neste exemplo em particular, o autor do script utilizou a API do ainda-nao-finalizado HTML5, particularmente a propriedade getImageData para extrair os dados da imagem e converte-la em um array de pixels na escala de cinza. E o que a funcao abaixo faz:function convert_grey(image_data){ for (var x = 0; x < image_data.width; x++){ for (var y = 0; y < image_data.height; y++){ var i = x*4+y*4*image_data.width; var luma = Math.floor(image_data.data[i] * 299/1000 + image_data.data[i+1] * 587/1000 + image_data.data[i+2] * 114/1000); image_data.data[i] = luma; image_data.data[i+1] = luma; image_data.data[i+2] = luma; image_data.data[i+3] = 255; } }}Destaco esta funcao apenas para se ter uma nocao geral de como e feita a conversao de cada bloco de pixel. Este script funciona apenas para os captchas do Megaupload, visto que eles possuem sempre a mesma fonte, apenas mudando as cores de cada letra. Aproveitando-se disso, agora e possivel separar os tres caracteres a partir de um filtro de cores:filter(image_data[0], 105);filter(image_data[1], 120);filter(image_data[2], 135);Os numeros 105, 120 e 135 indicam o numero correspondente na escala de cinza que as letras possuem (a escala e de 0 a 255). A funcao filter pode ser conferida abaixo:function filter(image_data, colour){ for (var x = 0; x < image_data.width; x++){ for (var y = 0; y < image_data.height; y++){ var i = x*4+y*4*image_data.width; // Turn all the pixels of the certain colour to white if (image_data.data[i] == colour) { image_data.data[i] = 255; image_data.data[i+1] = 255; image_data.data[i+2] = 255; // Everything else to black } else { image_data.data[i] = 0; image_data.data[i+1] = 0; image_data.data[i+2] = 0; } } }}Apos fazer a filtragem das letras, e preciso fazer alguns ajustes antes de aplicar a imagem a rede neural. Como o script e muito extenso, nao o reproduzo aqui, mas basicamente os passos sao: remover ruidos existentes e por ultimo a imagem e cortada em um bloco 20x25, levando em conta as posicoes dos pixels da letra (o captcha nao aparece com o mesmo alinhamento, as letras podem estar com um pouco de rotacao ou desalinhadas verticalmente). Apos alguns outros ajustes geniais do autor,a matriz final contem apenas blocos contendo ou a cor branca ou