Professional Documents
Culture Documents
Braslia
dezembro, 2012
Braslia
dezembro, 2012
Este trabalho foi julgado adequado para a obteno do Ttulo de Engenheiro de Computao,
e aprovado em sua forma final pela Faculdade de Tecnologia e Cincias Sociais Aplicadas FATECS.
____________________________
Prof. Abiezer Amarilia Fernandes
Coordenador do Curso
Banca Examinadora:
________________________________
________________________________
Orientador
UnB
________________________________
________________________________
UniCEUB
UniCEUB
DEDICATRIA
AGRADECIMENTOS
SUMRIO
DEDICATRIA
AGRADECIMENTOS
SUMRIO
LISTA DE FIGURAS
LISTA DE TABELAS
11
12
RESUMO
14
ABSTRACT
15
1.
16
INTRODUO
1.1.
Apresentao do Problema
16
1.2.
Objetivo do Trabalho
16
1.2.1.
Objetivo geral
16
1.2.2.
Objetivo especfico
17
1.3.
17
1.4.
Escopo do Trabalho
17
1.5.
Resultados Esperados
18
1.6.
Estrutura do Trabalho
19
2.
APRESENTAO DO PROBLEMA
20
2.1.
O Problema
20
2.2.
Solues Existentes
21
2.2.1.
21
2.2.2.
21
2.3.
3.
22
24
3.1.
24
3.2.
Enfrentando os Desafios
25
3.3.
26
3.4.
Sistema tico
29
3.5.
32
3.6.
Sistema de Iluminao
35
3.7.
36
3.8.
Rudo
40
3.9.
Filtro Gaussiano
42
3.10.
44
3.11.
47
3.12.
OpenCV
48
3.13.
Tesseract OCR
49
3.14.
51
3.14.1.
Linguagem C
51
3.14.2.
Linguagem C++
52
4.
54
4.1.
54
4.2.
54
4.3.
Ferramentas Utilizadas
55
4.3.1.
55
4.3.2.
OpenCV
56
4.3.2.1.
Baixando o OpenCV
57
4.3.2.2.
CMake
58
4.3.2.3.
59
4.3.2.4.
61
4.3.3.
Tesseract OCR
63
4.3.3.1.
Leptonica
63
4.3.3.2.
64
4.3.3.3.
65
4.3.3.4.
65
4.4.
Descrio da Implementao
66
4.4.1.
A captura
67
4.4.2.
O pr-processamento
69
4.4.3.
A localizao do objeto
72
4.4.4.
A validao
75
4.4.5.
A segmentao
77
4.4.6.
A leitura OCR
78
5.
88
5.1.
88
5.2.
88
5.3.
90
5.4.
94
6.
CONCLUSO
96
6.1.
Concluses
96
6.2.
97
REFERNCIAS
APNDICE
98
104
LISTA DE FIGURAS
18
22
FIGURA 3.1-
25
NMEROS
28
30
COMPUTACIONAL.
31
35
FIGURA 3.7 - UMA IMAGEM MONOCROMTICA E A CONVENO UTILIZADA PARA O PAR DE EIXOS
(X,Y).
FIGURA 3.8 - OS COMPONENTES ILUMINNCIA (I) E REFLETNCIA (R) DE UMA IMAGEM.
37
38
FIGURA 3.9 - (A) IMAGEM RUIDOSA. (B) BORDAS DETECTADAS PELO MTODO DE PREWITT. (C)
FILTRAGEM PELA CONVOLUO COM UMA GAUSSINA.
42
43
46
48
49
54
56
57
59
60
64
67
70
71
71
73
74
74
77
78
80
81
81
82
UTILIZADOS
PARA
83
89
89
LISTA DE TABELAS
TABELA 3.1- EXEMPLOS DE VALORES PARA I(X,Y) [EM LUX OU LMEN/M2]. ............................ 38
TABELA 3.2- EXEMPLOS DE VALORES PARA R(X,Y). .................................................................. 38
TABELA 3.3 - NMERO DE BYTES NECESSRIOS PARA ARMAZENAR UMA IMAGEM DIGITAL NXN
COM 2N NVEIS. .................................................................................................................. 40
LITERATURAS. .................................................................................................................... 92
A/D Analgico/Digital
ALGOL ALGOrithmic Language
API Application Programming Interface
ASCII American Standard Code for Information Interchange
BCPL Basic Combined Programming Language
CLU CLUsters Language
CNSeg Confederao Nacional das Empresas de Seguros Gerais, Previdncia Privada e
Vida, Sade Suplementar e Capitalizao
CONTRAN Conselho Nacional de Transito
FISCA Sistema de Fiscalizao Inteligente
HSL Hue Saturation Lightness
IP Interface Protocols
LCD Liquid Crystal Display
LED Light Emitting Diode Displays
ML Metalanguage
MSVS Microsoft Visual Studio
OCR Optical Character Recognition
RAM Random Access Memory
RGB Red-Green-Blue
SURF Speedef-Up Robust Features
SVN Subversion
TCP Transmission Control Protocol
UF Unidade Federativa
UTF-8 8-bit Unicode Transformation Format
RESUMO
Palavras Chave: viso computacional, OpenCV, Tesseract OCR, placa automotiva, deteco,
reconhecimento.
ABSTRACT
The purpose of this study is to present a computer vision solution for detection and
recognition of automotive plate using inexpensive cameras and opensource libraries like
OpenCV processing image and Tesseract OCR character recognition. Thus, a model is created
following the concepts of computer vision approached in six steps, all commented on the
level of installation and implementation, they are: the capture, preprocessing, location,
validation, targeting and end transcribing the image of the characters on board the vehicle.
After the development of the steps are performed three measurements: the level of accuracy in
detecting plate of the vehicle, the algorithm's performance and accuracy in converting the
characters from the image into the text format. This work presents all the difficulties that were
encountered in the course of the project, from the design stage to the results obtained,
collecting so many technical materials to work with computer vision and providing an
example application that will help better understand each step.
16
1. INTRODUO
1.1.
Apresentao do Problema
17
Para alcanar o objetivo geral do projeto, foram traados alguns objetivos especficos
que primeiramente precisavam ser atendidos:
Essa necessidade de reconhecer uma placa veicular vem ganhando espao comercial,
onde cada vez mais, o sistema de transporte e segurana vem incrementando benefcios vida
dos cidados, uma vez que pode ser utilizado em inmeras aplicaes, como em controle de
acesso, monitoramento e segurana. Exemplos: utilizando em acessos aos estacionamentos,
controle de trfego em rodovias, em pedgios, em deteco e controle de veculos pelo
departamento de trnsito etc.
18
cada vez mais elaboradas para deteco de objetos e padres, com possibilidade de futura
comercializao.
19
Alm deste captulo introdutrio, esse trabalho est estruturado em mais cinco
captulos, organizados da seguinte forma:
20
2.
APRESENTAO DO PROBLEMA
2.1. O Problema
21
22
O sistema captura a placa dos veculos que cruzam pela barreira (BLITZ), por meio de
cmara. O procedimento pode capturar as placas dianteiras ou traseiras dos veculos.
O sistema transmite a placa em forma de imagem para uma estao de reconhecimento
de caracteres onde convertida para arquivo texto e encaminha para o sistema central de
processamento que por sua vez, verifica as informaes de dbitos, informaes de bloqueios,
informaes de roubo/furto, informaes de seguro obrigatrio e ainda os dados do condutor
se este for o proprietrio do veiculo.
A figura 2.1 a seguir, exemplifica o funcionamento.
23
so alguns dos benefcios para o sistema. Essa possibilidade aumentaria a eficincia das
autoridades de fiscalizao, acabando com a seleo aleatria de veculos e prestando um
servio de segurana eficiente.
24
3.
Nas
prximas
sees
sero
apresentados
conceitos
importantes
para
desenvolvimento do projeto.
25
Estes nmeros trazem poucas informaes. Existe assim, a difcil misso de transformar esta
grande quantidade de nmeros em sentido, o que faz o estudo da viso computacional uma
tarefa difcil.
Figura 3.- para o computador o retrovisor de um carro apena uma grade de nmeros
Fonte: Bradski e Kaehler (2008).
Outro motivo importante que os dados so corrompidos por rudo e distoro. Tal
fato decorre de variaes no mundo (clima, iluminao, reflexos, movimentos), imperfeies
na lente e configurao mecnica, o tempo de integrao com o sensor (borro na imagem), o
rudo eltrico no sensor ou outros aparelhos eletrnicos e artefatos de compresso aps
captura de imagem. Dado os desafios, como obter algum progresso?
Para o autor E. Roy Davies (2005), a viso computacional depende de vrios mtodos
para ter uma margem de sucesso considervel. Desde a aquisio da imagem tomada de
deciso. A seguir, algumas resumidamente:
26
Tomada de deciso: nesse nvel, o sistema toma a deciso final. Como por exemplo:
encontrou ou no o objeto de estudo. Se, passa ou descarta o produto, pela inspeo
automtica de qualidade. Sinaliza o cenrio, indicando se existem as caractersticas
informadas, como a deteco da placa do automvel ou localizao de uma
determinada pessoa em um local.
27
28
Meios de cpia: dispositivos que fazem a cpia fsica segura da informao adquirida
e processada pelo sistema. Podem ser impressoras, mdias ticas, cartes de memria,
dentre outros.
29
30
Segue uma descrio detalhada dos mesmos parmetros segundo os autores Jain,
Kasturi and Brian (1995):
31
Resoluo (Resolution R): representa a menor poro do objeto em estudo que pode
ser distinguida pelo sistema. normalmente visualizada em pares de linha, ou em
nmero de pixels, e tambm bem conhecida pela expresso resoluo espacial.
Tamanho do Sensor (Sensor Size SS): representa o tamanho da rea ativa do sensor,
especificada em sua dimenso horizontal.
Desta forma, o primeiro passo de um projeto de sistema de viso identificar os
32
33
apenas uma cmera, para economizar custos do sistema. Os prismas tambm possuem
caractersticas reflexivas, porm, costumam ser usados para realizar a diviso dos feixes
luminosos em mais de uma direo, ou at mesmo a separao de componentes da luz.
Abaixo alguns conceitos para entendimento do sistema tico:
34
propriamente dito (3.5), no fazem parte do projeto fsico deste trabalho e tem por finalidade,
citar conceitos mais amplos sobre o assunto. O autor deste projeto utiliza um sistema tico de
baixo custo, a exemplo de vdeos cmeras de celulares (Iphone 4S) e webcam (resoluo
VGA) cujo sistema tico projetado foi otimizado necessidade do prprio aparelho.
35
36
iluminao seja alcanada, as etapas de processamento das informaes tornam-se muito mais
fceis conforme Erhardt-Ferron (2000).
Em geral, a escolha de uma fonte luminosa e de uma tcnica de iluminao adequada
so influenciadas pelas caractersticas superficiais do objeto em estudo (geometria, estrutura,
cor, transparncia, reflectncia), onde o objetivo normalmente incidir sobre a superfcie do
objeto uma iluminao homognea e constante ao longo do tempo, conforme Erhardt-Ferron
(2000) e Jhne (1999).
O projeto de iluminao de um sistema de viso consiste normalmente de trs etapas,
Deschamps (2004):
Este tpico tem por objetivo apresentar as principais caractersticas das imagens
digitais.
Uma imagem monocromtica pode ser descrita matematicamente por uma funo
f(x,y) da intensidade luminosa, sendo seu valor, em qualquer ponto de coordenadas espaciais
MARQUES FILHO, Og; VIEIRA NETO, Hugo. Processamento Digital de Imagens, Rio de Janeiro:
37
(x,y), proporcional ao brilho (ou nvel de cinza) da imagem naquele ponto. A figura 3.7
mostra uma imagem monocromtica e a conveno utilizada para o par de eixos (x,y).
Figura 3. - Uma imagem monocromtica e a conveno utilizada para o par de eixos (x,y).
Fonte: MARQUES FILHO, Og; VIEIRA NETO (2009).
f ( x, y ) = i ( x, y ) . r ( x, y )
com:
i ( x, y ) > 0
0 < r (x,y) < 1
(3.1)
38
dia ensolarado
100
dia nublado
10
0,001
neve
0.8
parede branco-fosca
0.65
ao inoxidvel
0.01
veludo preto
39
(
(
[
(
)
)
(
(
)
)
)
(
(
)
)
)
(3.2)
40
Tabela 3. - Nmero de bytes necessrios para armazenar uma imagem digital NxN com 2n
nveis.
Assume-se que um pixel estar inteiramente contido em um byte, mesmo que isto
signifique que alguns bits de cada byte permaneam vazios. Por exemplo, para n igual a 5,
assume-se que cada pixel ocupa um byte, restando 3 bits sem utilizao em cada byte.
Do ponto de vista qualitativo, pode-se perguntar: quantos pontos e nveis de cinza
sero necessrios para que a verso digitalizada de uma imagem apresente qualidade
comparvel imagem original? Parece evidente que quanto maiores os valores de M, N e n,
melhor a imagem digital resultante. Mas sabendo que elevados valores de M, N e n implicaro
em maiores custos de digitalizao e armazenagem. Deve existir uma forma de definir valores
adequados qualidade desejada. Convm observar ainda que qualidade de imagem um
conceito altamente subjetivo, que tambm depende fortemente dos requisitos da aplicao
dada.
3.8. Rudo 2
ROSITO JUNG, Cludio. Filtragem de Imagens com Preservao das Bordas Usando a Transformada
Wavelet, Porto Alegre: p. 19-20, 2002.
41
do contedo de frequncia da imagem, porm aqui utilizado para denotar a remoo (ou
atenuao) do rudo em uma imagem.
Em particular, de extrema importncia que as bordas sejam preservadas durante a
filtragem. As bordas da imagem delimitam as fronteiras entre dois objetos que compem uma
cena, e so fundamentais tanto na percepo do sistema visual humano segundo Hubel (1962),
quanto na anlise de imagens (por exemplo, na segmentao da imagem em seus objetos
componentes). Infelizmente, a grande maioria das tcnicas de filtragem existentes na literatura
no se mostram eficientes na preservao das bordas. A distino entre rudo e bordas
muito difcil para um sistema de viso computacional, embora seja normalmente uma tarefa
trivial para o sistema visual humano. Na verdade, os processos de filtragem e deteco de
bordas so interdependentes, como ser visto a seguir.
A caracterizao matemtica do rudo no simples, pois existem diferentes tipos de
rudos e com origens distintas. Entretanto, o rudo em uma imagem monocromtica
caracterizado geralmente por variaes de alta frequncia espacial na intensidade de tons de
cinza. Por outro lado, as bordas da imagem representam as fronteiras entre os objetos que
compem uma cena, e so caracterizadas por variaes bruscas nos tons de cinza
(correspondentes s transies entre duas regies aproximadamente homogneas associadas a
dois objetos distintos), que tambm correspondem s altas frequncias espaciais.
Em geral, as variaes de intensidade correspondentes s bordas tm amplitude maior
do que as variaes de intensidade associadas ao rudo. Contudo, essa hiptese no vlida
para bordas de baixo contraste (como, fronteiras entre regies que tem aproximadamente a
mesma mdia nos tons de cinza), ou quando a quantidade de rudo presente na imagem
grande. Nesses casos, a distino entre bordas e rudo pode ser bastante complexa, resultando
em falsas bordas (rudo erroneamente detectado como borda) e/ou falhas na deteco das
bordas de baixo contraste.
Para que a filtragem seja eficiente, o rudo deve ser atenuado nas regies homogneas
da imagem, mas as bordas no devem ser suavizadas. Para tal, importante que se conhea a
localizao das bordas. Por outro lado, a deteco das bordas requer uma imagem filtrada,
pois a deteco das mesmas em imagens ruidosas apresenta resultados errneos. Como
exemplo, a figura 3.9 (a) mostra uma imagem contaminada por rudo Gaussiano aditivo,
Larson and Shubert (1979). A figura 3.9 (b), mostra as bordas detectadas pelo mtodo de
Prewitt, Pratt (1991), enquanto que a figura 3.9 (c) mostra o resultado da filtragem pela
42
convoluo com filtro Gaussiano (Jain, 1989). Pode-se notar que as bordas da imagem filtrada
esto borradas, e que a deteco delas no foram eficientes (contornos abertos e varias falsas
bordas detectadas).
Figura 3. - (a) Imagem ruidosa. (b) Bordas detectadas pelo mtodo de Prewitt. (c) Filtragem
pela convoluo com uma Gaussina.
Fonte: Jung, Cludio (2002).
Texto
modificado,
retirado
em
Joint
Bilateral
Upsample
<http://lvelho.impa.br/ip09/demos/jbu/filtros.html > acesso em 13/10/2012).
(disponvel
em:
43
Visto que um filtro utilizado para atenuao do rudo, o mtodo deve ser bem
empregado para trabalhar com a deteco de bordas, visto que a qualidade da imagem diminui
devido a suavizao, dificultado a localizao precisa do objeto.
O filtro Gaussiano definido por:
(||
||)
(3.3)
Onde,
( )
(3.4)
44
Texto extraido: VALE , G. e DAL POZ, A. Processo de deteco de bordas de Canny. Curitiba: Bol. Cinc.
Geod., sec. Artigos, v. 8, no 2, p.67-78, 2002.
45
distncia entre um ponto detectado e a respectiva posio verdadeira. Portanto, quanto maior
for L, mais prximos das posies verdadeiras estaro os pontos detectados pelo filtro. Pelo
exposto, o projeto de um filtro para a deteco de bordas arbitrrias envolve a maximizao
de ambos os critrios, o que equivalente maximizao do produto entre ambos (SNR e L),
ficando (Canny, 1986):
(3.5)
onde f(x) a resposta de impulso do filtro definido no intervalo [-w; w], G(x) uma
borda unidimensional e n0 a quantificao do rudo da imagem. Assume-se que a borda est
centrada em x = 0. Na equao 3.5, a primeira quantidade entre parntesis corresponde ao
SNR e a segunda L. A condio de filtro timo de Canny deve ainda atender a um terceiro
critrio, denominado critrio de resposta mltipla. A idia bsica que deve haver um nico
ponto de borda onde existe uma nica borda verdadeira. Seja (Canny, 1986):
(3.6)
46
Sendo assim, se considerar uma borda de uma dimenso variando no contraste (um
degrau) e ento convolucionando a borda com a funo de uniformizao de Gauss, o
resultado ser uma variao contnua do valor inicial ao final, com uma inclinao mxima no
ponto onde existe o degrau. Se esta continuidade diferenciada em relao a x, esta
inclinao mxima ser o mximo da nova funo em relao a original (figura 3.11).
Os mximos da convoluo da mscara e da imagem indicaro bordas na imagem.
Este processo pode ser realizado atravs do uso de uma funo de Gauss de 2-dimenses na
direo de x e y. Os valores das mscaras de Gauss dependem da escolha do sigma na
equao de Gauss, visto na frmula 3.4 deste trabalho.
A aproximao do filtro de Canny para deteco de bordas G'. Convolucionando a
imagem com G' se obter uma imagem I que mostrar as bordas, mesmo na presena de rudo.
A convoluo relativamente simples de ser implementada, mas cara computacionalmente,
especialmente se for em 2-dimenses. Entretanto, uma convoluo de Gauss de 2-dimenses
pode ser separada em duas convolues de Gauss de 1-dimenso.
A intensidade computacional do detector de bordas de Canny relativamente alta, e os
resultados so geralmente ps-processados para maior clareza. Entretanto, o algoritmo mais
eficiente no processamento de imagens com rudos ou com bordas difusas.
Algoritmo de Canny:
47
Criar uma mscara de Gauss de 1-D (G) para convolucionar I. O desvio (S) de Gauss
um parmetro para o detector de bordas;
Criar uma mscara de 1-D para a primeira derivada de Gauss nas direes x e y;
nomear como Gx e Gy. O mesmo valor S usado;
Convolucionar Ix, com Gx, para dar Ix (o componente x). De I convolucionado com a
derivada de Gauss. E convolucionar Iy, com Gy para dar Iy;
48
3.12. OpenCV
49
50
pode ler uma grande variedade de formatos de imagem e convert-los em texto em mais de 40
idiomas.
A partir da verso 3.x, a ferramenta fornece o mdulo totalmente treinvel, podendo
lidar com quaisquer caracteres na codificao UTF-8 (8-bit Unicode Transformation Format).
Por convenincia, o que se segue um breve resumo de como funciona Tesseract:
Existe uma segunda anlise das palavras que no foram entendidas na primeira
passagem
Algoritmos para detectar a proporo das palavras e smbolos (essa proporo verifica
se todas as letras de uma palavra tem a mesma largura);
projeto
Tesseract
est
http://code.google.com/p/tesseract-ocr/.
no
seguinte
endereo
da
internet:
51
3.14.1. Linguagem C
Texto
modificado,
retirado
em
Expert.net
(disponvel
http://www.tiexpert.net/programacao/c/index.php > acesso em 13/10/2012).
em:
<http://
52
Um sistema de tipos simples que evita vrias operaes que no fazem sentido;
Parmetros que so sempre passados por valor para as funes e nunca por referncia
( possvel simular a passagem por referncia com o uso de ponteiros);
O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs durante a
dcada de 1980 com o objetivo de melhorar a linguagem de programao C ainda que
mantendo mxima compatibilidade. Stroustrup percebeu que a linguagem Simula possua
caractersticas bastante teis para o desenvolvimento de software, mas era muito lenta para
uso prtico. Por outro lado, a linguagem BCPL era rpida, mas possua demasiado baixo
nvel, dificultando sua utilizao em desenvolvimento de aplicaes. Durante seu perodo na
Bell Labs, ele enfrentou o problema de analisar o kernel UNIX com respeito computao
distribuda. A partir de sua experincia de doutorado, comeou a acrescentar elementos do
Simula no C. O C foi escolhido como base de desenvolvimento da nova linguagem pois
possua uma proposta de uso genrico, era rpido e tambm portvel para diversas
plataformas. Algumas outras linguagens que tambm serviram de inspirao para o cientista
da computao foram ALGOL 68, Ada, CLU e ML.
53
Vantagens:
No est sob o domnio de uma empresa (em contraste do Java Sun ou Visual Basic
Microsoft);
Desvantagens:
54
55
podem
ser
configuradas
para
utilizao
em
diversos
ambientes
de
56
4.3.2. OpenCV
Resumo da instalao:
57
Para obter o cdigo fonte que atualizado quase diariamente, necessrio baixar a
partir do repositrio SVN, no endereo: http://code.opencv.org/svn/opencv/trunk/opencv.
Nesse caso, o programa TortoiseSVN realizou esta tarefa no dia 20/09/2012 baixando
a verso 2.4.2, conforme figura 4.3, abaixo:
Figura 4. - TortoiseSVN
Fonte: Autor.
58
Seguindo os passos:
Deve-se
localizar
pasta
onde
deseja
fazer
download
dos
cdigos
4.3.2.2. CMake
CMake criar os arquivos de projeto para verso MSVS 2008 necessrios para
construir posteriormente os fontes do OpenCV.
A verso utilizada foi a 2.8.9, baixado no endereo: http://www.cmake.org/.
Seguindo os passos:
Escolher o caminho do cdigo fonte (onde foi baixado OpenCV). Neste diretrio deve
conter o arquivo CMakeLists.txt. Ex.: C:\opencv;
Escolher o compilador / IDE que deseja usar. Neste caso, escolha Visual Studio 9.
Escolher as opes que deseja usar. Como construir exemplos, construir opencv_core,
construir opencv_highgui, etc;
Clicar em Gerar.
59
Figure 4. - CMake
Fonte: Autor.
60
61
Abrir VC++ Directories: Tools > Options > Projects and Solutions > VC++
Directories;
Adicionar $openCVDir\include
Adicionar $openCVDir\lib
Adicionar $openCVDir\bin
62
opencv_highgui242d.lib
opencv_imgproc242d.lib
opencv_legacy242d.lib
opencv_ml242d.lib
opencv_nonfree242d.lib
opencv_objdetect242d.lib
opencv_photo242d.lib
opencv_stitching242d.lib
opencv_ts242d.lib
opencv_video242d.lib
opencv_videostab242d.lib
63
opencv_photo242.lib
opencv_stitching242.lib
opencv_ts242.lib
opencv_video242.lib
opencv_videostab242.lib
Resumo da instalao:
4.3.3.1. Leptonica
64
Ir
at
pasta
onde
deseja
fazer
download
das
65
No final desse processo sero gerados quatro diretrios na pasta "C:\ OpenSource\TesseractOCR\vs2008\", chamados: LIB_Debug, LIB_Release, DLL_Debug e DLL_Release;
Abrir VC++ Directories: Tools > Options > Projects and Solutions > VC++
Directories;
Adicionar:
C:\OpenSource\Tesseract-OCR\include,
C:\OpenSource\Tesseract-OCR\include\leptonica;
C:\OpenSource\Tesseract-OCR\tesseract-ocr\ccutil;
C:\OpenSource\Tesseract-OCR\tesseract-ocr\ccstruct;
C:\OpenSource\Tesseract-OCR\tesseract-ocr\ccmain;
C:\OpenSource\Tesseract-OCR\tesseract-ocr\api
66
libtesseract302d.lib
libtesseract302.lib
Libfftw3-3.dll
Liblept168.dll
Libtesseract302d.dll
4.4.
Descrio da Implementao
67
4.4.1. A captura
68
de uma cmera de alta qualidade. Por outro lado, funcionando em cmeras de baixa resoluo,
de se esperar um melhor resultado com cmeras que trabalham em alta resoluo.
importante destacar, que para um projeto com finalidade comercial fundamental a
escolha de um sistema tico adequado, exigindo um estudo mais complexo de cmeras,
conforme o anunciado do tpico 3.4.
A seguir, o trecho de cdigo para captura de vdeo na cmera (em tempo real) extrado
do cdigo fonte utilizado nesse trabalho:
24
30
ou
28
22 IplImage *frame;
36 frame = cvQueryFrame( capture );
32
33
34
35
36
37
38
39
if( capture )
{
while( true )
{
frame = cvQueryFrame( capture );
if(frame)
{
69
40
41
42
43
44
45
46
47
48
49
50
51
52
53
startT=clock();
frameDeteccaoPlaca( frame );
endT=clock();
cout << (double) (endT-startT) << endl;
}
else
{
cout << "FIM da captura" << endl;
break;
}
if( cvWaitKey(5) == 27 ) { break; }
}
}
4.4.2. O pr-processamento
75
273
337
O mtodo cvCvtColor faz diversas converses de imagem. Nos dois casos mostrados
acima, o cdigo de converso CV_BGR2GRAY, converte uma imagem com codifio de cores
tanto em RGB ou BRG para escala de cinza. J o cdigo de converso CV_BGR2HLS,
converte uma imagem com codifio de cores tanto em RGB ou BRG para representao de
cores em HLS (Hue-Lightness-Saturation), ou vice-versa, com a codifio CV_HLS2BGR.
70
71
Seguindo assim, a ideia de diminuio de rudo explicado no tpico 3.8 desse trabalho,
veremos abaixo outro mtodo da biblioteca OpenCV utilizado para diminuio do ruido:
77
Nesse mtodo utilizado o filtro Gaussiano sobre uma rea de cinco por cinco
centralizada em cada pixel que ser varrido, com objetivo de suavizar a transio entre os
valores dos pulsos, reduzindo o rudo. Este parmetro da dimenso de rea do filtro de
suavizao depender primordialmente da qualidade da captura da imagem. A figura 4.9,
abaixo, mostra a processo de suavizao.
72
73
95
96
97
98
99
100
101
102
103
74
75
4.4.4. A validao
Aps o processo de localizao dos contornos dos objetos, a validao tem for
finalidade encontrar o objeto desejado. Sendo assim, necessrio conhecer basicamente duas
caractersticas:
123
124
125
126
127
128
129
130
131
132
133
134
135
76
136
{
137
CvBox2D box = cvMinAreaRect2(approxContour);
138
double whRatio = (double)box.size.width /
139
box.size.height;
140
if ((!(2.7 < whRatio && whRatio < 3.4))
) //||
141 abs(box.angle)>20 razao da largura e altura do objeto (essa proporcao
142 para o formato brasileiro).
143
{
144
CvSeq* child = contours->v_next;
145
if (child != NULL)
146
encontraPlaca(child, frame_gray, frame);
147
continue;
}
/*...*/
}
/*...*/
}
O lao for percorrer todos os contornos que foram localizados na etapa anterior.
Para cada contorno percorrido pelo lao, a funo cvApproxPoly tem por finalidade
aproximar
as
formas
curvas
para
poligonais.
mtodo
utilizado
77
4.4.5. A segmentao
182
207
208
209
210
Nesta etapa, feito o recorte da placa que foi localizada na imagem utilizando o
mtodo cvSetImageROI que seleciona o local informado pela varivel chamada box2 do
tipo CvRect estrutura utilizada para trabalhar com polgonos retangulares, contendo as
informaes de localizao, largura e altura do objeto.
O mtodo cvResize tem por finalidade redimensionar a imagem utilizando a tcnica de
interpolao bilinear, CV_INTER_LINEAR. O redimensionamento do recorte ampliar a
placa, facilitando o processo de reconhecimento de detalhes da imagem na etapa seguinte.
78
Utilizar tcnicas de dilatao e eroso da imagem, para separar os caracteres que por
ventura estejam prximos uns dos outros;
212
213
214
215
216
217
218
219
utilizadas
neste
trabalho
foram
CV_THRESH_BINARY e o CV_THRESH_BINARY_INV.
CV_THRESH_TRUNC,
79
CV_THRESH_TRUNC
Se um pixel estiver acima do valor limiar, ser definido o valor limiar indicado. Se o
pixel estiver abaixo do valor limiar, continua com o mesmo valor. geralmente usado quando
se quer destacar pixels acima do valor limiar, deixando outras originais.
CV_THRESH_BINARY
Se um pixel estiver acima do valor limiar, ser definido o valor mximo indicado. Se o
pixel estiver abaixo do valor limiar, ser ajustado para o valor zero. Poderia ser usado para
realar pixels acima de um limiar de uma imagem, ao remover os outros.
CV_THRESH_BINARY_INV
O aposto do CV_THRESH_BINARY.
80
Alm disso, o valor especial CV_THRESH_OTSU pode ser combinado com um dos
valores acima indicados. Neste caso, a funo determina o valor do limiar timo usando o
algoritmo de Otsu e o usa, em vez do limiar especificado. A funo retorna o valor limite
computadorizado. Atualmente, o mtodo de Otsu implementado apenas para imagens de 8
bits. O algoritmo de Otsu baseia-se nas mdias dos valores dos pixels dentro da imagem.
Para a placa capturada na figura 4.15, observa-se o modelo de placa particular (fundo
na cor cinza e letra na cor preta), utilizando dessa forma o tipo de limiarizao binria. J para
os casos de modelo de placas de aluguel, de experincia ou de fabricantes (fundo com cor e
letra na cor branca), utiliza-se o tipo de limiarizao binria inversa.
81
221
222
cvDilate(licenca,licenca,NULL,2);
cvErode(licenca,licenca,NULL,2);
82
Observa-se assim, uma grande diferena do tipo de fonte especificado pelo rgo
regulador e o capturado na imagem. Essa diferena deve ser tratada, caso contrrio o
Tesseract OCR reconhecer caracteres estranhos ou errneos, justamente porque a biblioteca
de treinamento padro no tenha aprendido o tipo de letra.
Alm disso, quando realizado o processo de aprendizado da linguagem, nota-se
visivelmente um aumento da performance no reconhecimento dos caracteres.
A seguir ser demonstrado especificamente o processo de treinamento dos caracteres
exemplificados neste trabalho, nas seguintes etapas:
geradas na etapa de preparao dos caracteres para leitura. Este passo fundamental, pois
para cada imagem gerada, diferenciam-se as formas para os mesmos caracteres encontrados.
Para isso, o Tesseract utiliza um tipo de arquivo com formato TIFF - um formato de
ficheiro grfico bitmap.
83
Das imagens arquivadas no formato JPEG pelo mtodo saveImage (vide apndice
A), foram extrados manualmente os caracteres utilizando a ferramenta Paint (copiando e
colando) no novo arquivo nomeado de placa.arial.exp0.tif, conforme vemos na figura 4.20 o
resultado final:
No exemplo:
84
J
K
E
8
9
.
4
6
J
K
E
8
9
4
6
J
K
E
8
9
4
6
J
K
E
8
9
4
6
J
K
E
8
9
4
6
J
K
E
8
9
4
6
13 976 97 1103 0
114 973 201 1103 0
202 961 307 1104 0
335 1028 352 1044 0
380 969 468 1103 0
488 969 577 1102 0
582 957 608 965 0
596 969 683 1101 0
704 969 792 1102 0
12 801 95 940 0
113 799 201 940 0
202 789 308 936 0
338 856 354 875 0
381 798 469 933 0
491 792 575 931 0
596 793 681 931 0
703 792 786 931 0
12 618 95 753 0
112 614 198 752 0
203 601 307 748 0
337 670 352 687 0
382 609 468 744 0
487 608 573 744 0
593 606 679 741 0
701 604 783 739 0
12 410 94 545 0
114 404 200 543 0
204 393 305 543 0
338 465 348 479 0
383 402 466 541 0
488 401 573 539 0
595 401 680 533 0
703 401 785 536 0
9 213 93 347 0
112 207 197 346 0
200 199 304 344 0
337 269 349 283 0
380 207 466 343 0
486 206 574 342 0
593 207 680 340 0
702 206 786 340 0
13 36 98 166 0
114 34 202 167 0
203 22 308 166 0
336 92 353 111 0
382 33 468 166 0
487 31 573 166 0
578 21 679 166 0
702 34 787 167 0
85
Agora necessrio compilar uma nova biblioteca. Seguem os comandos que executam
essa tarefa:
1 Para cada arquivo TIFF treinado, executar:
$tesseract
[lang].[fontname].exp[num].tif
[lang].[fontname].exp[num]
nobatch box.train
Exemplo:
Arial 0 1 0 0 0
86
Executando:
mftraining
-F
font_properties
-U
unicharset
-O
[lang].unicharset
[lang].[fontname].exp[num].tr ...
Exemplo:
mftraining
-F
font_properties
-U
unicharset
-O
placa.unicharset
placa.arial.exp0.tr ...
E executando:
Exemplo:
87
$ combine_tessdata [lang].
Feito todos esses procedimentos, o treinamento nomeado placa est criado e pronto
para ser utilizado no programa de reconhecimento de caracteres, conforme a seguir:
248 void tesseractOCR(IplImage *placa, int x, int y, int width, int height)
249 {
250
TessBaseAPI tess;
251
tess.SetVariable("tessedit_char_whitelist",
252
"ABCDEFGHIJKLMNOPRSTUVWXYZ1234567890");
253
tess.Init(NULL,"placa" );
254
tess.SetImage((uchar*)placa->imageData, placa->width, placa->height,
255
placa->nChannels, placa->widthStep);
256
tess.SetRectangle(x,y,width,height);
257
//tess.GetBoxText(0);
258
tess.Recognize(0);
259
//tess.TesseractRect
260
261
const char* out = tess.GetUTF8Text();
262
tess.End();
263
264
cout << out << endl;
265 }
88
5.
A seguir, sero mostrados os testes realizados no modelo, descrevendo o passo-apasso, alm dos equipamentos utilizados.
No processo de captura, utilizaram-se dois equipamentos de filmagem: uma webcam
que filma em qualidade VGA (figura 5.1) e uma cmera de oito Mega pixel do iPhone 4S
(figura 5.2). A webcam foi utilizada para testes de desenvolvimento, aferindo em tempo-real o
funcionamento e a qualidade da implementao do algoritmo e da prpria biblioteca de
imagem utilizada. A cmera do iPhone 4S serviu para gravar as vdeos-imagens dos veculos
89
90
Processador:
Cache : 3MB.
Processador Grfico:
Memria:
Frequncia: DDR3-1333MHz.
91
Arquivo
Resoluo
Amostras
Sucesso
Falha
Proporo(%)
teste1.wmv
480p
100 %
teste2.wmv
1080p
17
12
70,5 %
teste3.wmv
1080p
30
19
11
63.3 %
Resoluo
teste1.wmv
480p
~ 60
teste2.wmv
1080p
~ 95
teste3.wmv
1080p
~105
Resoluo
Amostras
Sucesso
Falha
Proporo(%)
teste1.wmv
480p
100 %
teste2.wmv
1080p
12
12
100 %
teste3.wmv
1080p
19
19
100 %
92
prata utilizando a placa do modelo particular: na placa existia a borda sutilmente preta, que
encobria o material de alumnio que normalmente no pintada.
Na performance do algoritmo, verifica-se que o modelo rodou no mximo de 16,6
frames/segundo e um mnimo de 9,5 frames/segundo, considerado inferior ao previsto para
utilizar em tempo real. No caso, a configurao do notebook utilizado neste projeto no
mostrou desempenho suficiente para a aplicao em tempo real. Uma maneira de otimizar o
processo criando um algoritmo que melhor utilize a caracterstica de multiprocessamento do
processador.
Utilizando o Tesseract OCR obteve-se um bom resultado, desde que seja realizado
previamente o treinamento dos caracteres baseado no processo de segmentao e leitura OCR,
esclarecidos nos itens 4.4.5 e 4.4.6 desse trabalho. No mesmo item 4.4.6 importante destacar
que o processo de aprendizagem dos caracteres ajuda na performance da biblioteca.
Na tabela 5.4 a seguir, ilustrado a performance dos sistemas de deteco de placas
automotivas, encontradas em algumas literaturas.
Taxa de
reconhecimento
Plataforma e
processador
Tempo
(seg)
DP: deteco da
placa
RC: reconhecimento
dos caracteres
T: sucesso total
[2]
100% (DP)
92.5% (RC)
Matlab 6.0, P
II ,
300MHz
~4
AMD K6,
350MHZ
~5
~0.1
~1.6
~0.3
[3]
80.4% (T)
[4]
99.6% (DP)
P IV, 1.7GHz
[6]
94.2% (DP),
C++, P II,
300MHz
98,6% (RC)
[7]
92.3% (DP),
95.7% (RC)
[8]
93.1% (T)
[9]
90% (T)
P III, 1GHz
93
97% (T no dia),
0.1 1.5
90% (T a noite)
[11]
91% (T)
RS/6000 mod.
560
~1.1
[12]
80% (T)
Intel
486/66MHz
~15
[13]
89% (DP)
C++, P III
800MHz
~1.3
[14]
98.5% (DP)
AMD Athlon
1.2
~34
P: Um classificador supervisionado
treinados sobre as caractersticas de
textura. R: kd-tree data and
approximate nearest neighbour. Teste:
131 imagens.
[15]
95% (T)
Visual C++, P
IV
[16]
97% (DP)
Workstation
SG INDIGO
2
[17]
75.4% (DP),
[18]
98.5% (RC)
97.6% (DP)
95.6% (RC)
~2.5
[19]
98% (DP)
3.12
[20]
0.15
[21]
[22]
P III, 600
MHz
P III, 500
MHz
-
[23]
98.8% (DP),
95.2% (RC)
Visual C++, P
IV 1.4 GHz
[24]
95.6% (DP)
0.65
(plates)
0.1 (per
character
)
-
[25]
92.4% (DP)
[26]
93.6% (DP)
[27]
85% (DP)
Borland C++,
P IV 1.6GHz
Visual C++,
AMD Athlon
900Mhz
-
[28]
85% (DP)
[29]
100% (DP),
94.7% (RC)
Pulse-Coupled
NN Processor
Visual C++, P
II
0.18
-
~1.3
~1
94
[30]
98% (DP)
C++, P I, 200
MHz
0.2
[31]
97.0-99.3%
[32]
84.5% (RC
segmentation)
96.8% (RC)
Visual C++, P
IV 2.4GHz
-
~1.5
[33]
[36]
[37]
[34]
1000 imagens.
P: Vector Quantization (VQ) for picture
compression and effective license plate
location.
P: Sensing system with a wide dynamic
range. Teste: 1000 imagens.
Character segmentation: Feature vector
extraction and mathematical morphology.
P: Block based local adaptive
binarization method.
P: Connected components. R: Hidden
Markov Models.
R: Character recognition-PNN. Teste:
680 imagens.
P:Gradientanalysis,R:Templatematching
Comparando as tcnicas utilizadas por alguns autores, este trabalho deu um foco maior
literatura desenvolvida pelos autores Bai Hongliang e Liu Changping (2004), focando na
localizao de bordas e caractersticas morfolgicas da placa.
95
Outro fator que deve ser levado em considerao para o projeto ter eficcia a
velocidade de processamento do computador. A princpio, o sistema deve ser ajustado
para trabalhar com uma velocidade de processamento equivalente a velocidade de
gravao da cmera, permitindo a deteco das placas em tempo real. Caso no seja
possvel, procura-se trabalhar com o processamento, adequando velocidade para
acima da mxima permitida pela via. Por exemplo, se o sistema captura a placa numa
distncia de 30 metros entre os pontos de mnima e mxima deteco e a velocidade
da via seja de 30m/s (108Km/h), calcula-se que em um segundo que o carro percorra
os 30 metros, o sistema deva capturar no mnimo um quadro perfeito.
96
6. CONCLUSO
6.1. Concluses
As
disciplinas
como
fsica,
mtodos
matemticos,
programao
processamento digital de imagem, so exemplos que compem a parte terica. A cmera que
filma em um formato e em uma determinada resoluo e o computador que processa e
armazena dados, foram aqui consideradas como tecnologias fins para obteno de
informaes. Assim, para a construo do software de deteco e reconhecimento de placas
para carros e caminhes, aplicou-se o modelo proposto na figura 4.1, baseado em um projeto
de viso computacional utilizando as bibliotecas open source, OpenCV e o Tesseract OCR.
No decorrer da fase de desenvolvimento do software, no faltaram problemas para
serem solucionados. Por exemplo, no processo de captura da imagem no foi utilizada uma
cmera adequada que trouxesse qualidade imagem, alm da parte de iluminao sem a luz
e um equipamento eficaz, outras fases do modelo so afetadas diretamente. Dessa maneira, a
fase de pr-processamento exigiu um tratamento das imagens, aplicando filtros para
diminuio de rudos. No processo de localizao, empregou-se a tcnica de segmentao de
bordas que melhor oferecesse performance ao algoritmo. No processo de validao, foram
ajustados parmetros para conferir maior preciso para a deteco da placa automotiva. J no
processo da leitura e reconhecimento de caracteres, destacou-se a necessidade prvia do
aprendizado dos caracteres, por um mtodo bastante trabalhoso atualmente.
Dessa maneira, o objetivo principal do projeto foi cumprido para a maioria dos casos
de testes, salvo nos casos particulares apresentados na sesso dos resultados da aplicao do
captulo da aplicao prtica, onde foram encontrados casos em que o mtodo de deteco de
borda falha e necessita uma ateno especial nos equipamentos de captura.
Para aperfeioar o trabalho de deteco de objeto por bordas, tentou-se utilizar
tambm em conjunto outras tcnicas de segmentao, como a de Sobel e a wavelet 2D, porm
97
98
REFERNCIAS
CANNY, J.; A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis
and Machine Intelligence, 1986.
BRADSKI, KAEHLER Adrian; Learning OpenCV, (2008).
DAVIES, E. Roy. Machine Vision: Teoria, Algoritmos, Practicalities. Morgan Kaufmann,
2005.
DESCHAMPS, Fernando. Contribuies para o Desenvolvimento de um Sistema de Viso
aplicado ao Monitoramento do Desgaste de Ferramentas de Corte - O Sistema ToolSpy.
Dissertao de mestrado, Universidade Federal de Santa Catarina - Programa de Ps
Graduao em Engenharia Eltrica, Florianpolis - SC - Brasil, 2004.
ERHARDT-FERRON. Theory and Applications of Digital Image Processing. University of
Applied Sciences Offenburg, 1 edition, 2000.
FORSYTH, J. Ponce, Computer Vision: A Modern Approach, Englewood Cliff s, NJ:
Prentice-Hall, 2003.
GONZALEZ, RICHARD E. Woods. Digital Image Processing. Pearson Education, 2 edition,
2002.
GRIOT, Melles. The Practical Application of Light. Estados Unidos, 1999.
HUBEL, WIESEL; Receptive Fields, binocular interaction and functional architecture in the
cats visual cortex. J. Physiol, 1962.
JHNE, HAUSSECKER, PETER Geissler. Handbook of Computer Vision and Applications
- Sensors and Imaging, volume 1. Academic Press, San Diego - CA, 1 edition, 1999.
JAIN, A. K. Fundamentals of digital image processing. Englewood Cliffs, NJ: Prentice Hall,
1989.
JAIN, KASTURI, BRIAN G. Schunck. Machine Vision. McGraw Hill, 1 edition, 1995.
LARSON, H. J.; SHUBERT, B. O. Probabilistic Models in engineering sciences 1979, v.1
MARQUES FILHO, Og; VIEIRA NETO, Hugo. Processamento Digital de Imagens, Rio de
Janeiro:Brasport, 1999.
MORRIS, Tim. Computer Vision and Image Processing. Palgrave Macmillan, 2004.
99
PRATT, W. K. Digital image processing. New York: John Wiley and Sons, 1991.
SHAPIRO, GEORGE Stockman. Computer Vision. Prentice Hall, 2001.
TRUCCO, A. Verri, Introductory Techniques for 3-D Computer Vision, Englewood Cliff s,
NJ: Prentice-Hall, 1998.
ZIOU D., TABBONE S. Edge Detection Techniques - An Overview. International Journal of
Pattern Recognition and Image Analysis,Vol. 8, No. 4, pp. 537-559, 1998. also Technical
Report, No. 195, Dept. Math. Et Informatique, Universit de Sherbrooke, 41p, 1997.
Links externos:
TheComputerVision uma comunidade para os pesquisadores de viso por computador e
profissionais para compartilhar, discutir, conectar e colaborar.
Disponvel em: The Computer Vision <http://cvisioncentral.com/>
Acesso em: 10 de nov. 2012.
Uma boa fonte para cdigos-fonte, pacotes de software, conjuntos de dados, etc relacionada
viso de computacional.
Disponvel em: Computer Vision Online <http://www.computervisiononline.com/>
Acesso em: 10 de nov. 2012.
100
p.p.
2-7,
2000.
[Online].
Available:
http://www.medialab.ntua.gr/people/canag/journals.php.
[3] F. Martn, M. Garca, J. L. Alba, (2002, Jun.), New Methods for Automatic Reading of
VLP's (Vehicle License Plates), presented at IASTED International Conference Signal
Processing, Pattern Recognition, and Applications, SPPRA 2002. [Online]. Available:
http://www.gpi.tsc.uvigo.es/pub/papers/sppra02.pdf.
[4] Bai Hongliang and Liu Changping, A hybrid License Plate Extraction Method Based On
Edge Statistics and Morphology, in proc. Conf. on Pattern Recognition (ICPR), 2004, pp.
831-834.
[5] Danian Zheng, Yannan Zhao, Jiaxin Wang, An efficient method of license plate
location, Pattern Recognition Letters (2005), Volume 26, Issue 15, November 2005, Pages
2431-2438.
[6] SherrZheng Wang and HsMian Lee, Detection and Recognition of License Plate
Characters with Different Appearences, in proc. Conf. Intelligent Transportation Systems,
vol. 2, 2003, pp. 979 - 984.
[7] Hsi-Jian Lee, Si-Yuan Chen and Shen-Zheng Wang, Extraction and Recognition of
License Plates of Motorcycles and Vehicles on Highways, in proc Int. Conf. on Pattern
Recognition (ICPR), 2004, pp. 356 359.
[8] Tsang-Hong Wang, Feng-Chou Ni, Keh-Tsong Li, Yon-Ping Chen, Robust License Plate
Recognition based on Dynamic Projection Warping, in proc. IEEE Int. Conf. on Networking,
Sensing & Control, 2004, pp.784-788.
[9] Xifan Shi, Weizhong Zhao, and Yonghang Shen, Automatic License Plate Recognition
System Based on Color Image Processing, Lecture Notes on Computer Science 3483, O.
Gervasi et al., Ed. Springer-Verlag, 2005, pp. 1159 1168.
[10] Dai Yan, Ma Hongqing, Liu Jilin and Li Langang, A High Performance License Plate
Recognition System Based on the Web Technique, in proc. Conf. Intelligent Transportation
Systems, 2001, pp. 325-329.
101
[11] P. Comelli, P. Ferragina, M.N. Granieri, F. Stabile, Optical recognition of motor vehicle
license plates, IEEE Trans. On Vehicular Technology, vol. 44, No. 4, pp. 790-799, 1995.
[12] S. Draghici, A neural network based artificial vision system for license plate
recognition, International Journal of Neural Systems, vol. 8, no. 1, pp. 113-126, 1997.
[13] Kwang In Kim, Keechul Jung, and Jin Hyung Kim , Color Texture-Based Object
Detection: An Application to License Plate Localization, Lecture Notes on Computer
Science 2388, S.-W. Lee and A. Verri, Ed., Springer-Verlag, pp. 293-309.
[14] J. Cano and J. C. Perez-Cortes, Vehicle License Plate Segmentation in Natural Images,
Lecture Notes on Computer Science 2652, F.J. Perales et al., Ed. Springer-Verlag, 2003, pp.
142149.
[15] A.Broumandnia, M.Fathy, (2005, Dec.) , Application of pattern recognition for Farsi
license plate recognition, to be presented at ICGST International Conference on Graphics,
Vision and Image Processing (GVIP-05). [Online]. Available: http://www.icgst.com/gvip
/v2/P1150439001.pdf.
[16] N. Zimic, J. Ficzko, M. Mraz, J. Virant, The Fuzzy Logic Approach to the Car Number
Plate Locating Problem, in proc. Intelligent Information Systems (IIS97), pp.227-230, 1997.
[17] J. A. G. Nijhuis, M. H. ter Brugge, K.A. Helmholt, J.P.W. Pluim, L. Spaanenburg,R.S.
Venema, M.A. Westenberg, Car License Plate Recognition with Neural Networks and Fuzzy
Logic, in proc.. IEEE International Conference on Neural Networks, vol.5, 1995, pp. 22322236.
[18] Shyang-Lih Chang, Li-Shien Chen, Yun-Chung Chung, and Sei-Wan Chen, Automatic
License Plate Recognition, IEEE Trans. on Intelligent Transportation Systems, Vol. 5, No. 1,
pp. 42-53, 2004.
[19] Fatih Kahraman, Binnur Kurt, and Muhittin Gkmen , License Plate Character
Segmentation Based on the Gabor Transform and Vector Quantization, Lecture Notes on
Computer Science 2869, A. Yazici and C. Sener, Ed., Springer-Verlag, 2003, pp. 381-388.
[20] G. Adorni, S. Cagnoni, M. Gori, and M. Mordonini, Access control system with neurofuzzy supervision, in proc. Conf. Intelligent Transportation Systems, 2001, pp. 472-477.
[21] Seiki Yoshimori, Yasue Mitsukura, Minoru Fukumi, and Norio Akamatsu, License
Plate Detection Using Hereditary Threshold Determine Method, Lecture Notes in Artificial
102
Intelligence 2773, V. Palade, R.J. Howlett, and L.C. Jain, Ed. Springer-Verlag, 2003, pp.
585593.
[22] Yuntao Cui, Qian Huang, Extracting characters of license plates from video sequences,
Machine Vision and Applications, vol. 10, pp. 308-320, 1998.
[23] Tran Duc Duan, Tran Le Hong Du, Tran Vinh Phuoc, Nguyen Viet Hoang, Building an
Automatic Vehicle License-Plate Recognition System, in proc. Intl. Conf. in Computer
Science (RIVF), 2005, pp. 59-63.
[24] Louka Dlagnekov, (2004, Mar.), License Plate Detection Using AdaBoost, Computer
Science
&
Engineering
Dpt.,
San
Diego,
La
Jolla.
[Online].
Available:
http://www.cse.ucsd.edu/classes/ fa04/cse252c/projects/louka.pdf.
[25] Ching-Tang Hsieh, Yu-Shan Juan, Kuo-Ming Hung, Multiple License Plate Detection
for Complex Background, in Proc. Int Conf. on Advanced Information Networking and
Applications (AINA), vol. 2, 2005, pp. 389-392.
[26] Dong-Su Kim, Sung-I1 Chien, Automatic Car License Plate Extraction Using Modified
Generalized Symmetry Transform and Image Warping, in proc. Int. Symposium on
Industrial Electronics (ISIE), 2001 , pp. 2022-2027.
[27] M. H. ter Brugge, J. H. Stevens, J.A. G. Nijhuis, L. Spaanenburg, License Plate
Recognition Using DTCNNs, in proc. IEEE lnt. Workshop on Cellular Neural Networks and
their Applications, 1998, pp. 212-217.
[28] Mario I. Chacon M., Alejandro Zimmerman S., License Plate Location Based on a
Dynamic PCNN Scheme, in proc. Int. Joint Conf. on Neural Networks, vol. 2, 2003, pp.
1195 1200.
[29] K.K.Kim K.I.Kim J.B.Kim H. J.Kim, Learning-Based Approach, for License Plate
Recognition, in proc. IEEE Signal Processing Society Workshop, Neural Networks for
Signal Processing, Vol. 2, 2000, pp. 614 - 623.
[30] R. Zunino, S. Rovetta, Vector quantization for license-plate location and image coding,
IEEE Trans. on Industrial Electronics, February, vol.47, No.1, pp.159-167, 2000.
[31] T. Naito, T. Tsukada, K. Yamada, K. Kozuka, S. Yamamoto, Robust license-plate
recognition method for passing vehicles under outside environment, IEEE Trans. on
Vehicular Technology, Vol. 49, No.6, pp. 2309-2319, 2000.
103
[32] Shigueo Nomura, Keiji Yamanaka, Osamu Katai, Hiroshi Kawakami, Takayuki Shiose,
A novel adaptive morphological approach for degraded character image segmentation,
Pattern Recognition, Vol. 38, Issue 11, November 2005, pp.1961-1975.
[33] Byeong Rae Lee, Kyungsoo Park, Hyunchul Kang, Haksoo Kim, and Chungkyue Kim,
Adaptive Local Binarization Method for Recognition of Vehicle License Plates, Lecture
Notes on Computer Science 3322 R. Klette and J. uni, Ed. Springer-Verlag, 2004, pp. 646
655.
[34] David Llorens, Andres Marzal, Vicente Palazon, and Juan M. Vilar , Car License Plates
Extraction and Recognition Based on Connected Components Analysis and HMM
Decoding, Lecture Notes on Computer Science 3522, J.S. Marques et al. , Ed. SpringerVerlag, 2005, pp. 571578.
[35] C. Anagnostopoulos, T. Alexandropoulos, S. Boutas, V. Loumos, E. Kayafas, A
template-guided approach to vehicle surveillance and access control, in proc. IEEE Conf. on
Advanced Video and Signal Based Surveillance, 2005., pp. 534 539.
[36] Yafeng Hu, Feng Zhu, and Xianda Zhang, A Novel Approach for License Plate
Recognition Using Subspace Projection and Probabilistic Neural Network, Lecture Notes on
Computer Science 3497, J. Wang, X. Liao, and Z. Yi, Ed. Springer-Verlag 2005, LNCS 3497,
pp. 216221.
[37] Yo-Ping Huang, Shi-Yong Lai and Wei-Po Chuang, A Template-Based Model for
License Plate Recognition, in proc. IEEE Int. Conf. on Networking, Sensing & Control,
2004, pp. 737-742.
104
APNDICE
1 #include <stdio.h>
2 #include <highgui.h>
3 #include <cv.h>
4 #include <baseapi.h>
5
6
7 using namespace cv;
8 using namespace std;
9 using namespace tesseract;
10
11 void frameDeteccaoPlaca( IplImage* frame );
12 IplImage* encontraPlaca(CvSeq* contours, IplImage* frame_gray,
13
IplImage* frame );
14 void trataImagemHLS(IplImage* frame);
15 void tesseractOCR(IplImage *placa, int x, int y, int width, int height);
16 void saveImg(IplImage *img);
17 double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 );
18 IplImage* sobelImg(IplImage* frame);
19
20 int main(int argc, char** argv)
21 {
22
IplImage *frame;
23
24
CvCapture *capture = NULL;
25
26
clock_t startT, endT;
27
28
capture = cvCreateFileCapture( "teste1.wmv" );
29
30
//capture = cvCaptureFromCAM( -1 );
31
32
if( capture )
33
{
34
while( true )
35
{
36
frame = cvQueryFrame( capture );
37
if( !frame ) break;
38
if( !frame->imageSize==0 )
39
{
40
startT=clock();
41
frameDeteccaoPlaca( frame );
42
endT=clock();
43
cout << (double) (endT-startT) << endl;
44
}
45
else
46
{
47
cout << "Problema na webcam! Sem captura" << endl;
48
break;
49
}
50
105
51
if( cvWaitKey(5) == 27 ) { break; }
52
}
53
}
54
cvReleaseCapture( &capture );
55
cvDestroyWindow("Deteccao da placa");
56 }
57
58 void frameDeteccaoPlaca( IplImage* frame )
59 {
60
//trata imagem utilizando o tipo HLS (HUE, Light, Saturation)
61
//trataImagemHLS(frame);
62
63
//IplImage* frame_gray_s = cvCreateImage( cvSize( frame->width,frame64 >height ), IPL_DEPTH_8U, 1); // gray smooth
65
IplImage* frame_gray = cvCreateImage( cvSize( frame->width,
66
frame->height ), IPL_DEPTH_8U, 1);
67
IplImage* frame_canny = cvCreateImage( cvSize( frame->width,
68
frame->height ), IPL_DEPTH_8U, 1);
69
IplImage* frame_canny2 = cvCreateImage( cvSize( frame->width,
70
frame->height ), IPL_DEPTH_8U, 1);
71
IplImage* frame_merge = cvCreateImage( cvSize( frame->width,
72
frame->height ), IPL_DEPTH_8U, 1);
73
74
// Escala cinza
75
cvCvtColor( frame, frame_gray, CV_BGR2GRAY );
76
// Retira ruidos
77
cvSmooth(frame_gray, frame_gray, CV_GAUSSIAN, 3,3);
78
79
//Sobel
80
//IplImage* frame_sobel = cvCreateImage( cvSize( frame->width,
81
frame->height ), IPL_DEPTH_8U, 1);
82
//frame_sobel = sobelImg(frame_gray);
83
84
//cvConvertScaleAbs(frame_sobel, frame_sobel);
85
86
//cvShowImage("Sobel", frame_sobel);
87
88
// Filtros canny cinza e canny colorida
89
cvCanny( frame_gray, frame_canny, 0, 255, 3);
90
//cvCanny( frame, frame_canny2, 0, 70, 3 );
91
92
// Soma dos filtros
93
//cvAddWeighted(frame_canny, 0.5, frame_canny2, 0.5, 0, frame_merge);
94
95
// declara contorno e area na memoria
96
CvSeq* contours = 0;
97
CvMemStorage* storage = NULL;
98
99
if( storage==NULL ) storage = cvCreateMemStorage(0);
100
else cvClearMemStorage(storage);
101
102
cvFindContours( frame_canny, storage, &contours, sizeof(CvContour),
103
CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
104
105
//-- Mostra imagem
106
cvShowImage("Deteccao da placa",
107
encontraPlaca(contours,frame_gray,frame) );
108
//cvShowImage("Deteccao da placa", frame);
109
110
// Libera recursos
111
cvReleaseImage(&frame_gray);
106
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
//cvReleaseImage(&frame_gray_s);
cvReleaseImage(&frame_canny);
cvReleaseImage(&frame_canny2);
cvReleaseImage(&frame_merge);
cvReleaseMemStorage(&storage);
}
IplImage* encontraPlaca(CvSeq* contours, IplImage* frame_gray,
IplImage* frame )
{
for ( ;contours!= NULL; contours = contours->h_next)
{
CvSeq* approxContour = cvApproxPoly(contours,
contours->header_size ,
contours->storage,
CV_POLY_APPROX_DP,
cvContourPerimeter(contours)*0.05,
0);
if (approxContour->total >=4 &&
fabs(cvContourArea(approxContour,CV_WHOLE_SEQ)) > 2000 &&
cvCheckContourConvexity(approxContour))
{
CvBox2D box = cvMinAreaRect2(approxContour);
double whRatio = (double)box.size.width /
box.size.height;
if ((!(2.7 < whRatio && whRatio < 3.4))
) //||
abs(box.angle)>20 razao da largura e altura do objeto (essa proporcao
para o formato brasileiro).
{
CvSeq* child = contours->v_next;
if (child != NULL)
encontraPlaca(child, frame_gray, frame);
continue;
}
double s = 0;
for( int i = 0; i <= 4; i++ )
{
// find minimum angle between joint
// edges (maximum of cosine)
if( i >= 2 )
{
double t = fabs(angle(
(CvPoint*)cvGetSeqElem(approxContour, i),
(CvPoint*)cvGetSeqElem(approxContour, i-2),
(CvPoint*)cvGetSeqElem(approxContour, i-1)));
s = s > t ? s : t;
}
}
// if cosines of all angles are small
// (all angles are ~90 degree) then write quandrange
// vertices to resultant sequence
if( !(s < 0.3) )
{
CvSeq* child = contours->v_next;
if (child != NULL)
107
173
174
175
176
177
178
179
180
181
182
183
184 largura
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
108
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
cvShowImage("Placa", licenca);
tesseractOCR(licenca, box_char.x, box_char.y ,
box_char.width , box_char.height);
}
cvClearSeq(approxContour);
}
return frame;
}
109
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
L = 255;
S = 0;
110
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
char buf[80];
tstruct = *localtime (&t);
strftime(buf, sizeof(buf), "%m-%d-%H-%M-%S.jpg" , &tstruct);
cvSaveImage(buf,img);
}
IplImage* sobelImg(IplImage* frame) //utilizando a escala de cinza
{
IplImage* frame_x = cvCreateImage( cvSize( frame->width,
frame->height ), IPL_DEPTH_8U, 1);
IplImage* frame_y = cvCreateImage( cvSize( frame->width,
frame->height ), IPL_DEPTH_8U, 1);
IplImage* frame_sobel = cvCreateImage( cvSize( frame->width,
frame->height ), IPL_DEPTH_8U, 1);
//em X
cvSobel(frame, frame_x, 2, 0);
//em Y
cvSobel(frame, frame_y, 0, 2);
cvAddWeighted( frame_x, 0.5, frame_y, 0.5, 0, frame_sobel );
cvReleaseImage(&frame_x);
cvReleaseImage(&frame_y);
return frame_sobel;
}