O documento descreve o desenvolvimento de um sistema de reconhecimento óptico de marcas (OMR) com PHP para automatizar a tabulação de dados de questionários. Inicialmente, o autor analisa as limitações de soluções existentes e, então, detalha como implementou um algoritmo que corrige distorções de imagem e identifica marcações com precisão para gerar resultados em JSON. A nova abordagem reduziu significativamente o tempo de processamento e aumentou a capacidade do sistema em 6 vezes.
2. Quem sou eu?
👨💻 Developer since 2007
👶 Father of a boy
🌱 Organizer @phpmg
👔 Owner @supliutecnologia
🤠 Brazilian ten-string guitar player
🎓 Systems Analyst and Development - UNA - 2011
🎓 Interaction Design Specialist UX/UI - PUC Minas - 2016
https://github.com/jansenfelipe
@jansenfelipe
https://jansenfelipe.com.br
14. Contexto
Como resolver esses problemas?
Depois
respondo..
Preguiça..
$
Esqueci..
Preguiça..
Spam..
Nao tenho
celular
Nao tenho
email..
15. Contexto
Como resolver esses problemas?
● O questionário em
papel já funciona bem
● As pessoas respondem
na hora
● A memória das pessoas
está fresca
19. O que é OMR?
Optical Mark Recognition é o processo de captura de dados
marcado por humanos a partir de formas de documentos, tais
como pesquisas e testes.
https://en.wikipedia.org/wiki/Optical_mark_recognition
20. O que é OMR?
● Coleta dados de
questionários
● Correção de
gabaritos de
provas
49. Algoritmo
○ Carregar imagem
○ Carregar mapa JSON
○ Avaliar cada target o % de pixels (Pretos vs. Brancos)
○ SE maior que a tolerância:
■ Considerar TRUE
○ SENÃO
■ Considerar FALSO
○ Gerar output
61. Algoritmo
○ Carregar imagem
○ Carregar mapa JSON
○ Avaliar cada target o % de pixels (Pretos vs. Brancos)
○ SE maior que a tolerância:
■ Considerar TRUE
○ SENÃO
■ Considerar FALSO
○ Gerar output
62. Atualização do algoritmo (antes)
○ Carregar imagem
○ Carregar mapa JSON
○ Avaliar cada target o % de pixels (Pretos vs. Brancos)
○ SE maior que a tolerância:
■ Considerar TRUE
○ SENÃO
■ Considerar FALSO
○ Gerar output
63. Atualização do algoritmo (depois)
○ Carregar imagem
○ Carregar mapa JSON
○ Calcular distância entre os pontos.
○ Calcular ângulo de inclinação.
○ Encontrar a posição dos pixels extremos.
○ Calcular ângulo de inclinação.
○ Rotacionar a imagem de acordo com a diferença entre os ângulos.
○ Encontrar novamente a posição dos pixels extremos.
○ Calcular distância entre os pontos.
○ Ajustar tamanho da imagem de acordo com o percentual encontrado.
○ Avaliar cada target o % de pixels (Pretos vs. Brancos)
○ SE maior que a tolerância:
■ Considerar TRUE
○ SENÃO
■ Considerar FALSO
○ Gerar output