Boa tarde pessoal!
Recentemente precisei de implementar um script que pudesse reconhecer marcações em um questionário de avaliação. Pesquisei na internet e encontrei um processo batizado de OMR (Optical Mark Recognition).
O processo consiste basicamente em detectar marcações em uma imagem (algo muito utilizado em reconhecimento automático de fichas de avaliação, provas de concurso, etc)
Em busca por soluções prontas ..
O SDAPS é um software escrito em Python. (Muito bom por sinal!) Utilizei ele por um ano e, no início, atendeu todas as necessidades do meu projeto. Porém, eu precisei de criar alguns formulários customizados e o meu baixo conhecimento da linguagem dificultava o desenvolvimento.
.. surgiu a ideia de escrever um OMR com o PHP! 🙂
Ao estudar a técnica, percebi que não seria tão complicado fazer isso com o PHP. Nele temos algumas libraries (Imagick, GD) de processamento de imagem que facilitaria o trabalho.
Naquele momento, gostaria de criar um código que fosse capaz de reconhecer qualquer tipo de questionário.
Assim nasceu o package jansenfelipe/omr. Ele basicamente utiliza um arquivo de mapeamento (em json) que possui as coordenadas (x,y) para orientar o script a avaliar, em determinada região da imagem, a quantidade de pixels pretos/brancos.

O resultado é um array com a informação se determinado “alvo” está marcado ou não

Como utilizar:
Primeiro, instale o package utilizando o composer
1 |
$ composer require jansenfelipe/omr |
Agora, você vai precisar criar o arquivo de mapeamento (Ver exemplo). Este arquivo receberá algumas informações a respeito do questionário digitalizado, dentre elas, os alvos (targets) que serão considerados ao efetuar o reconhecimento.
Obs: A library utiliza a extension php5_imagick para efetuar a leitura das imagens.
Executando o script da linha de comando
Para executar o script, informe o caminho da imagem junto com o caminho do arquivo de mapeamento:
$ php vendor/bin/omr scan <imageJPG> <mapJSON>
Utilizando no seu código
Você pode instanciar um Scanner e passar os parâmetros necessários:
1 2 3 4 5 6 7 8 9 10 |
/* * Setup scanner */ $scanner = new ImagickScanner(); $scanner->setImagePath($imagePath); /* * Scan */ $result = $scanner->scan(MapJson::create($mapJsonPath), 28); |
Fique a vontade para enviar suas dúvidas, sugestões! Pull Requests são sempre bem vindos!