Skip to content

Projeto desenvolvido na disciplina PSI3471 - Fundamentos de Sistemas Eletrônicos Inteligentes

License

Notifications You must be signed in to change notification settings

matheusrmorgado/qr-code-reader

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Localizador de QR-Code

Descrição do problema

Para a realização do exercício programa foram disponibilizadas 16 imagens, sendo que em cada uma aparece um único QR-code. Nessas imagens, os QR-codes aparecem aproximadamente em pé, com pequenas distorções em perspectiva.

Dado esse material inicial, o objetivo desse trabalho consiste em fazer um programa que lê uma imagem com QR-code e gera uma outra imagem que identifica a localização das três marcas quadradas localizadoras do QR-code.

Para ler a descrição completa do problema, acesse: Enunciado.pdf.

Operação

Para executar o programa, o usuário deve acessar pelo prompt de comando a pasta em que está localizado o arquivo QRCode.cpp. Caso ainda não tenha compilado, o usuário deve compilar digitando no prompt o seguinte comando:

compila QRCode.cpp -cek

Agora compilado, o usuário deve ter na mesma pasta que está localizado o arquivo QRCode.cpp, o arquivo padrao.png que será utilizado no programa.

Com isso garantido, o usuário deve digitar 3 argumentos para a execução correta do programa:

  • QRCode
  • Nome da imagem de QR-code
  • Nome do arquivo da imagem do QR-code com identificação que será gerada após a execução do programa

Para facilitar a visualização, os 3 valores impressos na imagem que auxiliam na identificação do QR-code (MatchLoc) são também disponibilizados no prompt de comando.

Técnicas utilizadas para resolução do problema

Nesse programa foi utilizada a biblioteca cekeikon.h para que fosse possível aplicar funções do Cekeikon e do OpenCV. Para fazer download dessa biblioteca é necessário acessar: http://www.lps.usp.br/hae/software/cekeikon5.html.

Para resolver o problema proposto, foram criadas 3 funções a fim de organizar o código e deixar a lógica de programação mais fácil de ser compreendida. A seguir, essas funções serão explicadas com mais detalhes.

Os primeiros comandos se referem à leitura de duas imagens, uma imagem que possui um QR-code e uma imagem padrão que será utilizada para localizar marcas quadradas.

Após a leitura, foi necessário encontrar a dimensão da imagem padrão que melhor localizasse as marcas quadradas na imagem original do QR-code. Para a realização desse procedimento foi criada a função achaTamanho.

achaTamanho

Para encontrar a melhor dimensão, essa função redimensiona a imagem padrão, representada pela matriz templ, para várias escalas por meio da função do OpenCV resize.

Essa imagem redimensionada é então comparada com a imagem original do QR-code, representada pela matriz image, por meio da função do OpenCV matchTemplate.

O resultado dessa comparação é armazenado na matriz result, que é analisada com a função do OpenCV minMaxLoc para verificar qual o seu maior valor. A localização do ponto que possui esse maior valor, representa o ponto mais claro da matriz result.

Após esse procedimento, a função achaTamanho retorna a dimensão da imagem padrão que obteve o maior valor na análise da matriz result. Com esse valor, foi possível construir a matriz result mais adequada para a continuação da resolução do problema.

localizaQR

O procedimento descrito abaixo é repetido 3 vezes para que seja possível localizar as 3 marcas quadradas da imagem do QR-code. Por meio da função do OpenCV minMaxLoc, encontra-se a posição do ponto de maior valor da matriz result gerada após o procedimento da função achaTamanho.

Esse ponto representa o vértice superior esquerdo do retângulo que é desenhado para identificação da marca quadrada do QR-code. Além disso, a localização desse ponto é também utilizada para desenhar linhas e textos que auxiliam na identificação do QR-code.

Após a localização do primeiro quadrado, é necessário encontrar as outras duas marcas quadradas. Para facilitar esse processo, a lógica utilizada foi pintar a vizinhança e o ponto localizado anteriormente de preto para evitar que a repetição do procedimento encontre um quadrado errado.

pinta

A criação dessa função se baseia na função pintaAzul vista em aula e disponível na apostila: http://www.lps.usp.br/hae/apostila/compcon.pdf

A lógica dessa função é utilizar fila para processar componentes conexos a um ponto escolhido. Nesse caso, o ponto escolhido foi o de maior valor e o procedimento realizado foi de pintar de preto o próprio ponto e uma região próxima.

Com as 3 marcas quadradas localizadas, o problema proposto é então solucionado, uma imagem do QR-code com identificação é salva e encerra-se todas as instruções.

Referências

Direitos autorais

O trabalho aqui publicado fez uso da biblioteca Cekeikon5 para processamento de imagens e visão computacional.

Mais informações sobre essa biblioteca pode ser encontrado em: http://www.lps.usp.br/~hae/software

About

Projeto desenvolvido na disciplina PSI3471 - Fundamentos de Sistemas Eletrônicos Inteligentes

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages