OMR (Optical Mark Recognition) com o PHP

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.

Exemplo de questionario em branco
Exemplo de questionário em branco

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

Exemplo de questionário em preenchido e o seu resultado
Exemplo de questionário em preenchido e o seu resultado

Como utilizar:

Primeiro, instale o package utilizando o composer

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:

 

Fique a vontade para enviar suas dúvidas, sugestões! Pull Requests são sempre bem vindos!

  • Douglas Araujo

    Muito bom cara! 😀

  • ktquez

    Massa demais Jansen, show.

  • Que massa cara, a pouco mais de 1 ano eu fiz a mesma coisa (https://github.com/henricavalcante/openomr) para colocar em na plataforma de ensino que eu trabalho (wiquadro.com.br) e também disponibilizei ela no github, estamos usando a mais de um ano reconhecimento de marca optica com scanner convencional e tem nos trazido uma boa economia de equipamentos e facilidade de implementação, caso queira trocar umas idéias sobre o know-how chama lá no twitter @henricavalcante, abraço.

  • Victor Magalhaes

    Demais esse pacote!

  • Pablo Weslly

    Excelente ferramenta muito bom.

  • Edno Nunes

    Olá Jansen Felipe! Muito boa essa iniciativa. Tenho um sistema onde os clientes são obrigados a utilizar leitora de gabaritos para processar os resultados depois. É uma grana que gastam com equipamento, fora a dor de cabeça.
    Vou tentar implementar esta solução para eliminar os equipamentos.
    De imediato só não consegui entender esta parte do mapeamento, vou dar uma fuçada no fim de semana pra ver como funciona, se aceita envios em massa etc.
    Abraço!

  • Arian Maykon

    Bacana cara, parabéns pelo software, vi que no site do SDAPS tem uma página de similares, http://sdaps.org/#Similar_Tools e ele tem outra lib em PHP, a queXF https://quexf.acspri.org.au/
    Abraço