Buscar

Reconhecimento Automático de Placas Automobilísticas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 59 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 59 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 59 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

RECONHECIMENTO AUTOMÁTICO DE PLACAS AUTOMOBILÍSTICAS
Alexandre Santos Lima Paes
Projeto de Graduação apresentado ao Curso de
Engenharia Eletrônica e de Computação da Escola
Politécnica, Universidade Federal do Rio de
Janeiro, como parte dos requisitos necessários à
obtenção do título de Engenheiro.
Orientador: Eduardo Antônio Barros da Silva
Rio de Janeiro
Dezembro de 2017
RECONHECIMENTO AUTOMÁTICO DE PLACAS AUTOMOBILÍSTICAS
Alexandre Santos Lima Paes
PROJETO DE GRADUAÇÃO SUBMETIDO AO CORPO DOCENTE DO CURSO DE
ENGENHARIA ELETRÔNICA E DE COMPUTAÇÃO DA ESCOLA POLITÉCNICA
DA UNIVERSIDADE FEDERAL DO RIO DE JANEIRO COMO PARTE DOS
REQUISITOS NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE ENGENHEIRO
ELETRÔNICO E DE COMPUTAÇÃO.
Examinado por:
Prof. Eduardo Antônio Barros da Silva, Ph.D.
Prof. José Gabriel Rodriguez Carneiro Gomes, Ph.D.
Prof. Sergio Lima Netto, Ph.D.
RIO DE JANEIRO, RJ – BRASIL
DEZEMBRO DE 2017
Santos Lima Paes, Alexandre
Reconhecimento Automático de placas
automobilísticas/Alexandre Santos Lima Paes. – Rio de
Janeiro: UFRJ/ Escola Politécnica, 2017.
XII, 47 p.: il.; 29,7cm.
Orientador: Eduardo Antônio Barros da Silva
Projeto de Graduação – UFRJ/ Escola Politécnica/ Curso de
Engenharia Eletrônica e de Computação, 2017.
Referências Bibliográficas: p. 45 – 47.
1. RAPA. 2. Visão Computacional. 3. Classificadores
Haar. 4. Tesseract. 5. Python. 6. OpenCV. 7. Placa
Automobilística. 8. Inteligência Artificial. 9. Viola Jones.
10. ALPR. 11. Computer Vision. 12. Haar classifiers. 13.
Tesseract. 14. Python. 15. OpenCV. 16. License Plate.
17. Artificial Inteligence. 18. Viola Jones. I. Antônio
Barros da Silva, Eduardo. II. Universidade Federal do Rio de
Janeiro, Escola Politécnica, Curso de Engenharia Eletrônica e
de Computação. III. Título.
iii
Dedico esse projeto ao meu filho
Leandro Paes.
iv
Agradecimentos
Agradeço a Deus e a toda minha família, especialmente a minha mãe e meu pai, pois
sem eles nada disso seria possível. Agradeço ao meu filho Leandro, que sempre me
inspirou e deu motivos para que nunca desistisse e seguisse em frente. Agradeço a minha
namorada, que teve paciência nos meus momentos de ausência e me apoiou nos difíceis.
Agradeço aos meus amigos, que tornaram todos os dias ruins em maravilhosos! Agradeço
ao meu orientador pela paciência em esclarecer minhas dúvidas e pelos conselhos em
relação ao projeto. Agradeço aos membros da banca examinadora que aceitaram o meu
convite de imediato e numa data (19/12/2017) tão próxima do fim das atividades letivas.
Agradeço também a todos que me ajudaram diretamente ou indiretamente para chegar até
esse momento.
Muito Obrigado.
v
Resumo do Projeto de Graduação apresentado à Escola Politécnica/ UFRJ como parte
dos requisitos necessários para a obtenção do grau de Engenheiro Eletrônico e de
Computação.
Reconhecimento Automático de placas automobilísticas
Alexandre Santos Lima Paes
Dezembro/2017
Orientador: Eduardo Antônio Barros da Silva
Curso: Engenharia Eletrônica e de Computação
Este trabalho descreve uma forma de se realizar o Reconhecimento Automático de Pla-
cas Automobilísticas (RAPA) em vídeos. Está dividido em 4 etapas: obtenção do vídeo,
detecção da placa, pré-processamento e reconhecimento dos caracteres. Foram utilizados
classificadores Haar em cascata para detecção da placa, funções da biblioteca OpenCV
para manipulação do vídeo e das imagens, e Tesseract para o reconhecimento dos carac-
teres.
Resultados obtidos mas que ainda podem melhorar:
• 98,4% de detecções durante o dia e 59,7% à noite.
• 0,029% de falsos positivos.
• 91,7% de caracteres corretamente segmentados.
• 88,3% de caracteres corretamente reconhecidos.
Palavras-chave: RAPA, Visão Computacional, Classificadores Haar, Tesseract, Python,
OpenCV, Placa Automobilística, Inteligência Artificial, Viola Jones.
vi
Abstract of Undergraduate Project presented to POLI/UFRJ as a partial fulfillment of the
requirements for the degree of Engineer.
AUTOMATIC LICENSE PLATE RECOGNITION USING HAAR CLASSIFIERS IN
CASCADE
Alexandre Santos Lima Paes
December/2017
Advisor: Eduardo Antônio Barros da Silva
Course: Electronic Engineering
This work describes an alternative of implementing automatic license plate recognition
(ALPR) in videos. It is divided in 4 stages: video acquire, plate detection, preprocess and
character recognition. Haar cascade of classifiers were utilized for plate detection, func-
tions of OpenCV library for video and image manipulation, and Tesseract for character
recognition.
Obtained results which can still be improved:
• 98,4% of detection during day and 59,7% during night.
• 0,029% of false positives.
• 91,7% of correctly separated characters.
• 88,3% of correctly recognized characters.
Keywords: ALPR, Computer Vision, Haar classifiers, Tesseract, Python, OpenCV, Li-
cense Plate, Artificial Inteligence, Viola Jones.
vii
Sumário
Lista de Figuras x
Lista de Tabelas xii
1 Introdução 1
2 Teoria e Ferramentas 3
2.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2 OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3 Tesseract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4 Imagem Integral (Integral Images) . . . . . . . . . . . . . . . . . . . . . 4
2.5 Atributos de Haar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.6 AdaBoost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.7 Classificadores Haar em cascata . . . . . . . . . . . . . . . . . . . . . . 8
2.8 Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.9 Binarização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.10 Operações Morfológicas . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.10.1 Erosão (Erosion) . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.10.2 Dilatação (Dilation) . . . . . . . . . . . . . . . . . . . . . . . . 14
2.10.3 Abertura (Opening) . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.10.4 Fechamento (Closing) . . . . . . . . . . . . . . . . . . . . . . . 15
2.10.5 Top hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.10.6 Bottom hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.11 Extrator de Contornos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3 Construção e Funcionamento do Sistema 18
3.0.1 Etapa 1: obtenção do vídeo . . . . . . . . . . . . . . . . . . . . . 19
3.0.2 Etapa 2: detecção da placa . . . . . . . . . . . . . . . . . . . . . 19
3.0.3 Etapa 3: pré-processamento da placa . . . . . . . . . . . . . . . . 28
3.0.4 Etapa 4: reconhecimento dos caracteres . . . . . . . . . . . . . . 32
viii
4 Resultados 34
4.0.1 Detecção da placa . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.0.2 Pré-processamento da placa . . . . . . . . . . . . . . . . . . . . 37
4.0.3 Reconhecimento dos caracteres . . . . . . . . . . . . . . . . . . 38
5 Trabalhos Futuros 40
6 Conclusões 43
Referências Bibliográficas 45
ix
Lista de Figuras
1.1 Visão macro das etapas do projeto. . . . . . . . . . . . . . . . . . . . . . 2
2.1 Exemplo de Integral Image. . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Formas de Haar. A soma dos pixels dentro de retângulos brancos é sub-
traída pela soma dos escuros. . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Pseudo código do AdaBoost. . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Configuração de classificadores em cascata. . . . . . . . . . . . . . . . . 8
2.5 Combinação dos canais de cores para formar a imagem colorida. . . . . . 9
2.6 Histograma de 3 canais. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.7 Histograma de 1 canal. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.8 Imagem antes da binarização. . . . . . . . . . . . . . . . . . . . . . . . . 11
2.9 Imagem binária. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.10 Imagem binária invertida. . . . . . . . . . . . .. . . . . . . . . . . . . . 11
2.11 Em cima, a imagem colorida e sua versão em escala de cinza. Em baixo,
a imagem binarizada por média e por média gaussiana. . . . . . . . . . . 12
2.12 Imagem original e binarizada por Otsu. Exemplo de histograma bimodal . 13
2.13 Imagem original e após erosão. . . . . . . . . . . . . . . . . . . . . . . . 14
2.14 Imagem original e após dilatação. . . . . . . . . . . . . . . . . . . . . . 15
2.15 Imagem original e após abertura. . . . . . . . . . . . . . . . . . . . . . . 15
2.16 Imagem original e após fechamento. . . . . . . . . . . . . . . . . . . . . 16
2.17 Imagem original e seu Top Hat. . . . . . . . . . . . . . . . . . . . . . . . 16
2.18 Imagem original e seu Bottom Hat. . . . . . . . . . . . . . . . . . . . . . 17
2.19 Contorno simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.20 Retângulos mínimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1 Visão macro das etapas do projeto. . . . . . . . . . . . . . . . . . . . . . 18
3.2 Exemplo de comando para o treinamento dos classificadores. . . . . . . . 20
3.3 Visualização do sistema de coordenadas. . . . . . . . . . . . . . . . . . . 21
3.4 Exemplo de arquivo "info-neg-full.txt". . . . . . . . . . . . . . . . 22
3.5 Exemplo de arquivo "info-pos.txt". . . . . . . . . . . . . . . . . . . . 22
3.6 Exemplo de comando para gerar o arquivo "positives.vec". . . . . . . 23
x
3.7 Exemplo de comando para geração de novas imagens positivas. . . . . . . 24
3.8 Fotos tiradas com a câmera do celular. . . . . . . . . . . . . . . . . . . . 24
3.9 ROI’s após o tratamento com tinta preta. . . . . . . . . . . . . . . . . . . 25
3.10 Exemplos de imagens negativas baixadas. . . . . . . . . . . . . . . . . . 26
3.11 Exemplos de imagens positivas criadas. . . . . . . . . . . . . . . . . . . 26
3.12 Pseudo código do programa principal. . . . . . . . . . . . . . . . . . . . 27
3.13 Quadro em que a placa foi detectada e a placa. O retângulo vermelho
representa a região em que o classificador atua. . . . . . . . . . . . . . . 28
3.14 Pseudo código do programa de pré-processamento. . . . . . . . . . . . . 29
3.15 Etapas 1 a 6 do pré-processamento. . . . . . . . . . . . . . . . . . . . . . 30
3.16 Etapas 7 a 12 do pré-processamento. . . . . . . . . . . . . . . . . . . . . 31
3.17 Caracteres selecionados. . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1 Exemplo de interferência causada pelos faróis. . . . . . . . . . . . . . . . 35
4.2 Exemplo de falsas detecções. . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Exemplos de placas detectadas pelo classificador. . . . . . . . . . . . . . 37
4.4 Exemplos de falhas na segmentação dos caracteres. . . . . . . . . . . . . 37
4.5 Exemplo de segmentação bem sucedida. . . . . . . . . . . . . . . . . . . 38
4.6 Exemplos de placas reconhecidas pelo Tesseract. . . . . . . . . . . . . . 39
xi
Lista de Tabelas
4.1 Comparativo de detecção correta. . . . . . . . . . . . . . . . . . . . . . . 34
4.2 Comparativo de falsas detecções. . . . . . . . . . . . . . . . . . . . . . . 35
4.3 Classificadores e suas especificações. . . . . . . . . . . . . . . . . . . . . 36
4.4 Desempenho da etapa de pré-processamento. . . . . . . . . . . . . . . . 37
4.5 Desempenho do Tesseract. . . . . . . . . . . . . . . . . . . . . . . . . . 38
xii
Capítulo 1
Introdução
Segurança é um tema muito importante devido aos altos índices de violência que são
registrados no Brasil. Para a prevenção, coibição dos criminosos e detecção de compor-
tamentos fora do padrão, câmeras de segurança vêm sendo empregadas em larga escala
tanto em ambientes públicos quanto privados. Controlar a entrada e saída de veículos em
condomínios, prédios, estacionamentos etc. é um dos principais objetivos das câmeras
de segurança. Ter o controle de quais veículos entram e saem de um prédio é essencial
para inibir a atuação de criminosos. A tecnologia vem se mostrando uma grande aliada no
aumento da segurança com as câmeras, mas ela trouxe algo mais: a Inteligência Artificial.
A Inteligência Artificial pode auxiliar na tomada de decisões, predição de falhas, clas-
sificação de grupos, detecção de padrões complexos ou até mesmo automatizar tarefas
por completo. Devido ao avanço tecnológico, diversos tipos de hardware mais potentes
surgiram, possibilitando automatizar tarefas mais complexas.
Uma linha de pesquisa que está ganhando cada vez mais força se chama Visão Com-
putacional. Ela objetiva desenvolver teorias e meios para que máquinas possam "enxer-
gar", extrair informações inteligentes a partir de dados brutos como imagens ou vídeos.
Seja identificando, rastreando ou detectando um objeto sem qualquer tipo de intervenção
humana.
Uma aplicação que une Segurança, Visão Computacional e Inteligência Artificial é
o Reconhecimento Automático de Placas Automobilísticas (RAPA), o termo é mais co-
nhecido em inglês: Automatic License Plate Recognition (ALPR). Essa aplicação visa au-
mentar a segurança, utilizando algoritmos de visão computacional e inteligência artificial
1
para reconhecer de forma automática a placa de todos os veículos que estejam presentes
nas imagens ou vídeos analisados.
Este trabalho foca no reconhecimento em tempo-real de placas automobilísticas bra-
sileiras, gravadas em vídeos produzidos por câmeras de segurança. Classificadores Haar
em cascata foram empregados na detecção destas placas. Posteriormente, algoritmos pre-
sentes na biblioteca Open Source Computer Vision Library (OpenCV) [1] foram utilizados
para o aprimoramento e recorte dos caracteres presentes na placa e por fim, enviados para
o Tesseract [2], um programa de código aberto para aplicação de Reconhecimento Óptico
de Caracteres (ROC) ou em inglês: Optical Character Recognition (OCR). O diagrama
de blocos facilita a visualização das etapas do projeto.
Vídeo
Detecção da Placa
Pré-processamento
da placa
Reconhecimento
dos caracteres
Caracteres da Placa
Figura 1.1: Visão macro das etapas do projeto.
No capítulo 2 será abordada toda a teoria, um pouco do histórico e as ferramentas
utilizadas no projeto.
2
Capítulo 2
Teoria e Ferramentas
2.1 Python
É uma linguagem de programação criada por Guido van Rossum em 1991, é de alto nível,
interpretada e multiplataforma. Ela pode ser utilizada de algumas formas sendo que as
principais são: orientada a objetos e procedural. Devido a clareza e objetividade da sua
sintaxe, ela se difundiu por todo o mundo e é amplamente utilizada até os dias atuais.
A versão 2.7.13 foi adotada no trabalho por questões de familiaridade, mas as versões
3.6.X poderiam ter sido utilizadas com apenas algumas modificações de sintaxe. Mais
informações sobre Python e seu download podem ser encontrados em [3].
2.2 OpenCV
Open Source Computer Vision Library é uma biblioteca de código aberto, desenvolvida
nos anos de 1999 e 2000 pelo time da Intel. Objetiva aplicações em tempo-real de visão
computacional. Foi escrita em C/C++ mas provê interfaceamento com outras linguagens,
dentre elas, Python. A versão 3.3.0 foi utilizada no trabalho. Mais informações sobre
OpenCV e seu download podem ser encontrados em [1].
3
2.3 Tesseract
É um programa que aplica Reconhecimento Óptico de Caracteres (ROC), em inglês: Opti-
cal Character Recognition (OCR), mecanismo para reconhecimento de caracteres a partir
de uma imagem. Foi criado pela Hewlett Packard (HP) entre 1984 e 1994. Em 2005 tor-
naram o código aberto e desde 2006, o desenvolvimento do Tesseract é patrocinado pelo
Google. Foi escrito em C/C++ e possui interfaceamento com Python e outras linguagens.
Essas informações podem ser encontradas em [2] e [4]. O algoritmo é bastante robusto e
pode ser usado para identificar caracteres sozinhos ou para o reconhecimento de textos in-
teiros como identificação de linha, segmentação de caracteres e palavras, conseguindo até
identificar quando a frase é escrita inclinada. O seu algoritmo de treinamento é baseado
na maximização da similaridadeentre o caractere a ser descoberto e o testado. Foram uti-
lizados 20 amostras de 94 caracteres de 8 tipos de fontes em 4 modos diferentes (Normal,
Negrito, Itálico, Negrito e Itálico), totalizando 60160 amostras para o treino. O Tesseract
também conta com um classificador adaptativo, em que ele "aprende"características do
próprio texto que está "lendo" e ao terminá-lo, volta aos caracteres os quais não conse-
guiu identificar e aplica o classificador. Informações obtidas de [5]. A versão 3.05 foi
utilizada no trabalho.
2.4 Imagem Integral (Integral Images)
Imagem Integral (Integral Images) ou Tabela de Área Somada (Summed-area Table) é
uma matriz gerada pela aplicação da fórmula 2.1 em outra imagem.
ii(x, y) = ∑
x′≤x, y′≤y
i(x
′
, y
′
) (2.1)
Onde ii(x, y) é a Integral de Imagem e i(x
′
, y
′
) é a imagem original. O que a fórmula
faz é criar uma matriz com a mesma dimensão que a imagem original e cada célula da
matriz corresponde a soma de todos os pixels acima e a esquerda do vértice em questão
na imagem original. O exemplo abaixo facilita a compreensão:
4
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Imagem original
Integral Image
Figura 2.1: Exemplo de Integral Image.
A figura 2.1 representa o cálculo da Imagem Integral sobre uma imagem 5x5. A
intensidade de seus pixels é igual a 1 apenas para facilitar os cálculos. Com a Imagem
Integral calculada, a soma dos pixels na região laranja pode ser obtida somando as regiões
Rosa com Amarela e subtraindo as áreas Azul e Verde (25+9−15−15= 4). A vantagem
de se trabalhar com um sistema de Imagens Integrais, em vez de utilizar o valor dos pixels
diretamente, está na velocidade. Como as operações serão realizadas várias vezes sobre
a mesma imagem, o custo computacional para acessar repetidas vezes o valor dos pixels
é superior se comparado ao cálculo utilizando Imagens Integrais. Essas informações e
outras mais, podem ser encontradas no paper [6].
2.5 Atributos de Haar
Atributos de Haar (Haar features) são baseados na utilização de formas retangulares sim-
ples, previamente escolhidas. As formas utilizadas quando se deseja realçar característi-
cas presentes em rostos, são:
5
A
B
C
D
Figura 2.2: Formas de Haar. A soma dos pixels dentro de retângulos brancos é subtraída
pela soma dos escuros.
Cada uma delas visa explorar características presentes em rostos como: simetria, dife-
rença de tonalidade entre a região dos olhos, nariz e bochechas, dentre outras peculiarida-
des [6]. O nome Haar foi dado em homenagem ao matemático húngaro Alfréd Haar, que
criou um sistema de bases semelhante ao de Fourier mas com a particularidade de ser bom
em representar mudanças bruscas dos sinais [7]. Essa capacidade se mostrou muito boa
para ser aplicada em imagens, pois geralmente ocorrem mudanças bruscas entre pixels
vizinhos quando há objetos de cores distintas por exemplo.
2.6 AdaBoost
Classificadores são algoritmos de Inteligência Artificial que têm por objetivo separar um
conjunto de dados em dois ou mais grupos. A separação pode ser feita por retas, curvas,
hiperplanos, ou funções tão complexas quanto forem necessárias para alcançarem seu
objetivo. Classificadores são ditos "fracos" quando sua performance é um pouco melhor
que 50% de acerto. Uma visão abrangente e objetiva sobre classificadores pode ser lida
em [8].
6
AdaBoost [9] é um algoritmo criado por Robert E. Schapire e Yoav Freund com o
objetivo de criar uma regra de predição forte e precisa (classificador forte) a partir de
regras fracas e imprecisas (classificadores fracos).
Dado: (x1,y1), .... , (xm,ym) onde xi ∈X , yi ∈ {−1,+1}.
Inicializa: D1(i) = 1/m for i = 1 , .... , m.
Para t = 1, .... , T :
• Treina classificador fraco utilizando a distribuição Dt .
• Pega a hipótese fraca ht : X −→ {−1,+1}.
• Objetivo: Selecionar ht com o menor erro ponderado:
εt = Pri∼Dt [ht(xi 6= yi)]. (2.2)
• Escolher αt =
1
2
ln
(
1− εt
εt
)
.
• Atualiza, para i = 1, .... , m :
Dt+1(i) =
Dt(i)exp(−αtyiht(xi))
Zt
(2.3)
onde Zt é um fator normalizador (Dt+1 será a distribuição).
Retorna a hipótese final:
H(x) = sign
(
T
∑
t=1
αtht(x)
)
. (2.4)
Figura 2.3: Pseudo código do AdaBoost.
O pseudo código pode ser visto na figura 2.3. É dado um conjunto com m exemplos
previamente classificados para o treinamento (x1,y1), .... , (xm,ym) , onde cada xi está
no domínio X , e cada yi ∈ {−1,+1}. A cada iteração t = 1, .... , T , a distribuição
7
Dt é calculada sobre os m exemplos de acordo com a equação 2.3, e uma hipótese fraca
ht : X −→ {−1,+1} é calculada por um algoritmo de aprendizado fraco. O objetivo
do classificador fraco é encontrar uma hipótese fraca com um baixo erro ponderado εt
relativo a Dt . Ao final, as hipóteses fracas ht são utilizadas para calcular a soma ponderada
da função sinal 2.4, formando o conjunto H.
2.7 Classificadores Haar em cascata
Paul Viola e Michael Jones propuseram utilizar classificadores Haar em cascata no paper
[6], com o objetivo de detectar em tempo-real rostos presentes em imagens e vídeos. Os
classificadores Haar podem ser utilizados para detectar qualquer objeto, tais como placas,
e priorizam a minimização de falsos negativos, por exemplo: se o objetivo for separar
bolas brancas de outras cores, um falso negativo seria classificar uma bola branca como
sendo de outra cor.
Estágio 1 Estágio 2 Aprovados!
Não são mais processados
Rejeitados Rejeitados
Figura 2.4: Configuração de classificadores em cascata.
O AdaBoost combina diversos classificadores fracos e transforma-os em um "forte",
mas como o foco é a minimização de falsos negativos, muitos candidatos são classifi-
cados como positivos de forma incorreta. A configuração em cascata é utilizada para
resolver esse problema. O classificador forte é colocado como primeiro estágio da cas-
cata. No segundo, o AdaBoost combina os classificadores fracos, considerando apenas
os candidatos "aprovados" pelo primeiro estágio, e assim sucessivamente nos próximos
estágios. A consequência desse procedimento é que o classificador do estágio seguinte
precisa atuar somente sobre as características "positivas" do estágio anterior, dessa forma,
a característica de minimizar falsos negativos é mantida, porém os falsos positivos são
8
reduzidos a cada estágio. Quanto mais estágios a cascata possuir, menos falsos positivos
serão encontrados. Utilizando o mesmo exemplo anterior: a cada estágio as bolas que o
classificador tivesse certeza de que não fossem brancas são eliminadas, as que não tivesse
certeza, delegaria ao próximo estágio avalia-las. Ao final do processo restariam somente
as brancas. Algumas vantagens podem ser destacadas dessa abordagem: baixo índice de
falsos negativos, a quantidade de falsos positivos é reduzida a cada estágio da cascata e
a otimização de processamento, já que os demais estágios só precisam analisar as bolas
aprovadas pelo seu antecessor.
2.8 Histograma
Imagens são representadas por matrizes nos computadores. Se for uma imagem colorida
no sistema RGB, são necessários 3 valores para representar cada pixel da imagem. Se
for em escala de cinza, apenas um valor é necessário. RGB vem do inglês: Red, Green
and Blue que significa: Vermelho, Verde e Azul. Essas são as cores base deste sistema,
são utilizadas para formarem todas. Diz-se que imagens coloridas possuem 3 canais de
cor, um para cada cor base, isto é, possuem 3 matrizes associadas a ela (ver figura 2.5).
Cada uma das posições representam a intensidade necessária da respectiva cor para que
quando combinadas resultem na cor do pixel na tela. Imagens em escala de cinza possuem
apenas 1 canal, somente uma matriz associada a imagem, sendo a intensidade 0 e 255
correspondente ao preto e branco respectivamente.
(0) (255) (115) (171)
(113) (110) (88) (184)
(215) (92) (1) (225)
(195) (12) (200) (111)
(255) (0) (98) (117)(234) (110) (88) (184)
(200) (92) (1) (225)
(151) (12) (200) (255)
(125) (32) (25) (191)
(130) (110) (88) (184)
(253) (92) (1) (225)
(28) (12) (200) (111)
Red
Green
Blue
Figura 2.5: Combinação dos canais de cores para formar a imagem colorida.
9
Uma das formas de se analisar uma imagem é pelo seu histograma. É gerado um
gráfico em que o eixo X representa todas as intensidades (0 a 255), e no eixo Y representa
a quantidade de pixels que possuem aquele valor. Em imagens com 3 canais serão exibidas
três quantidades por intensidade devido a cada canal ser analisado separadamente, ver
figura 2.6. Em imagens de 1 canal existirá apenas uma quantidade por intensidade, ver
figura 2.7.
Figura 2.6: Histograma de 3 canais. Figura 2.7: Histograma de 1 canal.
Mais informações sobre histogramas podem ser encontradas em [10].
2.9 Binarização
Binarização é o processo de limitar os possíveis valores dos pixels de uma imagem em
escala de cinza, em apenas dois valores, 0 ou 255 por exemplo. O valor a ser assumido
depende do critério escolhido.
Existem algumas técnicas para realizar o processo de binarização, dentre elas:
10
Binarização Simples ou Absoluta: Escolhe-se um valor absoluto para o limiar e todos
os pixels que estiverem a baixo, irão para 0 e aqueles acima irão para 255.
Figura 2.8: Imagem antes da binarização.
Figura 2.9: Imagem binária. Figura 2.10: Imagem binária invertida.
Binarização Adaptativa: O limiar não é escolhido de forma absoluta e aplicado em toda
a imagem, ele é escolhido dinamicamente, levando em consideração somente os
valores dos pixels que estão no bloco. O processo é feito da seguinte maneira:
escolhe-se o tamanho do bloco a ser analisado, que é chamado de núcleo (kernel).
Depois é escolhido o cálculo que será realizado para definir o limiar. Por exemplo:
• Média, onde o valor médio dos pixels no bloco é escolhido como limiar;
• Média gaussiana, o resultado da média ponderada dos pixels do bloco, em que
os pesos são dados por uma distribuição gaussiana, é escolhido como limiar.
O bloco irá percorrer toda a imagem, e a cada deslocamento o limiar será calcu-
lado de acordo com a opção escolhida. Essa técnica é bastante útil quando existe
diferença de iluminação ou sombra na imagem.
11
Figura 2.11: Em cima, a imagem colorida e sua versão em escala de cinza. Em baixo, a
imagem binarizada por média e por média gaussiana.
Binarização de Otsu: A técnica apresenta melhores resultados em histogramas bimo-
dais, que possuem dois picos, pois seu princípio de funcionamento consiste em
aproximar os picos do histograma por duas funções Gaussianas, e minimizar a va-
riância intraclasse. Cada classe é uma gaussiana que possui uma média e desvio
padrão.
12
σ
2
w = q1(t)σ
2
1 (t)+q2(t)σ
2
2 (t) (2.5)
onde
q1(t) =
t
∑
i=1
P(i) & q2(t) =
I
∑
i=t+1
P(i) (2.6)
µ1(t) =
t
∑
i=1
i
P(i)
q1(t)
& µ2(t) =
I
∑
i=t+1
i
P(i)
q2(t)
(2.7)
σ
2
1 (t) =
t
∑
i=1
[i−µ1(t)]2
P(i)
q1(t)
& σ22 (t) =
I
∑
i=t+1
[i−µ2(t)]2
P(i)
q2(t)
(2.8)
O peso de cada classe é dado por 2.6, que corresponde à probabilidade de um pixel
da imagem pertencer àquela classe. Como são funções gaussianas, as médias são
dadas pelas equações 2.7. As variâncias são dadas pelas equações 2.8. Por fim,
a variância intraclasse é dada pela equação 2.5 que deve ser minimizada. Mais
informações podem ser encontradas em: [11], [12], [13], [14] e [10].
Figura 2.12: Imagem original e binarizada por Otsu. Exemplo de histograma bimodal
13
Mais exemplos de binarizações podem ser encontrados em [10].
2.10 Operações Morfológicas
Operações morfológicas são algoritmos aplicados na imagem, a fim de alterar a sua forma
de alguma maneira. As imagens devem ser binárias para que seu resultado seja conforme
esperado. Serão apresentados todos os algoritmos utilizados no trabalho, eles podem ser
encontrados no site [10].
2.10.1 Erosão (Erosion)
O nome do processo dá uma boa ideia do que ele faz, "corrói" os pixels brancos da ima-
gem. Escolhe-se um tamanho de núcleo e o mesmo irá "deslizar" sobre toda a figura.
Quando um pixel branco estiver sendo analisado, se todos os pixels dentro do núcleo
forem brancos ele permanecerá branco, caso contrário, ele é alterado para preto.
Figura 2.13: Imagem original e após erosão.
2.10.2 Dilatação (Dilation)
Dilatação é o processo inverso ao de erosão, os pixels brancos da imagem serão "incha-
dos". Escolhe-se um tamanho de núcleo e o mesmo irá percorrer toda a figura. Quando
um pixel preto estiver sendo analisado, se todos os pixels dentro do núcleo forem pretos
ele permanecerá preto, caso contrário, ele é alterado para branco.
14
Figura 2.14: Imagem original e após dilatação.
2.10.3 Abertura (Opening)
O processo de Abertura é a aplicação em série da Erosão e Dilatação na respectiva ordem.
Esse processo é muito útil para remoção de ruídos da imagem e separação de objetos que
estejam "grudados".
Figura 2.15: Imagem original e após abertura.
2.10.4 Fechamento (Closing)
O processo de Fechamento é a aplicação dos processos de Erosão e Dilatação em ordem
inversa ao processo de Abertura. Primeiro aplica-se a Dilatação e depois a Erosão. Esse
processo é muito útil para "preencher" objetos que estejam com "buracos", devido a algum
ruído ter atrapalhado o processo de binarização.
15
Figura 2.16: Imagem original e após fechamento.
2.10.5 Top hat
O processo de Top Hat é a diferença entre a imagem original e o resultado do processo
de Abertura. Ele pode ser utilizado para selecionar as regiões mais claras da imagem e
aumentar o contraste.
Figura 2.17: Imagem original e seu Top Hat.
2.10.6 Bottom hat
O processo de Bottom Hat é a diferença entre a imagem original e o resultado do processo
de Fechamento. Ele pode ser utilizado para selecionar as regiões mais escuras da imagem
e para aumentar o contraste.
16
Figura 2.18: Imagem original e seu Bottom Hat.
2.11 Extrator de Contornos
É uma função que procura a fronteira dos objetos presentes na imagem por similaridade de
cor ou intensidade dos pixels. Seu desempenho é superior se aplicado em imagens biná-
rias. O contorno pode ser retornado de forma completa ou simplificada. No primeiro caso,
todos os pontos da fronteira são retornados. No segundo, apenas os que quando interli-
gados envolvam o objeto. A função cv2.boundingRect(cnt) da biblioteca OpenCV,
recebe como parâmetro os pontos de contorno, e retorna o retângulo de tamanho mínimo
necessário para envolver completamente o objeto.
Figura 2.19: Contorno simples. Figura 2.20: Retângulos mínimos.
No capítulo 3 será abordado como cada uma das etapas do projeto foram construídas
e seus respectivos funcionamentos.
17
Capítulo 3
Construção e Funcionamento do
Sistema
Nesse capítulo serão explicadas cada uma das etapas presentes na figura 3.1.
Vídeo
Detecção da Placa
Pré-processamento
da placa
Reconhecimento
dos caracteres
Caracteres da Placa
Figura 3.1: Visão macro das etapas do projeto.
Para uma boa clareza do que foi feito, cada etapa foi explicada em um subcapítulo.
18
3.0.1 Etapa 1: obtenção do vídeo
A primeira etapa do projeto consiste na obtenção do vídeo para processamento. Foi utili-
zada uma gravação que registrou a entrada/saída do condomínio, de 15h até 21h do mesmo
dia. Esse intervalo foi escolhido para poder contemplar diversas variações de iluminação
e clima (choveu durante um período do vídeo).
As câmeras de segurança do condomínio geram imagens coloridas, de tamanho
352x240 (Largura x Altura) no formato ".dav", que é comum nos sistemas de CFTV
(Circuito Fechado de Televisão). O OpenCV consegue lidar com esse formato de vídeo
(codec) nativamente, caso algum codec não venha automaticamente com a sua instalação,
é possível baixa-los em [15]. Foi utilizada uma gravação por questões burocráticas na
obtenção do vídeo. Para ter acesso em tempo-real às imagens da câmera seria necessário
uma autorização do responsável e as senhas envolvidas no processo. Com a gravação
disponívelpara ser utilizada, a primeira etapa foi concluída.
3.0.2 Etapa 2: detecção da placa
Para a conclusão da segunda etapa, foi utilizada a técnica de Haar Cascades (cascata de
classificadores Haar). O próprio OpenCV conta com a função opencv_traincascade
[16] que realiza o treinamento dos classificadores com o AdaBoost. Para a sua execução
são necessários alguns parâmetros:
-data Caminho absoluto até o local em que o classificador será salvo.
-vec Caminho absoluto até o local em que o arquivo "positives.vec" está salvo.
-bg Caminho absoluto até o local em que o arquivo "info-neg-full.vec" está salvo.
-numPos Número de imagens positivas que serão utilizadas.
numNeg Número de imagens negativas que serão utilizadas.
-numStages Quantidade de estágios que a cascata terá.
19
-acceptanceRatioBreakValue Limite de precisão que o classificador final terá para não
ocorrer treino excessivo (overtraining), e acabar perdendo a capacidade de gene-
ralização. Quando o limite é atingido o treinamento é interrompido, mesmo se a
quantidade de estágios desejados não tiver sido atingida.
-featureType Método utilizado no treino dos classificadores.
-w Largura (width) que o objeto a ser detectado possui.
-h Altura (height) que o objeto a ser detectado possui.
-bt Método de utilização do AdaBoost.
-minhitrate Taxa mínima de acerto em cada estágio da cascata. Uma estimativa para a
taxa de acerto total é: (Rp)N onde Rp é a taxa mínima de acerto e N é o número de
estágios da cascata.
-maxfalsealarm Taxa máxima de falsos positivos desejada por estágio da cascata. Uma
estimativa para a taxa de falso positivo é: (R f p)N onde R f p é a taxa máxima de falso
positivo e N é o número de estágios da cascata.
-mode Seleciona o tipo de imagem Haar a ser utilizada.
.\opencv_traincascade -data "C:\caminho\para\destino"
-vec "C:\caminho\para\positives.vec" -bg
"C:\caminho\para\info-neg-full.txt" -numPos 8000 -numNeg 4000
-numStages 20 -acceptanceRatioBreakValue 0.00001 -featureType
HAAR -w 44 -h 20 -bt GAB -minhitrate 0.999 -maxfalsealarm 0.5
-mode ALL
Figura 3.2: Exemplo de comando para o treinamento dos classificadores.
Observação:
A largura e a altura passadas nos parâmetros -w e -h devem ser as mesmas utilizadas
na criação do arquivo "positives.vec".
20
Todas as terminologias serão explicadas, e em seguida como foram obtidas:
Imagens Positivas: São imagens que contenham o objeto a ser detectado.
Imagens Negativas: São imagens que não contenham o objeto a ser detectado.
Arquivo "info.txt": É um arquivo de texto que possui a listagem de todas as imagens
que serão utilizadas para o treinamento.
Arquivo "positives.vec": É um arquivo que contém todas as imagens positivas, que fo-
ram listadas no "info-pos.txt", em formato de vetor.
O arquivo "info-pos.txt" é para imagens positivas, e é diferente do
"info-neg-full.txt" para negativas. Existe uma pequena diferença na construção des-
ses arquivos. Para imagens negativas, o arquivo "info-neg-full.txt" conterá apenas o
caminho absoluto de cada imagem por linha, isto é, o caminho da raiz até a imagem em
questão. No caso das positivas, o arquivo "info-pos.txt" conterá: o caminho de cada
imagem relativo ao diretório que se encontra o arquivo "info-pos.txt", a quantidade
de objetos positivos que estejam presentes na imagem, a localização e o tamanho dos
mesmos, sendo passada na seguinte ordem: X, Y, W, H. Como a imagem é manipulada
como uma matriz, a posição (0,0) fica localizada no canto superior esquerdo da imagem.
W representa a largura (width) e H a altura (height).
(0,0)
(x,y) w
hObjeto
Figura
Figura 3.3: Visualização do sistema de coordenadas.
21
C:\caminho\para\imagem1.png
C:\caminho\para\imagem2.png
C:\caminho\para\imagem3.png
Figura 3.4: Exemplo de arquivo "info-neg-full.txt".
C:\caminho\relativo\imagem1.png 1 32 54 11 5
C:\caminho\relativo\imagem2.png 3 57 98 17 13 85 5 12 6 47 58 13 9
C:\caminho\relativo\imagem3.png 2 13 25 10 4 65 78 21 15
Figura 3.5: Exemplo de arquivo "info-pos.txt".
Na figura 3.5 o arquivo de exemplo possui na primeira linha uma imagem que contém
1 objeto com, X: 32, Y: 54,W: 11, H: 5. Na segunda linha a imagem contém 3 objetos, o
primeiro deles com X: 57, Y: 98, W: 17, H: 13, o segundo com X: 85, Y: 5, W: 12, H: 6, o
terceiro com X: 47, Y: 58, W: 13, H: 9, e assim por diante.
Para a criação do arquivo "positives.vec" é necessário utilizar a função
opencv_createsamples [16] passando alguns parâmetros:
-info Caminho absoluto até o arquivo "info-pos.txt".
-num Quantidade de imagens que serão lidas do "info-pos.txt" e adicionadas ao "po-
sitives.vec".
-w Largura que cada imagem terá no "positives.vec".
-h Altura que cada imagem terá no "positives.vec".
22
-vec Caminho absoluto em que será salvo o "positives.vec".
.\opencv_createsamples -info "C:\caminho\para\info-pos.txt" -num
8300 -w 44 -h 20 -vec "C:\caminho\para\positives.vec"
Figura 3.6: Exemplo de comando para gerar o arquivo "positives.vec".
Observação:
A largura e a altura passadas nos parâmetros -w e -h devem respeitar a proporção
(aspect ratio) do objeto. As detecções feitas pelo classificador terão essa proporção.
Essas informações foram obtidas de [17], [18], [19], [20], [21], [16], [22] e [23].
A parte crucial do projeto está nas imagens utilizadas no treinamento do classi-
ficador. Se não forem escolhidas com cuidado ou não receberem o devido tratamento,
o classificador não funcionará conforme esperado. Foram necessárias muitas imagens
positivas e negativas para poder realizar o treinamento e obter um resultado satisfatório.
Foram utilizadas 5000 imagens positivas e 2500 negativas. Obtê-las manualmente se-
ria um trabalho muito árduo e exigiria muito tempo. Para contornar esse problema, foi
utilizada a função opencv_createsamples com a finalidade de criar imagens positivas.
Através desta função, foi possível criar muitas novas imagens a partir de poucas. Foram
utilizados os seguintes parâmetros:
-img Caminho absoluto até a imagem que será usada como base para a criação das de-
mais.
-bg Caminho absoluto até "info-neg.txt". Essas imagens serão utilizadas como
"fundo" para a imagem positiva modificada.
-info Caminho absoluto em que será salvo o arquivo "info-pos.txt", com as informa-
ções de localização das imagens criadas.
-pngoutput Indica que as imagens criadas serão no formato ".png".
-maxxangle Angulo máximo de rotação em torno do eixo X.
23
-maxyangle Angulo máximo de rotação em torno do eixo Y.
-maxzangle Angulo máximo de rotação em torno do eixo Z.
-w Largura da imagem criada.
-h Altura da imagem criada.
-num Quantidade de imagens que serão criadas.
Essa função recebe uma imagem como base para a criação de novas imagens. Aplica
transformações como: redimensionamento, rotação e efeitos de luminosidade. Após as
modificações, ela é sobreposta em alguma imagem de fundo. Todas as modificações são
aleatórias, desde os valores de cada modificação até a localização em que ela será "colada"
na imagem de fundo.
.\opencv_createsamples -img "C:\caminho\para\imagem-base.png"
-bg "C:\caminho\para\info-neg.txt" -info
"C:\caminho\para\info-pos.txt" -pngoutput -maxxangle 0.2
-maxyangle 0.2 -maxzangle 0.35 -w 44 -h 20 -num 100
Figura 3.7: Exemplo de comando para geração de novas imagens positivas.
Parte das imagens base foram adquiridas com a câmera de um celular e parte pela
internet. As fotos eram coloridas com dimensões de 5312x2988. Foram tiradas 3 fotos de
16 placas diferentes totalizando 48 fotos, sendo que em cada foto foi alterado o ângulo de
captura, como pode ser visto na figura 3.8. As imagens da internet também eram coloridas
mas tinham dimensões variadas. Ao todo foram utilizadas 83 imagens.
Figura 3.8: Fotos tiradas com a câmera do celular.
24
Para serem utilizadas pela função, as imagens base, devem atender a três requisitos:
conter apenas o objeto de interesse, estar em escala de cinza e um tamanho menor que as
imagens de fundo. Inicialmente, todas foram redimensionadaspara 352x198. Depois foi
utilizado um programa auxiliar que lia e exibia todas as imagens, uma a uma. Era possível
marcar, sobre a figura, uma região de interesse (Region of Interest - ROI). A região mar-
cada era a placa e salva em escala cinza. Posteriormente, as regiões selecionadas em que a
placa estava "inclinada", recebiam um tratamento a mais pois parte da região selecionada
não fazia parte da placa. Para adequar essas imagens foi necessário pintar manualmente
de preto todas as regiões que não faziam parte da placa, como pode ser visto na figura 3.9.
A cor preta foi escolhida pois a função considera o preto como "transparente"no momento
da sobreposição com a imagem de fundo.
Figura 3.9: ROI’s após o tratamento com tinta preta.
Após a adequação das 83 imagens, foram criadas 100 a partir de cada uma delas, tota-
lizando 8300 imagens. As negativas foram utilizadas como fundo e foram obtidas a partir
do site Image-Net [24]. Esse site foi escolhido devido a possibilidade da pesquisa ser feita
por tópicos como: pessoas, atletas, prédios, casas, apartamentos. Era possível baixar um
arquivo texto, que continha o endereço de cada uma das imagens. Com essa informação,
foi possível criar um código que baixasse todas as imagens de todos os endereços que
estivessem no arquivo texto. Foram baixadas 4000 imagens negativas, convertidas para
escala de cinza e redimensionadas para 352x240.
25
Figura 3.10: Exemplos de imagens negativas baixadas.
Figura 3.11: Exemplos de imagens positivas criadas.
Com todos os dados necessários em mãos a função opencv_traincascade pode ser
rodada. O tempo de treinamento é diretamente proporcional à quantidade de imagens po-
sitivas e negativas, por isso que foram utilizadas apenas 5000 das 8300 positivas e 2500
de 4000 negativas. Mesmo com esse número reduzido, o treinamento levou 7 dias ininter-
ruptos. Cada estágio completo da cascata era salvo em um arquivo "stageXX.xml", onde
o "XX" era substituído pelo número do estágio correspondente. Isso é feito para os dados
não serem perdidos em caso de interrupção do treinamento. Caso fosse interrompido,
seria possível retomá-lo a partir do último estágio completo.
Quando o treinamento termina, o arquivo "cascade.xml" é criado e ocupa pouquís-
simo espaço em disco. Para um classificador de 20 estágios, são necessários 553 KB. A
26
função cv2.CascadeClassifier é responsável pela inicialização do objeto classifica-
dor e o método detectMultiScale é responsável pela busca de placas no vídeo, ambas
podem ser encontradas em [10].
Os vídeos são tratados como uma sequência de imagens, onde cada "imagem" é cha-
mada de quadro ou frame. No caso das câmeras em questão, os vídeos produzidos eram
de 25 qps (quadros por segundo) ou fps (frames per second).
1. Inicializa o classificador com cascade.xml.
2. Abre o arquivo de vídeo.
3. Enquanto houver frames para serem lidos do:
• Define uma roi.
• Aplica o classificador na roi.
• Se encontrar placa, salve.
Figura 3.12: Pseudo código do programa principal.
Como pode ser visto no pseudo código (figura 3.12) o classificador é inicializado
com o arquivo proveniente do treino, o vídeo é aberto e os frames são lidos em ordem.
A cada leitura é delimitada a região em que as placas dos carros aparecem e aplica-se
a função detectMultiScale, para que o classificador encontre as placas na região e
possam ser salvas. A roi é definida apenas por questões de desempenho, todo o frame
poderia ser passado para a função mas haveria um custo computacional maior. As placas
salvas possuem dimensões de 44x20.
27
Figura 3.13: Quadro em que a placa foi detectada e a placa. O retângulo vermelho repre-
senta a região em que o classificador atua.
Com a detecção da placa e seu salvamento é iniciada a penúltima etapa do projeto, o
pré-processamento da placa.
3.0.3 Etapa 3: pré-processamento da placa
O Tesseract é responsável pelo reconhecimento dos caracteres, mas se for aplicado na
imagem sem um tratamento prévio, ele não funciona, nada é reconhecido. Para o seu
correto funcionamento é primordial que seja realizado um pré-processamento na ima-
gem. A terceira etapa é encarregada de segmentar os caracteres, permitindo a atuação do
Tesseract.
28
1. Conversão da imagem colorida em escala de cinza.
2. Inversão das cores da placa.
3. Cáculo do top hat.
4. Cáculo do bottom hat.
5. Soma o resultado do top hat com a placa obtida na etapa 2.
6. Subtrai o bottom hat do resultado anterior.
7. Aplica a binarização adaptativa por médias gaussianas.
8. Borra a imagem.
9. Aplica a binarização de Otsu.
10. Aplica a técnica de fechamento.
11. Aplica a técnica de abertura.
12. Encontra e salva os contornos que tiverem o formato especificado.
Figura 3.14: Pseudo código do programa de pré-processamento.
O pseudo código de pré-processamento pode ser visto na figura 3.14. Todas as ope-
rações devem ser realizadas sobre imagens em escala de cinza, por isso que a primeira
etapa deve ser a conversão. Depois foi feita a inversão das cores para que os caracteres
fiquem brancos e o fundo preto. A adição do top hat à imagem convertida e subtração do
bottom hat em seguida, serve para maximizar o contraste entre os caracteres brancos e o
fundo preto. Aplica-se então a binarização por média gaussiana, mas algumas manchas
ainda ficam presentes. Borra-se a imagem e é aplicado a binarização de Otsu como uma
segunda etapa. A função cv2.findContours encontra o contorno dos caracteres bran-
cos, que são passados para função cv2.boundingRect que retorna a posição e o tamanho
do retângulo necessário para envolver o caractere.
29
Etapa 1: Imagem convertida para escala de
cinza.
Etapa 2: Imagem com inversão de cores.
Etapa 3: Top hat sobre a imagem invertida
(etapa 2).
Etapa 4: Bottom hat sobre a imagem inver-
tida (etapa 2).
Etapa 5: Soma da imagem invertida (etapa
2) e Top hat (etapa 3).
Etapa 6: Subtração do resultado anterior
(etapa 5) com o Bottom hat (etapa 4).
Figura 3.15: Etapas 1 a 6 do pré-processamento.
30
Etapa 7: Imagem obtida após a aplicação
da binarização por médias gaussianas.
Etapa 8: Imagem borrada para aplicação da
binarização de Otsu.
Etapa 9: Resultado da binarização de Otsu.
Etapa 10: Imagem após a aplicação da téc-
nica de fechamento.
Etapa 11: Imagem após a aplicação da téc-
nica de abertura.
Etapa 12: Imagem com todos os contornos
desenhados. Serão selecionados os que tive-
rem um tamanho próximo de 160x218.
Figura 3.16: Etapas 7 a 12 do pré-processamento.
Com o tamanho dos retângulos, é possível filtrar os que forem muito grandes ou me-
nores que os demais. Um retângulo necessário para envolver um caractere tem em média
31
160x218 e é adicionada uma tolerância de 50% devido a variação do tamanho dos carac-
teres, por exemplo: A letra "M" ocupa um espaço maior que o "I", o mesmo vale para o
número "8" e o "1". Com isso, foi possível realizar a extração dos caracteres e passá-los
um a um ao Tesseract para o reconhecimento.
Figura 3.17: Caracteres selecionados.
3.0.4 Etapa 4: reconhecimento dos caracteres
Com a conclusão do pré-processamento, os caracteres já foram segmentados, e a quarta
etapa do projeto pode ser iniciada.
O comando utilizado para que o reconhecimento fosse realizado pelo Tesseract
foi o seguinte: pytesseract.image_to_string(img_array, config=config), onde
"img_array" era o caractere em questão e "config" eram diretrizes de configuração para
"ajudar" o Tesseract. Será exibida a diretriz e em qual caso foi utilizada:
• config = ’–psm 10 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ’
Foi utilizada quando o caractere em questão estava na posição de uma letra da
placa.
• config = ’–psm 10 -c tessedit_char_whitelist=0123456789’
Foi utilizada quando o caractere em questão estava na posição de um número da
placa.
• config = ’–psm 10’
Essa diretriz apenas sinaliza que será passado um único caractere ao Tesseract e não
uma palavra, por exemplo. Ela foi utilizada quando a funçãode contornos retornava
uma quantidade inferior ao número de caracteres presentes em uma placa brasileira.
32
Informações sobre como treinar o Tesseract com um conjunto específico de imagens,
bem como a lista completa de diretrizes e funções, podem ser encontrados em [2]. No
próximo capítulo, serão analisados os resultados obtidos pelo projeto.
33
Capítulo 4
Resultados
Será abordado o desempenho do projeto neste capítulo. Os resultados e suas análises serão
divididos nas mesmas etapas do projeto, mas se iniciando a partir da segunda. A obtenção
do vídeo foi concluída com sucesso e não se faz necessária uma análise detalhada.
4.0.1 Detecção da placa
Na etapa de detecção da placa foi utilizada a seguinte métrica: quantidade de placas
detectadas versus quantas estavam presentes no vídeo. Também foi feita a contabilização
de falsas detecções versus quadros analisados. Essa avaliação foi dividida no período de
dia, com boa luminosidade natural, e a noite com iluminação artificial.
Período
Placas Percentual de
detecçãoDetectadas Total
Diurno (15h00m - 17h30m) 61 62 98,4%
Noturno (17h31m - 21h00m) 77 129 59,7%
Integral 138 191 72,2%
Tabela 4.1: Comparativo de detecção correta.
Pode ser constatado que a luminosidade é um fator de extrema importância na detec-
ção das placas. Durante o período diurno a iluminação natural é suficiente para que o per-
centual de acerto do classificador atinja 98.4%. Durante o período noturno a iluminação
34
artificial não é adequada para uma boa visibilidade da placa, formando sombras. Outro
fator que prejudicou a detecção, foi a interferência dos faróis. A câmera fica posicionada
em um ângulo que sofre a incidência direta dos faróis, quando os veículos estão entrando
no condomínio, isso ofusca a placa, que acaba não sendo detectada. A câmera possui
visão infravermelha automática, é ativada quando a mesma detecta baixa luminosidade
no ambiente, porém nunca é ativada. Isso ocorre devido ao posicionamento inadequado
da iluminação local, e da câmera. A luz incide na lente e não para onde a câmera está
voltada. Pode ser observado uma característica comum entre as placas não detectadas:
os carros eram de cores claras, como brancos e pratas. Isso pode ser explicado como o
classificador tendo dificuldade de distinguir o limite entre a placa e o veículo.
Figura 4.1: Exemplo de interferência causada pelos faróis.
Período
Quadros Percentual de
falsa detecçãoFalso positivo Total
Diurno (15h00m - 17h30m) 55 225000 0,024%
Noturno (17h31m - 21h00m) 102 313500 0,033%
Integral 157 540000 0,029%
Tabela 4.2: Comparativo de falsas detecções.
Um baixo índice de falsas detecções foi obtido. Apenas 0,024% no período diurno e
0,033% no noturno. Os principais fatores que influenciam esse quesito são: quantidade
de estágios presentes na cascata e muitas imagens tratadas com grande diversidade de
fundos. Observe a tabela 4.3:
35
Classificadores
Imagens Quantidade de
estágiosPositivas Negativas
Antigo (v1) 1000 2000 12
Atual (v2) 5000 2500 20
Futuro (v3) 8000 4000 40
Tabela 4.3: Classificadores e suas especificações.
Na primeira versão do classificador foram utilizadas apenas 1000 imagens positivas
para 2000 negativas, e a cascata possuía 12 estágios. O treinamento foi "rápido", teve
duração de aproximadamente 24h, mas o resultado foi muito aquém do esperado. Eram
de 5 a 20 falsas detecções por quadro.
Figura 4.2: Exemplo de falsas detecções.
Para obtenção de melhores resultados, algumas modificações no treinamento foram
feitas: utilizou-se 5000 imagens positivas, 2500 negativas, uma cascata com 20 estágios
e a proporção de imagens (positivas:negativas) foi invertida. Além de um número mais
expressivo de imagens positivas, adicionou-se um tratamento às mesmas para que não
fosse introduzida qualquer interferência no treinamento. Aumentou-se a quantidade de
estágios para que os falsos positivos fossem reduzidos. A mudança de proporção (1:2
para 2:1) foi adotada devido à necessidade de mais exemplos positivos do que negativos.
O treinamento do classificador durou 7 dias ininterruptos até que ficasse pronto.
36
Figura 4.3: Exemplos de placas detectadas pelo classificador.
Os resultados da próxima etapa serão apresentados a seguir.
4.0.2 Pré-processamento da placa
Na etapa de pré-processamento a métrica utilizada foi a seguinte: quantidade de caracteres
segmentados corretamente versus quantos foram analisados. Infelizmente, a resolução
da imagem e a distância entre câmera e placa, não permitiram que as técnicas de pré-
processamento fossem aplicadas com sucesso. As imagens em alta resolução obtidas
com o celular foram utilizadas para ilustrar o funcionamento do pré-processamento e
Tesseract.
Caracteres
Segmentados Total Percentual
77 84 91,7%
Tabela 4.4: Desempenho da etapa de pré-processamento.
Figura 4.4: Exemplos de falhas na segmentação dos caracteres.
O grande desafio desta etapa foi a eliminação de interferências causadas pela ilumina-
37
ção precária, como por exemplo: sombras e caracteres que ficaram "grudados" em alguma
"mancha" no processo de binarização. Outro fator complicador foi a diferença de tama-
nho entre as imagens utilizadas. Três fatores contribuíram para essa diferença: as fotos
provenientes do celular tiveram diferentes distâncias entre câmera e placa; o segundo
motivo foi o redimensionamento manual das fotos e o terceiro foi o recorte das placas.
O OpenCV não conseguiu trabalhar de forma adequada com o tamanho original da foto
(5312x2988). Após as modificações os tamanhos variaram entre 1018x380 e 1363x491.
Figura 4.5: Exemplo de segmentação bem sucedida.
Os caracteres da placa eram organizados pela sua posição no eixo X . Caso os 7 carac-
teres da placa fossem segmentados, seria possível restringir o universo de possibilidades
do Tesseract. Esse tema será abordado na próxima etapa.
4.0.3 Reconhecimento dos caracteres
Na etapa de reconhecimento a métrica utilizada foi: quantidade de caracteres reconheci-
dos versus quantos foram analisados.
Caracteres Placas
Corretos Analisados Percentual Corretas Total Percentual
68 77 88,3% 2 12 16,7%
Tabela 4.5: Desempenho do Tesseract.
O Tesseract foi utilizado com o treinamento básico que já vem com ele (out of the
box). Os erros mais comuns envolviam as letras "Q" e "O", e o número "6". O percentual
de acerto foi calculado sobre os caracteres corretamente segmentados pela etapa de pré-
processamento.
38
Figura 4.6: Exemplos de placas reconhecidas pelo Tesseract.
No próximo capítulo serão apresentadas sugestões para um melhor desempenho do
projeto.
39
Capítulo 5
Trabalhos Futuros
Com base nos resultados obtidos, algumas medidas podem ser tomadas para que melho-
res resultados sejam alcançados. Essas medidas foram divididas nas mesmas etapas do
projeto.
1. Detecção de placas:
Alterar o posicionamento da câmera: Se a mesma for colocada em um patamar
ligeiramente mais elevado que os faróis dos veículos, a interferência deles
seria mitigada ou completamente removida.
Ajustar o ângulo de gravação da câmera: Se focalizasse a entrada dos veículos
de cima para baixo, algumas vantagens surgiriam: o sistema de gravação por
movimento da câmera, seria ativado somente quando algum veículo entrasse
ou saísse do condomínio, e um fundo escuro dificilmente seria detectado como
um falso positivo. Com o ângulo atual, toda a movimentação do porteiro, da
rua, do portão de pedestres e da entrada de veículos é detectada, sendo que o
fundo é de cor clara. Isso resulta em horas de gravações desnecessárias, e com
grandes chances de falsos positivos surgirem.
Ajustar a iluminação artificial: Se o posicionamento das lâmpadas fosse ajus-
tado para que a luz incidisse, em sua maior parte, no veículo que estivesse
saindo ou entrando do condomínio, ajudaria ao classificador a distinguir com
mais clareza os limites das placas e não haveria sombras sobre as mesmas.
40
2. Pré-processamento:
Substituição da câmera: Utilizar umacâmera de alta resolução e de preferência
infravermelha. Quando a placa é extraída do vídeo, ela precisa de uma quali-
dade melhor para que as técnicas de pré-processamento possam ser aplicadas
com sucesso. Essa etapa é vital para que o Tesseract possa atuar. O infraver-
melho é indicado para esse tipo de aplicação, pois a sua saída ja é em escala de
cinza e o contraste entre os caracteres e o restante da placa é mais acentuado
que em câmeras convencionais.
Padronização das imagens: Se todas as imagens possuíssem tamanhos com pou-
cas variações, não seria necessária uma filtragem dos contornos com 50% erro.
A partir da padronização do tamanho das imagens, é possível definir ajustes
finos do algorítimo. Por exemplo: utilizar um kernel ótimo para as operações
morfológicas, valores de constantes utilizados nas binarizações, para que a
realização das etapas de pré-processamento sejam aplicadas em imagens "pa-
dronizadas". Quanto mais similaridades existirem, melhor será o desempenho
do pré-processamento.
3. Reconhecimento com Tesseract:
Treinamento específico: O Tesseract possui um módulo de treinamento, em que é
possível treina-lo com caracteres próprios. O seu desempenho pode ser melhor
se for treinado com os caracteres de saída do pré-processamento, dessa forma,
as chances de acerto seriam ampliadas.
Inferir o tipo do caractere: Se o tamanho da placa for padronizado, é possível
saber se ele é uma letra ou um número apenas se baseando pela sua localiza-
ção na placa. Essa inferência somente é realizada quando os 7 caracteres são
segmentados com sucesso.
Com essas melhorias, o projeto alcançaria resultados que viabilizariam a sua imple-
mentação no condomínio. Uma etapa futura seria a integração desse sistema com um
41
banco de dados e a rápida disponibilização desses dados quando fossem necessários. No
próximo capítulo as conclusões serão apresentadas.
42
Capítulo 6
Conclusões
Com base nos resultados observados, pôde ser constatado que a etapa de detecção e ex-
tração da placa, foi executada de forma satisfatória durante o período diurno, algumas
medidas ainda precisam ser tomadas para que o percentual de acerto, durante o período
noturno, seja acima de 90%. Ainda há a possibilidade de realizar um treinamento utili-
zando 8000 imagens positivas, e 4000 negativas para melhorar o desempenho do classifi-
cador.
Mesmo com uma resolução abaixo da desejada, a técnica de classificadores Haar se
mostrou muito eficiente. Quando a iluminação é adequada o objetivo consegue ser alcan-
çado 98,4% das vezes, com apenas 0,024% de falsos positivos. A detecção das placas
foi feita em tempo-real com um o seguinte hardware: processador Intel(R) Core(TM)
i7-7500U CPU 2.70GHz, 16 GB de memória RAM e S.O. Windows 10 64-bit.
O desempenho da etapa de pré-processamento foi acima de 90%, mas ajustes finos
no algorítimo podem ser feitos para que a segmentação dos caracteres e filtragem de
contornos, sejam realizadas de forma mais eficiente.
A etapa de reconhecimento não obteve um resultado tão positivo quanto as suas ante-
cessoras. O Tesseract precisa de um treinamento específico para o tipo de letra em que irá
atuar. Isso evitaria erros comuns entre as letras "Q" e "O" e o número "6". A sua aplica-
ção out of the box é prática porém ineficiente quando os caracteres analisados fogem dos
padrões de fontes clássicas como "Times New Roman"dentre outras. As letras que foram
submetidas à sua análise possuíam um formato mais arredondado por conta da etapa de
43
pré-processamento, e a diferença entre as letras "D", "O", "Q" e "W"ficaram muito sutis
para serem detectadas pelo treinamento genérico.
Para que a etapa de reconhecimento seja aplicada diretamente à imagem extraída do
vídeo, é necessária a substituição da câmera por uma com maior resolução. A chuva nem
foi detectada pela câmera atual.
Se todas melhorias propostas no capítulo anterior forem realizadas, o algorítimo de
pré-processamento poderá ser executado diretamente à imagem extraída do vídeo e os
caracteres poderão ser segmentados com sucesso. O Tesseract estaria treinado para esse
tipo de caractere e isto impulsionaria seus resultados para um patamar superior.
44
Referências Bibliográficas
[1] TEAM, O. “OpenCV”. Última visita - 15/12/2017. Disponível em: <https://
opencv.org/>.
[2] “Tesseract Open Source OCR Engine (main repository)”. Última visita - 14/12/2017.
Disponível em: <https://github.com/tesseract-ocr/tesseract>.
[3] TEAM, P. “Python”. Última visita - 15/12/2017. Disponível em: <https://www.
python.org/>. Python is a programming language that lets you work quickly
and integrate systems more effectively.
[4] “Tesseract”. Última visita - 15/12/2017. Disponível em: <https://en.wikipedia.
org/wiki/Tesseract_(software)>.
[5] SMITH, R. “An Overview of the Tesseract OCR Engine”, p. 5, 2007. Disponível em:
<theraysmith@gmail.com>.
[6] VIOLA, P., JONES, M. “Rapid object detection using a boosted cascade of simple
features”. In: Proceedings of the 2001 IEEE Computer Society Conference on
Computer Vision and Pattern Recognition. CVPR 2001, v. 1, pp. I–511–I–518
vol.1, 2001.
[7] “Haar wavelet”. Última visita - 14/12/2017. Disponível em: <https://en.
wikipedia.org/wiki/Haar_wavelet>.
[8] ABU-MOSTAFA, Y. S., MAGDON-ISMAIL, M., LIN, H.-T. Learning From Data.
AMLBook, 2012. ISBN: 1600490069, 9781600490064.
[9] SCHAPIRE, R. E., FREUND, Y. “Using AdaBoost to Minimize Training Error”. In:
Boosting:Foundations and Algorithms, pp. 53–73, MIT Press, 2012. ISBN:
9780262301183. Disponível em: <http://ieeexplore.ieee.org/xpl/
articleDetails.jsp?arnumber=6282244>.
[10] MORDVINTSEV, A., K., A. “OpenCV-Python Tutorials”. Última visita
- 14/12/2017. Disponível em: <http://opencv-python-tutroals.
readthedocs.io/en/latest/py_tutorials/py_tutorials.html>.
45
https://opencv.org/
https://opencv.org/
https://github.com/tesseract-ocr/tesseract
https://www.python.org/
https://www.python.org/
https://en.wikipedia.org/wiki/Tesseract_(software)
https://en.wikipedia.org/wiki/Tesseract_(software)
theraysmith@gmail.com
https://en.wikipedia.org/wiki/Haar_wavelet
https://en.wikipedia.org/wiki/Haar_wavelet
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6282244
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6282244
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html
[11] MONTEIRO, L. H. “Binarização por Otsu e outras técnicas usadas na Detecção de
Placas”, p. 21.
[12] PROF. DR. MARIO GAZZIRO, V. R. P. B. “Quadro Segmentação de Imagens”,
p. 6, 2013.
[13] TOROK, L. “Método de Otsu”, p. 5. Disponível em: <ltorok@ic.uff.br>.
[14] GREENTED, D. A. “Otsu Thresholding”. Última visita - 14/12/2017. Dis-
ponível em: <http://www.labbookpages.co.uk/software/imgProc/
otsuThreshold.html>.
[15] “Video Codecs by FOURCC”. Última visita - 14/12/2017. Disponível em: <http:
//www.fourcc.org/codecs.php>.
[16] “Cascade Classifier Training”. Última visita - 15/12/2017. Disponível
em: <https://docs.opencv.org/2.4.13.4/doc/user_guide/ug_
traincascade.html>.
[17] HARRISON. “Creating your own Haar Cascade OpenCV Python Tutorial”. Última
visita - 14/12/2017. Disponível em: <https://pythonprogramming.net/
haar-cascade-object-detection-python-opencv-tutorial/>.
[18] SEO, N. “Tutorial: OpenCV haartraining (Rapid Object Detection With A Cas-
cade of Boosted Classifiers Based on Haar-like Features)”. Última visita -
14/12/2017. Disponível em: <http://note.sonots.com/SciSoftware/
haartraining.html>.
[19] BALL, T. “TRAIN YOUR OWN OPENCV HAAR CLASSIFIER”. Última visita
- 14/12/2017. Disponível em: <http://coding-robin.de/2013/07/22/
train-your-own-opencv-haar-classifier.html>.
[20] “Training Haar Cascades”. Última visita - 14/12/2017. Disponível em: <https:
//memememememememe.me/post/training-haar-cascades/>.
[21] THOMPSON, J. “Teaching computers to recognize other computers, funded by
Impakt.nl”. Últimavisita - 14/12/2017. Disponível em: <https://github.
com/jeffThompson/MirrorTest>.
[22] MAKES, D. “Make your own Haar Cascade on Windows | Quick & Simple”. Última
visita - 14/12/2017. Disponível em: <https://www.youtube.com/watch?
v=Dg-4MoABv4I>.
[23] PELL, J. “Haar Cascade Tutorial You Tube”. Última visita - 14/12/2017. Disponível
em: <https://www.youtube.com/watch?v=KFC6jxBKtBQ>.
46
ltorok@ic.uff.br
http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html
http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html
http://www.fourcc.org/codecs.php
http://www.fourcc.org/codecs.php
https://docs.opencv.org/2.4.13.4/doc/user_guide/ug_traincascade.html
https://docs.opencv.org/2.4.13.4/doc/user_guide/ug_traincascade.html
https://pythonprogramming.net/haar-cascade-object-detection-python-opencv-tutorial/
https://pythonprogramming.net/haar-cascade-object-detection-python-opencv-tutorial/
http://note.sonots.com/SciSoftware/haartraining.html
http://note.sonots.com/SciSoftware/haartraining.html
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html
https://memememememememe.me/post/training-haar-cascades/
https://memememememememe.me/post/training-haar-cascades/
https://github.com/jeffThompson/MirrorTest
https://github.com/jeffThompson/MirrorTest
https://www.youtube.com/watch?v=Dg-4MoABv4I
https://www.youtube.com/watch?v=Dg-4MoABv4I
https://www.youtube.com/watch?v=KFC6jxBKtBQ
[24] Última visita - 14/12/2017. Disponível em: <http://www.image-net.org/>.
ImageNet is an image database organized according to the WordNet hierarchy
(currently only the nouns), in which each node of the hierarchy is depicted by
hundreds and thousands of images. Currently we have an average of over five
hundred images per node. We hope ImageNet will become a useful resource
for researchers, educators, students and all of you who share our passion for
pictures.
47
http://www.image-net.org/
	Lista de Figuras
	Lista de Tabelas
	1 Introdução
	2 Teoria e Ferramentas
	2.1 Python
	2.2 OpenCV
	2.3 Tesseract
	2.4 Imagem Integral (Integral Images)
	2.5 Atributos de Haar
	2.6 AdaBoost
	2.7 Classificadores Haar em cascata
	2.8 Histograma
	2.9 Binarização
	2.10 Operações Morfológicas
	2.10.1 Erosão (Erosion)
	2.10.2 Dilatação (Dilation)
	2.10.3 Abertura (Opening)
	2.10.4 Fechamento (Closing)
	2.10.5 Top hat
	2.10.6 Bottom hat
	2.11 Extrator de Contornos
	3 Construção e Funcionamento do Sistema
	3.0.1 Etapa 1: obtenção do vídeo
	3.0.2 Etapa 2: detecção da placa
	3.0.3 Etapa 3: pré-processamento da placa
	3.0.4 Etapa 4: reconhecimento dos caracteres
	4 Resultados
	4.0.1 Detecção da placa
	4.0.2 Pré-processamento da placa
	4.0.3 Reconhecimento dos caracteres
	5 Trabalhos Futuros
	6 Conclusões
	Referências Bibliográficas

Continue navegando