Вы находитесь на странице: 1из 184

i

i
?

6
i

? Header
6
i

?
6

Body

Margin
Notes

i
- 

i
10-

i
- 

11

 1i-

1
3
5
7
9
11

?
6

one inch + \hoffset


\oddsidemargin = 13pt
\headheight = 12pt
\textheight = 688pt
\marginparsep = 10pt
\footskip = 30pt
\hoffset = 0pt
\paperwidth = 597pt

?
Footer

2
4
6
8
10

one inch + \voffset


\topmargin = -23pt
\headsep = 25pt
\textwidth = 441pt
\marginparwidth = 35pt
\marginparpush = 7pt (not shown)
\voffset = 0pt
\paperheight = 845pt

ESCUELA POLITCNICA NACIONAL

ESCUELA DE INGENIERA

DISEO DE UN MDULO DE PREPROCESAMIENTO Y


EXTRACCIN DE CARACTERSTICAS FSICAS DE IMAGEN PARA
UNA APLICACIN DE RECONOCIMIENTO AUTOMTICO DEL
NMERO DE PLACA DE AUTOMVILES

PROYECTO PREVIO A LA OBTENCIN DEL TTULO DE INGENIERO EN


ELECTRNICA Y TELECOMUNICACIONES

DIEGO FERNANDO ASANZA MALDONADO

DIRECTOR: MSc. RAMIRO MOREJN

Quito, Octubre 2006

DECLARACIN

Yo, Diego Fernando Asanza Maldonado, declaro bajo juramento que el trabajo aqu
descrito es de mi autora; que no ha sido previamente presentado para ningn grado
o calificacin profesional; y, que he consultado las referencias bibliogrficas que se
incluyen en este documento.
A travs de la presente declaracin cedo mis derechos de propiedad intelectual
correspondientes a este trabajo, a la Escuela Politcnica Nacional, segn lo establecido por la Ley de Propiedad Intelectual, por su Reglamento y por la normatividad
institucional vigente.

Diego Fernando Asanza Maldonado

CERTIFICACIN

Certifico que el presente trabajo fue desarrollado por Diego Fernando Asanza Maldonado, bajo mi supervisin.

MSc. Ramiro Morejn


DIRECTOR DE PROYECTO

AGRADECIMIENTOS
Doy las gracias a mis Padres, por haber dedicado tanto tiempo y esfuerzo a mi
educacin. Sin ellos, nada de esto habra sido posible. Doy las gracias tambin a
mis hermanas, sobrinos, y al resto de mi familia, por su apoyo y colaboracin.
Agradezco tambin a mis maestros, por haber tenido la paciencia y generosidad de
compartir con nosotros sus conocimientos, los cuales espero saber usar adecuadamente. En especial, quisiera agradecer a mi director de proyecto, por su ayuda y
acertadas sugerencias, y por el tiempo dedicado a la revisin y correccin de este
trabajo.
Tambin agradezco a mis amigos y compaeros, con quienes tuve el honor de
compartir estos aos de universidad. Gracias por su ayuda y consejos.
Tambien doy las gracias a las personas del departamento de sealizacion de la
Policia Nacional, por su ayuda y la informacin proporcionada para realizar este
trabajo.
Por ltimo, quiero agradecer a la comunidad de software libre, por las maravillosas
herramientas que han creado y que han servido para la elaboracin de este proyecto. Gracias por su generosidad. Espero que, algn da, todos podamos vivir en
un mundo en el que las ideas circulen libremente, sin que haya personas que les
pongan precio.

Diego F. Asanza

DEDICATORIA

Dedicado a Dios, a mis Padres y a mi Familia.

CONTENIDO

RESUMEN

XVI

PRESENTACIN

XVII

1. PRELIMINARES

1.1. PLACAS AUTOMOTRICES . . . . . . . . . . . . . . . . . . . . . . . .

1.1.1. DIMENSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1.2. COLORES . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1.3. MATERIAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1.4. MONTAJE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2. DEFINICIN DEL MDULO A DISEAR . . . . . . . . . . . . . . . .

1.3. RESTRICCIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3.1. FORMATO DE LAS PLACAS . . . . . . . . . . . . . . . . . . .

1.3.2. PROCESAMIENTO DE LA IMAGEN . . . . . . . . . . . . . . .

1.3.3. FORMATO DE ENTRADA/SALIDA . . . . . . . . . . . . . . . .

1.3.4. TOMA DE LAS FOTOGRAFAS . . . . . . . . . . . . . . . . .

CONTENIDO
2. DESCRIPCIN DEL MDULO

VI

2.1. TRABAJOS ANTERIORES . . . . . . . . . . . . . . . . . . . . . . . .

2.1.1. MTODOS BASADOS EN LA PROYECCIN LATERAL DE


LA IMAGEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.1.2. MTODOS BASADOS EN EL ANLISIS DE COMPONENTES CONECTADOS . . . . . . . . . . . . . . . . . . . . . . . . 12


2.1.3. MTODOS DE COMPARACIN . . . . . . . . . . . . . . . . . 14
2.1.4. DETECCIN DE FIGURAS GEOMTRICAS . . . . . . . . . . 16
2.2. CONSIDERACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3. DESCRIPCIN DEL SISTEMA A IMPLEMENTAR . . . . . . . . . . . 18
2.3.1. PREPROCESAMIENTO . . . . . . . . . . . . . . . . . . . . . . 19
2.3.2. DETECCIN DE RECTNGULOS . . . . . . . . . . . . . . . . 25
2.3.3. SELECCIN Y FILTRADO . . . . . . . . . . . . . . . . . . . . 31
2.3.4. INTERFAZ DE USUARIO . . . . . . . . . . . . . . . . . . . . . 35

3. IMPLEMENTACIN

37

3.1. PLATAFORMA DE DESARROLLO . . . . . . . . . . . . . . . . . . . . 38


3.1.1. PLATAFORMA DE HARDWARE . . . . . . . . . . . . . . . . . 38
3.1.2. SISTEMA OPERATIVO . . . . . . . . . . . . . . . . . . . . . . 39
3.1.3. COMPILADOR Y DEPURADOR . . . . . . . . . . . . . . . . . 39
3.1.4. LIBRERAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.1.5. OPENCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

CONTENIDO

VII

3.2. IMPLEMENTACIN DEL SISTEMA . . . . . . . . . . . . . . . . . . . 42


3.2.1. ETAPA DE PRE-PROCESAMIENTO DE IMAGEN . . . . . . . 42
3.2.2. ETAPA DE DETECCIN DE RECTNGULOS . . . . . . . . . 46
3.2.3. ETAPA DE SELECCIN Y FILTRADO . . . . . . . . . . . . . . 50
3.3. EVALUACIN DE COSTOS . . . . . . . . . . . . . . . . . . . . . . . . 66

4. EVALUACIN
4.1. MUESTRAS

70
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

4.2. RESULTADOS EXPERIMENTALES . . . . . . . . . . . . . . . . . . . 74


4.2.1. EFECTIVIDAD EN LA DETECCIN . . . . . . . . . . . . . . . 74
4.2.2. PREPROCESAMIENTO . . . . . . . . . . . . . . . . . . . . . . 77
4.2.3. DETECCIN DE RECTNGULOS . . . . . . . . . . . . . . . . 79
4.2.4. SELECCIN Y FILTRADO . . . . . . . . . . . . . . . . . . . . 80
4.3. ANLISIS DE RESULTADOS . . . . . . . . . . . . . . . . . . . . . . . 80
4.4. RECONOCIMIENTO DE CARACTERES

. . . . . . . . . . . . . . . . 83

4.4.1. GOCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.4.2. INTEGRACIN . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
4.4.3. RESULTADOS EXPERIMENTALES . . . . . . . . . . . . . . . 86

5. CONCLUSIONES Y RECOMENDACIONES

88

5.1. CONCLUSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
5.2. RECOMENDACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . 93

CONTENIDO
BIBLIOGRAFA

A. CDIGO FUENTE

VIII

97

101

A.1. ENUMERACIN DE LAS FUNCIONES IMPLEMENTADAS . . . . . . 102


A.1.1. Archivo imgproc.c, imgproc.h . . . . . . . . . . . . . . . . . . . 102
A.1.2. Archivo auxfunc.c, auxfunc.h . . . . . . . . . . . . . . . . . . . 102
A.1.3. Archivo vlpdgeom.c, vlpdgeom.h . . . . . . . . . . . . . . . . . 102
A.1.4. Archivo parseargs.h . . . . . . . . . . . . . . . . . . . . . . . . 103
A.1.5. Archivo main.c . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
A.2. PROGRAMA PRINCIPAL . . . . . . . . . . . . . . . . . . . . . . . . . 104
A.3. FUNCIONES AUXILIARES . . . . . . . . . . . . . . . . . . . . . . . . 107
A.3.1. MANEJO DE ARGUMENTOS DE ENTRADA . . . . . . . . . . 107
A.3.2. DETECCIN DE RECTANGULOS, SELECCIN Y FILTRADO 109
A.3.3. PROCESAMIENTO DE IMAGEN . . . . . . . . . . . . . . . . . 116
A.3.4. FUNCIONES AUXILIARES . . . . . . . . . . . . . . . . . . . . 120
A.4. INTEGRACION OCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

B. MANUAL DE USUARIO

133

C. DIMENSIONES DE LAS PLACAS VEHICULARES

146

D. ALGORITMO DE DETECCIN DE CONTORNOS

148

NDICE DE FIGURAS

1.1. Placa Ecuatoriana para vehculos particulares . . . . . . . . . . . . .

2.1. Ilustracin del proceso de proyeccin. El vector Ph [y] representa la


proyeccin horizontal. Pv [x] la proyeccin vertical . . . . . . . . . . . .

2.2. Fotografa de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3. Proyeccin horizontal de la imagen de la Figura 2.2 . . . . . . . . . .

2.4. Aplicacin del operador de Sobel para la deteccin de bordes verticales 10


2.5. Proyeccin horizontal de la Figura 2.4 . . . . . . . . . . . . . . . . . . 10
2.6. Segmentacin de regiones de inters usando los picos de la proyeccin horizontal de la Figura 2.5 . . . . . . . . . . . . . . . . . . . . . . 11
2.7. Proyeccin vertical de una de las regiones de inters de la Figura 2.6
y firma caracterstica de la placa . . . . . . . . . . . . . . . . . . . . . 11
2.8. Ejemplos de vecindad de los pxeles grises respecto al negro [14]. (a)
4-vecindad, (b) 8-vecindad, (c) 6-vecindad . . . . . . . . . . . . . . . 13
2.9. Imagen de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.10.Marcacin de elementos conectados . . . . . . . . . . . . . . . . . . . 14
2.11.Agrupacin de elementos cercanos . . . . . . . . . . . . . . . . . . . 14
2.12.Imagen Patrn [15] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

IX

NDICE DE FIGURAS

2.13.Imagen de prueba para el mtodo de comparacin [15] . . . . . . . . 15


2.14.Correlacin entre la imagen de las Figuras 2.12 y 2.13. Se ha obscurecido intencionalmente las zonas menos brillantes de la imagen
[15] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.15.Sistema para la deteccin de placa . . . . . . . . . . . . . . . . . . . . 19
2.16.Etapa de preprocesamiento de imagen

. . . . . . . . . . . . . . . . . 19

2.17.(a) Imagen original. (b) Binarizacin sobre el componente de luminancia. (c) Binarizacin sobre el componente azul de la imagen. (d)
Binarizacin sobre el componente rojo de la imagen.(e) Binarizacin
sobre el componente verde . . . . . . . . . . . . . . . . . . . . . . . . 21
2.18.Imagen e histograma correspondiente . . . . . . . . . . . . . . . . . . 23
2.19.Imagen ecualizada e histograma correspondiente

. . . . . . . . . . . 23

2.20.Imagen con poca iluminacin . . . . . . . . . . . . . . . . . . . . . . . 24


2.21.Binarizacin a un nivel de 117 determinado por el mtodo de Otsu de
la imagen de la Figura 2.20 . . . . . . . . . . . . . . . . . . . . . . . . 25
2.22.Binarizacin a un nivel de 64 de la imagen de la Figura 2.20

. . . . . 25

2.23.Etapa de deteccin de rectngulos . . . . . . . . . . . . . . . . . . . . 26


2.24.Imagen de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.25.Binarizacin sobre el componente verde de la imagen de la Figura 2.24 27
2.26.Contornos detectados en la Figura 2.25 . . . . . . . . . . . . . . . . . 27
2.27.Aproximacin poligonal . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.28.Rectngulos encontrados en los contornos de la Figura 2.26 . . . . . 29
2.29.Rectngulos duplicados . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.30.Etapa de Seleccin y Filtrado . . . . . . . . . . . . . . . . . . . . . . . 31

NDICE DE FIGURAS

XI

2.31.Transformacin geomtrica . . . . . . . . . . . . . . . . . . . . . . . . 31
2.32.Placa recortada luego del proceso de transformacin geomtrica. . . 33
2.33.Proyeccin vertical de la Figura 2.32. Ntese la secuencia de picos
que forman la Firma Caracterstica . . . . . . . . . . . . . . . . . . . 33
2.34.Efectos de las operaciones morfolgicas. (a)dilatacin, (b) erosin [27] 34
2.35.Filtrado de la imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.1. Diagrama de flujo general del mtodo de deteccin de placa propuesto. 43
3.2. Procedimiento para aplicar una LUT. . . . . . . . . . . . . . . . . . . . 45
3.3. Procedimiento de ecualizacin . . . . . . . . . . . . . . . . . . . . . . 45
3.4. Variacin de el nmero de placas detectadas de acuerdo al nivel de
umbral usado en las fotografas de prueba. . . . . . . . . . . . . . . . 46
3.5. Diagrama de flujo de la etapa de deteccin de rectngulos . . . . . . 47
3.6. ngulo entre lados adyacentes . . . . . . . . . . . . . . . . . . . . . . 48
3.7. ngulos de los contornos encontrados en las fotografas de prueba . 49
3.8. Relacin entre lados de los contornos de prueba . . . . . . . . . . . . 49
3.9. Eliminacin de duplicados . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.10.Diagrama de flujo de la etapa de seleccin y filtrado . . . . . . . . . . 52
3.11.Rectngulo detectado . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.12.Rectngulo normalizado. La placa de la Figura 3.11 se ha desplazado
a la parte superior izquierda . . . . . . . . . . . . . . . . . . . . . . . . 54
3.13.Proyeccin vertical de una placa tpica . . . . . . . . . . . . . . . . . . 54
3.14.Procedimiento de anlisis de la proyeccin vertical . . . . . . . . . . . 56

NDICE DE FIGURAS

XII

3.15.Promedio de la proyeccin vertical en el conjunto de imgenes de


prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.16.Desviacin estndar de la proyeccin vertical en el conjunto de imgenes de prueba que contienen la placa de identificacin . . . . . . . 58
3.17.Desviacin estndar de la proyeccin vertical en el conjunto de imgenes de prueba que no contienen la placa de identificacin . . . . . 59
3.18.Nmero de picos sobre el lmite superior en las fotografas de prueba

61

3.19.Nmero de valles bajo el limite inferior en las fotografas de prueba . . 63


3.20.Procedimiento de filtrado . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.21.Imagen e histograma correspondiente . . . . . . . . . . . . . . . . . . 64
4.1. Ejemplo de uso de flash en la toma de imagen . . . . . . . . . . . . . 72
4.2. Ejemplo de resultados del mdulo. (a) Deteccin Correcta y (b) Distorsin en el resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.3. Imagen en la que se obtuvo el mayor tiempo de procesamiento . . . . 76
4.4. Imagen en la que se obtuvo el menor tiempo de procesamiento . . . . 77
4.5. Ejemplos de binarizacin (a)correcta (b)incorrecta . . . . . . . . . . . 78
4.6. Fotografa que presento errores en la eliminacin de duplicados . . . 80
4.7. Ejemplo de fotografa en la que fall el anlisis de la proyeccin vertical 81
4.8. Proyeccin vertical para la placa de la Figura 4.7 . . . . . . . . . . . . 81
4.9. Ejemplo de fotografa con poco contraste entre la placa y el vehculo . 82
4.10.Muestra de la base de datos del OCR . . . . . . . . . . . . . . . . . . 86

NDICE DE FIGURAS

XIII

4.11.Ejemplo de imgenes que producen errores en el OCR. Errores de


ambigedad (a) Similitud entre 6 y G, (b) Similitud entre 0 y O. (c)
Errores en la fotografa a reconocer . . . . . . . . . . . . . . . . . . . 87
5.1. Ejemplo de un marco porta-placa . . . . . . . . . . . . . . . . . . . . . 91
5.2. Ejemplo de fuente usada en placas Alemanas

. . . . . . . . . . . . . 92

5.3. Optimizacin del mtodo de deteccin de placa . . . . . . . . . . . . . 94


5.4. Mtodo alterno para la deteccin de placa . . . . . . . . . . . . . . . . 95
5.5. Efecto de la operacin morfolgica apertura con un elemento estructurante horizontal en el mtodo de la Figura 5.4. Ntese las lneas
paralelas que se forman alrededor de los caracteres de la placa . . . 95

NDICE DE CUADROS

2.1. Comparacin de mtodos de deteccin de placa . . . . . . . . . . . . 17


3.1. Caractersticas del hardware usado . . . . . . . . . . . . . . . . . . . 39
3.2. Caractersticas del sistema operativo usado . . . . . . . . . . . . . . . 39
3.3. Caractersticas del compilador y el depurador . . . . . . . . . . . . . . 40
3.4. Libreras y herramientas de procesamiento de imagen.

. . . . . . . . 41

3.5. Puntos para el clculo de la matriz de transformacin . . . . . . . . . 51


3.6. Procedimiento para contar el nmero de picos . . . . . . . . . . . . . 60
3.7. Procedimiento para contar el nmero de valles . . . . . . . . . . . . . 62
3.8. Procedimiento para encontrar automticamente el nivel de umbral . . 65
3.9. Coeficientes para el modelo COCOMO[29] . . . . . . . . . . . . . . . 68
3.10.Resultados de SLOCCOUNT . . . . . . . . . . . . . . . . . . . . . . . 69
4.1. Resultados de la evaluacin . . . . . . . . . . . . . . . . . . . . . . . . 75
4.2. Clasificacin por contraste . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.3. Resultados de la evaluacin del mdulo con fotografas que no cumplen los requisitos descritos en el Captulo 1. . . . . . . . . . . . . . . 76
4.4. Tiempos de Ejecucin . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
XIV

NDICE DE CUADROS

XV

4.5. Resultados de la etapa de preprocesamiento . . . . . . . . . . . . . . 79


4.6. Etapa de preprocesamiento de imagen. Tiempos promedio de ejecucin 79
4.7. Tiempos de procesamiento de la etapa de deteccin de rectngulos . 80
4.8. Tiempos de procesamiento de la etapa de deteccin de rectngulos . 80
4.9. Clasificacin de las etapas segn el porcentaje de falsos negativos . . 82
4.10.Resultados de la integracin con el OCR . . . . . . . . . . . . . . . . 86
4.11.Categorizacin de los errores en el reconocimiento de caracteres. . . 87

RESUMEN

Este trabajo describe un procedimiento que usa la deteccin de contornos y el anlisis de la proyeccin vertical, para extraer el segmento de imagen que contiene la
placa de identificacin vehicular en fotografas de automviles.
Ademas, se realiza implementacin de dicho procedimiento en lenguaje C. Tambin se exponen las estadsticas de desempeo de esta implementacin sobre un
conjunto de imgenes de prueba.
Como parte del proyecto, se prueba el programa desarrollado en conjunto con un
programa de reconocimiento automtico de caracteres, con la finalidad de implementar un sistema de reconocimiento automtico de nmero de matrcula. Se exponen los resultados de dicha integracin.
Finalmente, se exponen las conclusiones y recomendaciones para futuros trabajos
sobre el tema.

XVI

PRESENTACIN

El Reconocimiento Automatico de Nmero de Matrcula es un mtodo de vigilancia


masiva que usa el reconocimiento ptico de carcteres en imgenes con la finalidad
de leer el nmero de placa en vehculos1 .
La aplicacin de este mtodo se realiza mediante sistemas construidos para este
fin, usando combinaciones de hardware y software. Estos han demostrado ser tiles en aplicaciones de monitoreo y control de trfico, vigilancia de estacionamientos, etc; siendo indispensables cuando es necesario vigilar grandes cantidades de
vehculos.
Estos sistemas se componen generalmente de 4 mdulos principales[1]2 , estos son:
toma de la imagen, deteccin de la placa, segmentacin de los caracteres y reconocimiento de caracteres. El primer mdulo comprende el hardware que realiza la
toma de imagen, pudiendo ser una cmara de vdeo, una cmara fotogrfica, u otro
dispositivo similar. Tambin se incluye aqu el software y/o hardware encargado de
preparar la imagen con la finalidad de eliminar ruido u otras imperfecciones que
pudiera tener.
El mdulo de deteccin se encarga de encontrar la placa del vehculo en la imagen
capturada y recortarla de la fotografa. Esta imagen recortada es entonces pasada
al mdulo de segmentacin, el que selecciona y recorta los caracteres para enviarlos individualmente al mdulo de reconocimiento. El resultado de este proceso es
una cadena de caracteres que forman el nmero de identificacin vehicular.
De los cuatro mdulos de los que se compone un sistema de reconocimiento automtico de nmero de matrcula, el encargado de la deteccin de la placa es considerado uno de los mas importantes [2], ya que su desempeo afecta directamente
a los mdulos de segmentacin y reconocimiento de caracteres.
1
2

http://en.wikipedia.org/Automatic_number_plate_recognition
Los nmeros entre corchetes[] hacen referencia a un texto en la bibliografa
XVII

NDICE DE CUADROS

XVIII

Este documento describe un mtodo para la deteccin de placa, que utiliza la deteccin de contornos y el anlisis de la proyeccin vertical para encontrar y recortar
la placa de identificacin vehicular de una imagen. Esto es posible debido a que la
placa, por su construccin es una de las zonas mas brillantes de la imagen, y tiene
una forma rectangular caracterstica.
Tambin se realiza la implementacin de un mdulo de deteccin de placa basado
en el mtodo descrito. Se presentan adems los resultados de la prueba de este
mdulo sobre un conjunto de imgenes de prueba. Como parte de estas pruebas,
tambin se incluye la evaluacin de este mdulo en conjunto con un sistema de
reconocimiento de caracteres.
No se explica aqu toda la teora detrs de los procedimientos de procesamiento
de imagen usados. En general se asume que el lector tiene conocimientos sobre
temas como procesamiento digital de imagen, representacin digital de la imagen,
almacenamiento, filtrado, etc. Informacin detallada referente a estos temas puede
encontrarse en los documentos enumerados en la bibliografa. La mayora de estos documentos se encuentran tambin en formato electrnico en el CDROM que
acompaa a este trabajo.
El resto de este documento se ha estructurado de la siguiente manera:
En el Captulo 1 se describe con detenimiento el problema que se pretende resolver.
Se establecen las condiciones generales y los requerimientos de diseo.
En el Captulo 2 se exponen algunos trabajos realizados anteriormente en esta
rea. Luego se describe el diseo del mtodo elegido para la deteccin de la placa.
En el Captulo 3 se describe la forma en que se realiz la implementacin del mtodo de deteccin de placa. Se realiza un anlisis de costos.
En el Captulo 4 se realiza la evaluacin del desempeo de la implementacin del
mtodo de deteccin de placa. Se presenta un ejemplo de uso en conjunto con un
sistema de reconocimiento de caracteres.
El Captulo 5 contiene conclusiones y recomendaciones para futuros trabajos.

CAPTULO 1
PRELIMINARES

El objetivo de este captulo es establecer los requerimientos generales as como las


restricciones del sistema a disear. Para esto se analizan las caractersticas de las
placas y se delimita el mbito de accin de dicho sistema.

1.1.

PLACAS AUTOMOTRICES

Una caracterstica es una parte significativa, local y detectable de una imagen [3].
Cualquier objeto puede ser descrito usando un conjunto mnimo de caractersticas.
El reconocimiento de objetos puede definirse como un proceso de bsqueda de las
caractersticas de los mismos en la imagen.
Las placas de identificacin poseen un conjunto de caractersticas que las hace
nicas y diferentes del resto de la imagen. En las secciones siguientes se enumeran
stas, con la finalidad de disponer de elementos de donde elegir el conjunto mnimo
necesario para identificar las placas vehiculares con el menor margen de error.
Las caractersticas de las placas varan de acuerdo a la legislacin del pas al que
pertenecen. Placas de diferentes pases tienen diferentes formas y tamaos. En
Ecuador los artculos 104 a 108 del Reglamento a la Ley de Trnsito y Transporte
Terrestre [4] definen las caractersticas para las placas de identificacin que deben
poseer aquellos vehculos que circulan por el pas.

CAPTULO 1. PRELIMINARES
1.1.1.

DIMENSIONES

El Reglamento a la Ley de Trnsito y Transporte Terrestre no es muy especfico


al respecto de las normas de fabricacin de las placas. Este reglamento especifica, en lo referente a las dimensiones, nicamente que tendrn forma rectangular
de 30 cm de ancho y de 15 cm de alto, pero no hay informacin acerca del alto,
ancho, separacin, o fuente tipogrfica de las letras que conforman el nmero de
identificacin.
Debido a esta falta de reglamentacin, se podra suponer que hay una gran disparidad en las fuentes y dimensiones de las letras de las placas, pero a causa de que
el Departamento de Sealizacin de la Polica Nacional es el nico habilitado por la
ley para su fabricacin, esta disparidad en la prctica no existe.
En el Anexo C se muestra el diagrama de una placa con sus dimensiones tpicas.
Este diagrama corresponde a las dimensiones de las placas para vehculos. Ya
que no existe una norma que establezca estas dimensiones, las mismas fueron
tomadas de la matriz para la fabricacin que usa el Departamento de Sealizacin
de la Polica Nacional. Aunque en el reglamento a la ley no se especifica, otras
dimensiones son permitidas para motocicletas.
La Figura 1.1 muestra una placa tpica. La letra D en la parte superior derecha
indica que se trata de un duplicado.

Figura 1.1: Placa Ecuatoriana para vehculos particulares

Hay que destacar que, aunque la ley dice que las dimensiones de las placas vehiculares son 15 cm de alto por 30 cm de ancho, en la prctica las placas tienen
unas dimensiones de 15,4 cm de alto por 30,4 cm de ancho. Esto es debido a que
la nueva matriz para la fabricacin de las placas, trada de Alemania, y que est
actualmente usando el Departamento de Sealizacin de la Polica Nacional, tiene
esas dimensiones.

CAPTULO 1. PRELIMINARES
1.1.2.

COLORES

La coloracin de las placas vara de acuerdo al tipo de servicio que presta el vehculo. Los vehculos particulares tienen placas blancas. Los vehculos de alquiler tienen
placas naranjas. Los vehculos pertenecientes a entidades del estado tienen placas
oro o verde. Los vehculos de servicio Diplomtico, Consular, Asistencia Tcnica y
Organismos Internacionales tienen placas azules. Y los vehculos que se internen
de manera temporal en el territorio ecuatoriano tienen placas rojas. Alrededor de
estas placas hay una lnea negra, y las letras y nmeros de identificacin son de
color negro.
Hay placas de uso de funcionarios del estado, como presidente o vicepresidente de
la repblica, que tienen como fondo la bandera del Ecuador.

1.1.3.

MATERIAL

Las placas son hechas en lamina metlica de aluminio, y recubiertas con papel
reflectivo grado de ingeniera1 , de color acorde al tipo de placa. Las letras estn en
relieve de 2 mm y son cubiertas de negro mate.

1.1.4.

MONTAJE

El reglamento a la Ley de Trnsito y Transporte Terrestre especifica que las placas


deben ubicarse en la parte frontal y posterior del vehculo, en un lugar claramente
visible. No se prohbe el uso de marcos o bordes decorativos. Usualmente las placas
son colocadas en lugares previstos para este fin por los fabricantes del vehculo. Las
placas se ubican de tal forma que quedan alineadas con la calzada, en posicin
horizontal.
1

Papel reflectivo grado de ingeniera es una lmina de material reflectivo, cubierto por resina
protectora. La capa reflectiva consiste de particulas de vidrio y pequeas laminas de metal plateado.
Para que esta lmina sea catalogada como grado de ingeniera, debe cumplir ciertas condiciones
de reflectancia y durabilidad [5].

CAPTULO 1. PRELIMINARES

1.2.

DEFINICIN DEL MDULO A DISEAR

Para identificar el nmero de placa, un sistema de deteccin automtica necesita


extraer de la imagen que est procesando, el rectngulo que encierra la placa del
vehculo. Este procedimiento se llama deteccin de la placa [6]. Esto simplifica las
tareas posteriores de segmentacin y reconocimiento de los caracteres que forman
el nmero de la placa, pues deben trabajar nicamente sobre una fraccin de la
imagen.
El objetivo de este proyecto es precisamente disear un mtodo para realizar esta
deteccin, es decir, construir un mdulo de software que recibiendo como entrada
archivos de imagen de la parte frontal o posterior de un automvil, realice un procedimiento de reconocimiento de formas con el fin de encontrar en la imagen la
placa del vehculo y obtener como resultado una imagen que contenga nicamente
la placa del vehculo.
Entonces el mdulo deber cumplir con las siguientes tareas.
1. Leer la fotografa de un archivo almacenado en el computador.
2. Seleccionar y extraer de esta fotografa la placa del vehculo.
3. Cambiar el tamao de la imagen de la placa obtenida en el procedimiento
anterior a un valor de 50 100 pxeles.
4. Guardar la imagen obtenida en la tarea anterior como un archivo en el computador.

1.3.

RESTRICCIONES

Aunque sera deseable que el mdulo de software a disear no tuviera ningn tipo
de limitacin, consideraciones de orden prctico hacen necesario que se especifiquen algunas restricciones en el mismo.
No es objetivo de este proyecto desarrollar un mdulo que funcione en todas las
posibles situaciones, sino uno que funcione de forma razonable con fotografas que
cumplan con un conjunto de propiedades, las cuales se definen a continuacin.

CAPTULO 1. PRELIMINARES
1.3.1.

FORMATO DE LAS PLACAS

En este proyecto no se consideran las placas de motocicletas ni aquellas que tengan otras dimensiones diferentes a 30 cm15 cm. Tampoco se consideran las placas
especiales de funcionarios del estado ni aquellas que no posean un color slido de
fondo. Esto es as por que mas de un 98 %2 de los autos en circulacin tienen placas
con colores slidos de fondo.
Adems se considera que las placas no estn rodeadas de marcos decorativos, ni
envueltas en cubiertas protectoras que pudieran cubrirlas parcialmente, o disminuir
el contraste que presentan con respecto al resto del vehculo.

1.3.2.

PROCESAMIENTO DE LA IMAGEN

Si bien en este proyecto se realiza una preparacin previa de la imagen con el fin de
mejorar la calidad de la misma, en general se considera que las fotografas fueron
tomadas bajo buenas condiciones de iluminacin y con poco ruido3 . No se hace
investigacin alguna para detectar la placa en fotografas ruidosas, con deficiente
brillo y/o contraste, con poca o con variaciones bruscas en la iluminacin. El formato de compresin de imagen tampoco es tratado, y se supone que la imagen fue
almacenada con una compresin JPG de 5:1 o menor.

1.3.3.

FORMATO DE ENTRADA/SALIDA

El formato de las imgenes de entrada ser el JPG. Si bien es posible incorporar


al mdulo rutinas que permitan trabajar con otros formatos de imagen, se usa el
JPG por que es un formato estndar en una gran cantidad de cmaras digitales. El
formato de salida ser el PNG, debido a que es un formato con licencia de dominio
pblico, fcil de procesar, y que es aceptado por los sistemas de reconocimiento
ptico de caracteres que se probaron en este proyecto.
El tamao de las imgenes de entrada ser de 640x480 pxeles. Este es un tamao de imagen estndar, soportado en una amplia variedad de cmaras. Formatos
2

Datos no oficiales, proporcionados por el Departamento de Sealizacin de la Polica Nacional.


Se refiere a los tipos de ruido mas comunes en fotografa digital, Ruido Fotnico (Photon
Noise), Ruido electrnico On-Chip, Ruido KTC, Ruido Trmico, Ruido de Amplificacin, Ruido de
Cuantizacin[7]. Adems, tambien se refiere a imgenes desenfocadas, o borrosas.
3

CAPTULO 1. PRELIMINARES

de imagen mas grandes permitiran imgenes de mas resolucin4 , pero tambin


aumentaran los recursos necesarios para su procesamiento5 . Formatos mas pequeos no tendran la resolucin necesaria.

1.3.4.

TOMA DE LAS FOTOGRAFAS

El mecanismo con el cual las fotografas son tomadas y transportadas al computador para su procesamiento no es tratado en este proyecto. Tampoco se considera
la ubicacin del dispositivo de toma de imgenes, ni su implementacin. Se supone
que el mecanismo de toma de imagen est a una distancia de entre 40 cm y 2 m
del vehculo, que se encuentra paralelo al camino, que apunta al vehculo de frente
y que esta a una altura entre 0, 6 m y 1, 8 m. Estas consideraciones tienen que ver
con el hecho de que el dispositivo de toma de imgenes se colocar paralelo a la
calzada, y adems se colocar de tal manera que se eviten o disminuyan las distorsiones de perspectiva y esfericidad6 . Se deben evitar las condiciones extremas de
iluminacin, esto es, sin altas luces ni sombras pronunciadas. En general se considera iluminacin natural, entre las 7H00 y 17H00. Estas condiciones hacen a este
mdulo especialmente apto para entradas a estacionamientos, garitas de peajes,
intersecciones de baja velocidad.

Resolucin Espacial describe el grado de detalle presente en la imagen. Usualmente la resolucin se mide como el numero de pares de lineas discernibles por unidad de distancia, por ejemplo
100 pares de lineas por milmetro[8].
5
Se refiere a recursos computacionales, memoria, tiempo de procesamiento, etc.
6
La distorsin esfrica es una alteracin de la imagen producida por defectos de la lente, ocurre
cuando los rayos de luz luego de pasar la lente convergente no concurren en en un solo punto. Se
caracteriza por que las imgenes aparecen abombadas, o con forma esfrica. La distorsin de
perspectiva se produce en la toma de vistas, y ocurre cuando la cmara se inclina de manera que
su distancia vare respecto a la escena. Se caracteriza por que una parte de la escena aparece
anormalmente grande respecto al resto[9].

CAPTULO 2
DESCRIPCIN DEL MDULO

Muchos y variados son los mtodos que existen para la deteccin de placas de identificacin en vehculos. La primera seccin de este captulo se encarga de resumir
brevemente estos trabajos.
La segunda seccin se encarga de exponer las consideraciones de diseo que se
tomaron en cuenta. Estas consideraciones se basan en las caractersticas de las
placas expuestas en el Captulo 1 por lo que se recomienda leerlo.
En la tercera seccin se describe un mtodo para la deteccin de placa basado en
la extraccin de contornos y el anlisis de la proyeccin vertical.

2.1.

TRABAJOS ANTERIORES

En la bibliografa consultada, cuatro mecanismos para la deteccin de placa son los


mas utilizados. En las secciones que siguen se presenta un breve resumen de cada
uno de ellos. No se pretende dar una descripcin detallada de los mismos, sino ser
una referencia hacia material que permita profundizar sobre el tema. Finalmente se
presenta un cuadro con las caractersticas mas notables de cada uno.
Estos mtodos constituyen la base del funcionamiento de un sistema de deteccin
de placa. Un sistema completo puede utilizar varios de estos mtodos trabajando
conjuntamente, adems de secciones encargadas de procesar la imagen con el
objeto de eliminar el posible ruido y acondicionarla para deteccin.

CAPTULO 2. DESCRIPCIN DEL MDULO


2.1.1.

MTODOS BASADOS EN LA PROYECCIN LATERAL DE LA IMAGEN

Una proyeccin se define como la suma de los valores de los pxeles de la imagen
en una sola direccin. De esta manera, para una imagen f [x, y] con n pxeles de
ancho y m pxeles de alto, la proyeccin de la imagen en direccin horizontal se
define como:

Ph [y] =

n
X

f [i, y]

y = 1, 2, 3, ...m

(2.1)

i=1

Ph [y] es un vector que contiene la suma de los valores de pxeles a lo largo de


las filas. La Figura 2.1 ilustra mejor este proceso. De igual manera, una proyeccin
vertical contendr la suma de los valores de pxel a lo largo de las columnas que
componen la imagen, la ecuacin 2.2 define esta proyeccin.

Pv [x] =

m
X

f [x, i]

x = 1, 2, 3, ...n

(2.2)

i=1

La Figura 2.3 muestra el resultado de aplicar la proyeccin horizontal a la imagen


de la Figura 2.2. En este grfico, el eje x representa al nmero de la fila, correspondiendo el nmero 0 a la fila superior de la imagen. El eje y, en cambio, corresponde
a la suma de los valores de pxel de todos los elementos de la fila referida por el eje
x.
f[x,y]

Ph[y]

23

42

21

53

34

42

24

20

17

26

30

43

37

22

Pv[x]

Figura 2.1: Ilustracin del proceso de proyeccin. El vector Ph [y] representa la proyeccin horizontal. Pv [x] la proyeccin vertical

Como puede apreciarse en la Figura 2.3, se forman picos en la zonas de la fotografa que reflejan ms luz, pues en estas se alcanzan los mayores valores de pxel.

CAPTULO 2. DESCRIPCIN DEL MDULO

Figura 2.2: Fotografa de prueba

Estos picos pueden usarse para segmentar la fotografa en regiones con mas probabilidad de contener la placa del vehculo. Las placas, por su construccin, reflejan
mucha luz, y esto permite ubicarlas dentro de uno de los picos de la proyeccin horizontal.

Figura 2.3: Proyeccin horizontal de la imagen de la Figura 2.2

Una solucin ligeramente diferente consiste en resaltar las discontinuidades en el


brillo que ocurren en el interior de las placas de identificacin, debido a los caracteres que forman el nmero de la placa. Esto se consigue usando algn procedimiento
para la deteccin de bordes, (por ejemplo Sobel o Canny [10]). La Figura 2.4 muestra el resultado de aplicar el operador de Sobel para detectar los bordes verticales
de la fotografa de la Figura 2.2. Al realizar la proyeccin horizontal de esta imagen
se obtiene el grfico de la Figura 2.5.

CAPTULO 2. DESCRIPCIN DEL MDULO

10

Figura 2.4: Aplicacin del operador de Sobel para la deteccin de bordes verticales

35000
muestra 1
30000

25000

20000

15000

10000

5000
0

50

100

150

200

250

300

350

400

Figura 2.5: Proyeccin horizontal de la Figura 2.4

450

CAPTULO 2. DESCRIPCIN DEL MDULO

11

Este mtodo de proyeccin que usa la deteccin de bordes aventaja al mtodo que
no la usa en que no produce picos notables en zonas de mucho brillo pero que
no presentan discontinuidades, como faros o parabrisas. Esto reduce el nmero de
picos a analizar.

Figura 2.6: Segmentacin de regiones de inters usando los picos de la proyeccin


horizontal de la Figura 2.5

Luego se recortan las porciones de imagen que producen los picos en la proyeccin
horizontal y se analizan por separado (ver Figura 2.6). Este proceso de anlisis consiste en realizar una proyeccin vertical y revisar el grfico resultante en busca de
una firma caracterstica[11] (Figura 2.7), esto es un conjunto de picos espaciados
a intervalos regulares que son producidos por los caracteres de la placa.

Figura 2.7: Proyeccin vertical de una de las regiones de inters de la Figura 2.6 y
firma caracterstica de la placa

De los documentos consultados, este mtodo es el que mas se utiliza, y es uno

CAPTULO 2. DESCRIPCIN DEL MDULO

12

de los que presenta mejores resultados. No obstante, la implementacin de este


mtodo de deteccin de placa presenta problemas. El principal es definir un procedimiento que analice las proyecciones y encuentre los mximos locales. Este
procedimiento debe encargarse de encontrar un pico y definir una zona alrededor
de ste que contenga a la placa de identificacin. Esto se complica un poco mas
si se considera que esta zona no tiene un tamao constante, pues depende de la
distancia a la que se tom la fotografa.
Aplicaciones de este mtodo a la deteccin de placa se describen en [12] [2], [13].

2.1.2.

MTODOS BASADOS EN EL ANLISIS DE COMPONENTES CONECTADOS

Este mtodo[13] busca las zonas de la imagen que tienen mas probabilidad de
contener la placa, agrupando elementos de la misma que se encuentren conectados de alguna manera. En una imagen, dos pxeles estn conectados si cumplen
determinadas condiciones de valor y cercana1 .
Primero, las condiciones de valor estn dadas por un conjunto de valores que los
pxeles conectados deben compartir. En imgenes en escala de grises, esto significa un rango de valores, mientras en imgenes binarias2 esto significa un nico
valor.
Las condiciones de cercana determinan que tan juntos deben encontrarse dos pxeles que cumplan con las condiciones de valor para que sean considerados como
conectados. Usualmente se definen criterios como pxeles adyacentes 4-vecinos,
8-vecinos 6-vecinos [14] (ver Figura 2.8), aunque de una manera mas amplia, no
es necesario que los pxeles se encuentren adyacentes. Bastara en este caso que
su separacin est dentro de una distancia mnima [11].
La Figura 2.10 muestra el proceso de marcacin de componentes conectados en
la imagen de la Figura 2.9. Luego de marcarse los componentes, son agrupados
1

http://homepages.inf.ed.ac.uk/rbf/HIPR2/label.htm
Una imagen binaria es aquella en la que sus pxeles nicamente pueden tomar uno de dos
valores posibles
2

CAPTULO 2. DESCRIPCIN DEL MDULO

13

(b)

(a)

(c)

Figura 2.8: Ejemplos de vecindad de los pxeles grises respecto al negro [14]. (a) 4vecindad, (b) 8-vecindad, (c) 6-vecindad

Figura 2.9: Imagen de prueba

CAPTULO 2. DESCRIPCIN DEL MDULO

14

aquellos que se encuentren mas cercanos como muestra la Figura 2.11. Estas zonas son extradas de la imagen original como zonas con mas probabilidad de contener la placa. Luego pasan por otros procesos con la finalidad de discriminar entre
estos resultados, aquellos que efectivamente tienen la placa del vehculo.

Figura 2.10: Marcacin de elementos conectados

Procedimientos para la deteccin de placa basados en este mtodo se describen


en [13], [11].

Figura 2.11: Agrupacin de elementos cercanos

2.1.3.

MTODOS DE COMPARACIN

La idea de este mtodo[15] es comparar la imagen a reconocer con un patrn. En


la Figura 2.12 se puede ver un ejemplo de imagen patrn, sta se ha calculado
usando la siguiente frmula[15]:

CAPTULO 2. DESCRIPCIN DEL MDULO

t(i, j) = avg(Pn (i, j))

15

(2.3)

Donde Pn (i, j) corresponden a las imgenes de n placas de las cuales se obtiene


un promedio (avg()) de los valores de pxeles, y t(i, j) es el patrn obtenido.

Figura 2.12: Imagen Patrn [15]

La Figura 2.14 muestra el resultado de comparar este patrn con la imagen de la


Figura 2.13. Esta comparacin se realiza usando la funcin de correlacin dada
por[15]:
n1 m1
X
X
[t(i, j) I(x + i, y + j)]2
(2.4)
corr(x, y) =
i=0 j=0

Donde t(i, j) es la imagen patrn, de orden m n e I(x, y) es la imagen de la que


se desea extraer la placa, de orden M N . Esta comparacin se realiza moviendo
la imagen patrn sobre la imagen del vehculo, hasta recorrerla toda.

Figura 2.13: Imagen de prueba para el mtodo de comparacin [15]

En la imagen de la Figura 2.14, las zonas brillantes aparecen como las que tienen
mayor probabilidad de contener la placa del vehculo. Sistemas de deteccin de
placa basados en este mtodo se describen en [16], [15].

CAPTULO 2. DESCRIPCIN DEL MDULO

16

Figura 2.14: Correlacin entre la imagen de las Figuras 2.12 y 2.13. Se ha obscurecido
intencionalmente las zonas menos brillantes de la imagen [15]

2.1.4. DETECCIN DE FIGURAS GEOMTRICAS


Las placas de vehculos son figuras geomtricas simples, rectngulos especficamente. Los descriptores3 asociados a ellas pueden ser tan simples como los ngulos entre sus lados, o la longitud de sus lados. Se pueden encontrar estas figuras
simples usando mtodos como la transformada de Hough4 [17] para encontrar lineas paralelas en la imagen que pueden encerrar la placa del vehculo.
El procedimiento descrito en [17] es un ejemplo de utilizacin de la transformada de
Houg en la deteccin de placa.
El Cuadro 2.1 muestra una comparacin de los mtodos de deteccin de placa descritos en estas secciones. Para esta comparacin se han tomado en consideracin
los siguientes puntos:

Independencia del punto de observacin. Indica si el mtodo es independiente


de la posicin relativa de la cmara respecto a la escena.
Independencia de la inclinacin. Indica si el mtodo trabaja aun si la placa se
encuentra inclinada con relacin a la cmara.
3

Descriptores de un objeto es un conjunto de valores numricos resultado de la extraccin de


caractersticas del mismo [18].
4
La transformada de Hough es un procedimiento para encontrar lineas en una imagen. Existe
una transformada de Hough generalizada que permite encontrar figuras geomtricas simples.

CAPTULO 2. DESCRIPCIN DEL MDULO

17

Independencia del color. Indica si el mtodo es capaz de detectar placas de diferentes colores.
Independencia del borde de la placa. Indica si el mtodo funciona sin necesitar
que la placa est rodeada de un borde que la destaque.
Mtodo de deteccin

Proyeccin Lateral

SI

Componentes Comparacin Deteccin de


Conectados
figuras geomtricas
Agrupacin
Comparacin Forma de la
de elemen- con un pa- placa
tos similares trn
SI
NO
SI

Caractersticas
en las que se
basa el mtodo
Independencia
del punto de
observacin
Independencia
del color
Independencia
de la inclinacin
Independencia
del borde de la
placa

Cambios bruscos en el brillo

SI

SI

NO

SI

SI

SI

NO

SI

SI

SI

SI

NO

Cuadro 2.1: Comparacin de mtodos de deteccin de placa

2.2.

CONSIDERACIONES

Las caractersticas de las placas vehiculares se explicaron con detalle en el primer


captulo. Con el objeto de simplificar el diseo, se hicieron las siguientes consideraciones respecto a la naturaleza de las placas y la toma de imagen.

1. Las placas tienen un rea rectangular, fcilmente discernible en la carrocera


del vehculo.
2. Las letras que conforman el nmero de placa son claramente visibles.
3. La relacin de alto por ancho de la placa es conocida.
4. El color de fondo de las placas puede ser blanco, naranja, amarillo, azul o
verde.
5. La placa est alineada con los ejes horizontal y vertical de la fotografa.

CAPTULO 2. DESCRIPCIN DEL MDULO

18

6. La fotografa no presenta distorsiones de perspectiva o esfericidad5 .

La primera y segunda condiciones estn relacionadas con las caractersticas de


las placas, tal y como se expresa en la Seccin 1.1. La tercera y cuarta define los
formatos de placas con los que se trabajar, de acuerdo a las restricciones de la
Seccin 1.3.
Las ltimas dos consideraciones estn relacionadas a la toma de imagen. La alineacin de la placa a los ejes de la fotografa se deduce de la ubicacin de la cmara y
la placa, ambas se ubican paralelas al camino.
La distorsin de perspectiva y la distorsin esfrica se evitan con una cuidadosa
ubicacin de la cmara, evitando los ngulos excesivos con respecto al vehculo y
evitando extremos en las distancias al vehculo.
Hay que considerar en este punto la posibilidad de que existan en los alrededores
del dispositivo de toma de imgenes, placas como las de los nombres de las calles,
que podran confundirse con las placas de los vehculos con facilidad. Esto se evita
con una cuidadosa colocacin del dispositivo de toma de imgenes.

2.3.

DESCRIPCIN DEL SISTEMA A IMPLEMENTAR

En este trabajo se elige un enfoque para la deteccin de placa que se basa principalmente en el supuesto que sta es un rectngulo fcilmente distinguible. Esto
permite centrarse en sus atributos mas simples, la forma y la luminosidad.
Estos atributos por si solos no bastan para encontrar la placa en la fotografa. Es
necesario otro criterio que permita distinguir entre los diferentes elementos de la
imagen. Esto es as, por que elementos brillantes y rectangulares, como faros, podran confundirse con placas de identificacin si solamente se consideran estos
atributos.
El criterio adicional es la variacin regular en el brillo que se observa en el interior de
las placas, debido a los caracteres impresos en las mismas. Esta variacin del brillo
permite diferenciar entre elementos de la imagen que son placas de identificacin,
y los que no lo son.
5

Ver Seccin 1.3.4

CAPTULO 2. DESCRIPCIN DEL MDULO

19

La Figura 2.15 muestra un diagrama general del mtodo a implementar para la


deteccin de las placas. En las secciones siguientes se explica cada uno de estos
bloques.

Figura 2.15: Sistema para la deteccin de placa

2.3.1. PREPROCESAMIENTO
El bloque de pre-procesamiento se encarga de adecuar la imagen a los requerimientos de los bloques siguientes. Para esto, ste bloque debe cumplir las siguientes funciones:

1. Separacin de la imagen en sus componentes RGB.


2. Ecualizacin de cada uno de los componentes RGB de la imagen.
3. Binarizacin6 .

Figura 2.16: Etapa de preprocesamiento de imagen


6

El proceso de binarizacin se explica mas adelante, en este captulo.

CAPTULO 2. DESCRIPCIN DEL MDULO

20

Separacin de la imagen en sus componentes RGB


Una forma comn de representar imgenes en color en un computador es usar un
modelo que se conoce como espacio de color RGB. Este modelo supone que los
colores de la imagen se componen de sumas de los colores bsicos rojo, verde y
azul7 . De esta forma cada pxel de la imagen en color tiene asociados tres valores,
cada uno de ellos representar la intensidad de luz roja, verde o azul en ese punto
[14].
Mediante el uso del modelo RGB para representar el color de una imagen, sta
puede descomponerse en tres imgenes en escala de gris, cada una representar
uno de los componentes de color R, G o B. Esto se realiza sencillamente tomando el
valor de cada uno de los componentes del pxel en la imagen en color, como el valor
de pixel de las nuevas imgenes en escala de gris. Por ejemplo, el componente rojo
de los pixeles de la imagen en color, se transforma en los valores de pxeles en la
nueva imagen en escala de gris.
La separacin de la imagen en sus componentes RGB tiene por objeto facilitar
el trabajo de las etapas posteriores. Procesos que se usaran mas adelante en este
captulo, como la ecualizacin, se definen de una forma mas simple sobre imgenes
en escala de grises. Mediante la descomposicin de la imagen en color, se puede
fcilmente extender los procesos definidos en escala de gris a imgenes en color.
Ya que el proceso de deteccin de la placa a implementar utiliza el brillo de la
placa en conjunto con sus atributos de forma para separarla del resto de la imagen,
parecera que la informacin de color que pueda aportar la fotografa es irrelevante.
Sin embargo, pruebas realizadas muestran que la binarizacin8 no produce buenos
resultados con imgenes de las que se ha usado nicamente el componente de
luminancia9 , especialmente en placas de colores diferentes al blanco. En la Figura
2.17 puede verse un ejemplo de binarizacin sobre una fotografa que contiene
placas color naranja. Los mejores resultados se obtienen sobre el canal rojo.
7

Red, Green, Blue, de ah el nombre del modelo RGB.


El proceso de binarizacin se describe mas adelante en este captulo.
9
Otro modelo de color comunmente usado se conoce como modelo YCrCb. Este modelo supone
que cada pxel en la imagen tiene componentes de luminancia (Y) y crominancia (Cb, Cr), es decir
que mantiene separados los valores de brillo de pixel, de los de color.
8

CAPTULO 2. DESCRIPCIN DEL MDULO

21

Figura 2.17: (a) Imagen original. (b) Binarizacin sobre el componente de luminancia.
(c) Binarizacin sobre el componente azul de la imagen. (d) Binarizacin
sobre el componente rojo de la imagen.(e) Binarizacin sobre el componente verde

CAPTULO 2. DESCRIPCIN DEL MDULO

22

Ecualizacin
Las imgenes en escala de gris, obtenidas de la separacion de los componentes
RGB, son ecualizadas para minimizar los efectos de las condiciones externas cambiantes e incrementar el contraste entre la placa y los caracteres de la misma [19].
Para una imagen en escala de gris, como las obtenidas del proceso de separacin
RGB, el histograma representa la distribucin de los valores de pxel en la imagen,
es decir, el eje x representa todos los posibles valores de pxel permitidos, y el eje
y representa la cantidad de pxeles del valor dado por el eje x, presentes en la
imagen.
La ecualizacin del histograma10 , o simplemente ecualizacin, busca balancear la
distribucin de los valores de pxel de una imagen, consiguiendo un histograma distribuido uniformemente en la totalidad de la escala. Esta operacin consigue mostrar detalles de la imagen que estn ocultos en las luces o sombras de la fotografa
[19].
Sea N (u) el nmero de pxeles en la imagen con un valor de intensidad de u, (es
decir el histograma de la imagen). Para N (u) la distribucin acumulada de probabilidad normalizada se define como[20],[21]:
u

2b 1 X
N (i)
C(u) =
n i=0

(2.5)

donde n es el nmero total de pxeles en la imagen, y b es el nmero de bits usados para representar el valor de cada pxel individual. La ecualizacin se construye
usando esta funcin C(u) para reemplazar los valores de cada pxel. As, por ejemplo, un pxel que en la imagen original tiene un valor de pxel de 128, en la imagen
ecualizada tiene un valor de C(128).
La Figura 2.19 muestra el efecto de la ecualizacin sobre la imagen de la Figura
2.18. Bajo cada una de estas imgenes se muestra el histograma correspondiente.
10

En el contexto de procesamiento digital de imagen, usualmente el trmino histograma de la


imagen hace referencia al histograma de distribucin de los valores de pxel de la misma, y es el
significado con el que debe leerse en este trabajo.

CAPTULO 2. DESCRIPCIN DEL MDULO

Figura 2.18: Imagen e histograma correspondiente

Figura 2.19: Imagen ecualizada e histograma correspondiente

23

CAPTULO 2. DESCRIPCIN DEL MDULO

24

Binarizacin
Antes de proceder con el proceso de deteccin de la placa es necesario segmentar
la imagen en regiones de inters. Una de las formas de producir esta segmentacin
es aprovechar que, debido a las propiedades reflectivas de la placa (ver Seccin
1.1), la zona de la placa en la fotografa es una de las mas brillantes en la imagen.
Una manera natural de separar las regiones mas luminosas de las menos luminosas
en una imagen es la binarizacin[22]. Por binarizacin se entiende encontrar una
imagen f (x, y) tal que se cumpla la siguiente condicin:

f (x, y) =

1
0

si
si

g(x, y) T
g(x, y) < T

(2.6)

donde g(x, y) es la imagen original, y T es el nivel de umbral.


El problema con la binarizacin es encontrar el valor adecuado de umbral T que
separe la placa del resto de la imagen. Hay mtodos automticos para la determinacin de este umbral, pero no funcionan bien para todos los casos. La Figura 2.21
muestra un ejemplo en que la binarizacin usando determinacin automtica del
nivel de umbral falla. En este ejemplo el nivel se calcul usando el mtodo descrito
en Otsu [23].

Figura 2.20: Imagen con poca iluminacin

Por esta razn, la determinacin automtica del nivel de umbral no se usa en esta
etapa. En su lugar se eligi un conjunto de nueve valores de umbral, determinados

CAPTULO 2. DESCRIPCIN DEL MDULO

25

Figura 2.21: Binarizacin a un nivel de 117 determinado por el mtodo de Otsu de la


imagen de la Figura 2.20

experimentalmente. Los niveles elegidos, as como el proceso para su eleccin se


explican en el captulo siguiente.

Figura 2.22: Binarizacin a un nivel de 64 de la imagen de la Figura 2.20

Estos niveles se aplican individualmente a la imagen ecualizada, esto produce 9


imgenes binarias para cada uno de las imagenes en escala de gris obtenidas
luego de la separacin de los componentes RGB de la imagen.

2.3.2. DETECCIN DE RECTNGULOS


El proceso de deteccin de rectngulos se encarga de buscar y etiquetar estos
elementos en las imgenes binarias obtenidas en el paso anterior. El diagrama de

CAPTULO 2. DESCRIPCIN DEL MDULO

26

bloques de la Figura 2.23 ilustra este proceso. A continuacin se describen cada


una de las etapas constitutivas.

Figura 2.23: Etapa de deteccin de rectngulos

Deteccin de contornos
En imgenes binarias, el contorno de un objeto se describe como la frontera que
separa dicho objeto del resto de la imagen[24]. Estos contornos son conjuntos de
pxeles conectados 11 4-vecinos u 8-vecinos que rodean al objeto. El proceso de
deteccin de contornos busca estas fronteras en la imagen.
Algoritmos para la deteccin de contornos existen, por lo que no es necesario desarrollar uno para esta aplicacin. El algoritmo usado se describe en el Anexo D.
En la imagen de la Figura 2.26 se han dibujado los contornos encontrados en la
imagen de la Figura 2.25 usando lineas de color verde.

Figura 2.24: Imagen de prueba


11

Ver Seccin 2.1.2

CAPTULO 2. DESCRIPCIN DEL MDULO

Figura 2.25: Binarizacin sobre el componente verde de la imagen de la Figura 2.24

Figura 2.26: Contornos detectados en la Figura 2.25

27

CAPTULO 2. DESCRIPCIN DEL MDULO

28

Aproximacin Poligonal
El objeto de la aproximacin poligonal es capturar la esencia de la forma contenida
en los contornos obtenidos en el proceso anterior, con el menor nmero de puntos
posibles. En esta etapa, cada uno de los contornos extrados por el proceso anterior
es aproximado a un polgono.
P3

P2
d
P4

P1
Curva Original
Primera Aproximacion

Segunda Aproximacion
Tercera Aproximacion

Figura 2.27: Aproximacin poligonal

Uno de los mtodos de aproximacin poligonal es el algoritmo de Douglas-Peuker


[42], el que funciona escogiendo dos puntos en la imagen original, por ejemplo
P1 y P2, (ver Figura 2.27) Estos puntos son unidos por una lnea, la cual sera la
primera aproximacin a la curva. La exactitud con que esta lnea se aproxima a la
curva es determinada calculando la distancia d entre todos los puntos de la curva
y la lnea. Si todas estas distancias son menores que una tolerancia entonces la
aproximacin es buena, y el proceso concluye. Si no, el punto que se encuentre mas
alejado de la lnea es escogido como nuevo vrtice, dividiendo a la lnea anterior
en dos segmentos. El proceso se repite, hasta que la aproximacin es menor que
la tolerancia.

Seleccin de candidatos
Los polgonos deben ser revisados para separar los rectngulos, que sern los
candidatos a placa a considerar en las etapas posteriores. En esta revisin se usan
cuatro criterios:

1. El rea del polgono est comprendida entre 450 y 50000 pixeles[15].


2. El ngulo entre lados adyacentes es de 90 .
3. El polgono tiene 4 lados.
4. La relacin entre el lado mas largo y el mas corto es de 2 a 1.

CAPTULO 2. DESCRIPCIN DEL MDULO

29

El primer criterio resulta de considerar que las fotografas sern tomadas en un


rango de distancias tal, que los tamaos aparentes de las placas en las imgenes
estn comprendidos entre los limites de 450 y 50000 pixeles 12 . De cualquier manera
una placa con un rea mas pequea que 450 en la imagen, contendra caracteres
difcilmente reconocibles.
El segundo criterio de discriminacin es el que define a un rectngulo. Si en un
polgono, todos sus ngulos internos miden 90 , entonces se trata de un rectngulo
o un cuadrado. Sin embargo, imperfecciones en la toma de la imagen, producen

Figura 2.28: Rectngulos encontrados en los contornos de la Figura 2.26

fotografas en las que los ngulos de las placas no son exactamente de 90 , principalmente debidos a la perspectiva. Sin embargo es razonable suponer que estos
valores se ubican en las cercanas de 90 .
El tercer criterio asegura que sean seleccionados nicamente rectngulos o cuadrados.
El cuarto criterio es la relacin entre lados de la placa, la cual, para placas de
la Repblica del Ecuador es de 2 : 1. Aqu tambin, al igual que con el segundo
criterio, las imperfecciones en la imagen hacen que la relacin aparente de los lados
se ubiquen en las cercanas de este valor.
12
Si se considera que el rea total de la imagen es de 640 480 = 307200pixeles los lmites de 450
y 50000pixeles corresponden aproximadamente a 1/500 y 1/6 de la imagen original, respectivamente

CAPTULO 2. DESCRIPCIN DEL MDULO

30

Eliminacin de duplicados
El proceso anterior de deteccin de rectngulos se realiza sobre veinte y siete imgenes diferentes (se realizan binarizaciones a nueve diferentes niveles de umbral,
sobre cada una de las imagenes en escala de gris ecualizadas, correspondientes a
cada uno de los componentes RGB de la imagen original), las que contienen casi
la misma informacin. Por esta razn, al final de la etapa anterior se obtiene muchos rectngulos que encierran la misma rea, en consecuencia se hace necesario
eliminar los rectngulos duplicados.
(x2,y2)
(x2,y2)

(x4,y4)

(x1,y1)
y

(x4,y4)

(x3,y3)
(x3,y3)

(x1,y1)
x

Figura 2.29: Rectngulos duplicados

Para esto, los rectngulos obtenidos en el paso anterior son comparados entre ellos.
Si dos rectngulos se intersecan en mas del 30 %, se considera que encierran la
misma rea, y en consecuencia uno de los dos es eliminado.
Saber si dos rectngulos se intersecan es sencillo si se conocen sus coordenadas. Como consta en la Figura 2.29, dos rectngulos se intersecan si se cumple la
siguiente condicin:
x < lx y < ly
(2.7)
Donde:

lx =

|x3 x1|
|x3 x1 |

ly =

|y2 y1|
|y2 y1 |

si
si

|x3 x1| |x3 x1 |


|x3 x1| < |x3 x1 |

(2.8)

|y2 y1| |y2 y1 |


|y2 y1| < |y2 y1 |

(2.9)

si
si

CAPTULO 2. DESCRIPCIN DEL MDULO


2.3.3.

31

SELECCIN Y FILTRADO

En esta etapa, las porciones de la fotografa encerradas en los rectngulos encontrados por los procesos anteriores, se recortan. Estas partes de la imagen original
son analizadas para determinar si son una placa de identificacin.
Pero antes de proceder a este anlisis, estas porciones de la fotografa pasan por
una transformacin geomtrica con la finalidad de eliminar la inclinacin y los defectos en la perspectiva que pudiera tener.
Finalmente, las secciones de la fotografa identificadas como placas, pasan por un
proceso de filtrado con el objetivo de obtener una imagen lo mas limpia posible para
el reconocimiento de carcteres.
El diagrama de bloques correspondiente a esta etapa se muestra en la Figura 2.30.

Figura 2.30: Etapa de Seleccin y Filtrado

Transformacin Geomtrica
Esta etapa recorta de la fotografa las zonas rodeadas por los rectngulos obtenidos
en pasos anteriores. Estas partes de la fotografa son transformadas en otras con
unas dimensiones de 100 pxeles de ancho por 50 pxeles de alto.
P3

P4

P3

P4

50px
P1
P2
P1

P2
100px

Figura 2.31: Transformacin geomtrica

Como se muestra en la Figura 2.31, esta etapa mapea los puntos de la imagen
delimitada por P 1,P 2,P 3 y P 4 (la imagen recortada por el paso anterior) a un nuevo
espacio delimitado por P 1 ,P 2 ,P 3 yP 4 .

CAPTULO 2. DESCRIPCIN DEL MDULO

32

Las coordenadas x , y de la nueva imagen pueden calcularse en funcin de las


coordenadas x, y usando las siguientes ecuaciones [14]:

x = c1 x + c2 y + c3 xy + c4

(2.10)

y = c5 y + c6 y + c7 xy + c8

(2.11)

Los valores de c1 ,c2 ,. . . c8 pueden calcularse reemplazando los valores de x, y y


x , y con los valores de los puntos P 1,. . . P 4 y P 1 ,. . . ,P 4 respectivamente, en el
siguiente sistema de ecuaciones:

x1
y1
x2
y2
x3
y3
x4
y4

x1
0
x2
0
x3
0
x4
0

y1
0
y2
0
y3
0
y4
0

x1 y1
0
x2 y2
0
x3 y3
0
x4 y4
0

1
0
1
0
1
0
1
0

0
x1
0
x2
0
x3
0
x4

0
y1
0
y2
0
y3
0
y4

0
x1 y1
0
x2 y2
0
x3 y3
0
x4 y4

0
1
0
1
0
1
0
1

c1
c2
c3
c4
c5
c6
c7
c8

(2.12)

Este sistema sirve tambin para calcular los valores x , y para todos los puntos de
la imagen, usando los valores de c1 . . . c8 calculados anteriormente.

Seleccin de placa
La seleccin de placa se encarga de seleccionar entre los rectngulos obtenidos
anteriormente, nicamente aquellos que tienen caractersticas propias de las placas
de vehculos.

CAPTULO 2. DESCRIPCIN DEL MDULO

33

Figura 2.32: Placa recortada luego del proceso de transformacin geomtrica.

Para la seleccin de la placa se busca en las imagenes obtenidas en el paso anterior


la firma caracterstica13 , esto es una secuencia de picos espaciados regularmente
en la proyeccin vertical14 (ver Figura 2.33).
9000

pdr90.txt

8000
7000
6000
5000
4000
3000
2000
1000
0

20

40

60

80

100

Figura 2.33: Proyeccin vertical de la Figura 2.32. Ntese la secuencia de picos que
forman la Firma Caracterstica

Filtrado
Los segmentos de imagen que aprueben el anlisis de proyeccin vertical de la
seccin anterior pasan por un proceso de filtrado, el cual tiene por objeto eliminar
las irregularidades, que pudieran interferir en el reconocimiento de caracteres. Para
este propsito se han usado filtros morfolgicos, como los descritos en [25].
La morfologa matemtica conceptualiza a la imagen como un conjunto de puntos,
y a las transformaciones sobre la imagen como operaciones entre conjuntos [26].
Entre estas operaciones, se definen dos como fundamentales: la erosin y la dilatacin.
13
14

Ver Seccin 2.1.1


El problema de encontrar la firma caracteristica se tratara con mas detalle en el captulo siguiente

CAPTULO 2. DESCRIPCIN DEL MDULO

34

Sea X una imagen binaria definida como un subconjunto de puntos en R2 . Sea B


un conjunto arbitrario de puntos en R2 , al que se llamar elemento estructurante. El
conjunto transpuesto de B es:
= {b|b B}
B

(2.13)

se obtiene rotando B 180 alrededor del origen O, este punto O es llamado el


B
centro del elemento estructurante. Bx , es la traslacin de B por x y se define como:
Bx = {b + x|b B}

(2.14)

Usando las ecuaciones 2.13 y 2.14 se puede definir la dilatacin del conjunto X por
el elemento estructurante B, como el conjunto de puntos x R2 tal que la traslacin
de B por x (Bx ) tiene una interseccin no vaca con el conjunto X [27]:
B (X) = {x R2 |X Bx 6= }

(2.15)

La erosin de X por el elemento estructurante B es el conjunto de puntos x R tal


que la traslacin de B por X est incluida en X [27]:
B (X) = {x R|Bx X}

(2.16)

Figura 2.34: Efectos de las operaciones morfolgicas. (a)dilatacin, (b) erosin [27]

El efecto de estas operaciones sobre la imagen pueden apreciarse en la Figura


2.34, en ambos casos la linea negra delimita la imagen resultante. Puede verse

CAPTULO 2. DESCRIPCIN DEL MDULO

35

como la erosin encoje el borde del objeto, mientras la dilatacin lo expande. Considerando esto, se uso una combinacin de erosin-dilatacin. La erosin elimina
los elementos de la imagen mas pequeos que el elemento estructurante, lo que
afecta poco a los caracteres que conforman el nmero de placa, pues estos son
mayores que el elemento estructurante usado. La dilatacin refuerza los elementos
de la imagen que no fueron eliminados por la erosin. En ambos casos, el elemento
estructurante usado debe ser mayor que los elementos de la imagen a eliminar, pero
menor que los elementos que se conservaran. La Figura 2.35 muestra un ejemplo
del resultado de este procedimiento. Puede verse claramente que se han eliminado
los caracteres de la palabra ECUADOR, quedando nicamente los caracteres que
forman el nmero de identificacin, y vestigios de los tornillos que aseguran la placa
al vehculo.

Figura 2.35: Filtrado de la imagen

Luego de esto, las imgenes de las placas obtenidas son guardadas en un archivo.

2.3.4.

INTERFAZ DE USUARIO

Para este proyecto se eligi una interfaz de lnea de comandos. Dadas las caractersticas de la aplicacin, la cual realizar una nica tarea, no es necesario complicarse con una interfaz grfica.
Es necesario observar los resultados intermedios, por lo que la interfaz de linea de
comandos debe presentar una opcin que los muestre en pantalla.
Tambin, para permitir la experimentacin, se necesita que mediante la lnea de
comandos se puedan ajustar algunos parmetros que necesita el mdulo para funcionar. El detalle de todas los parmetros que acepta el mdulo se encuentra en el
manual de usuario, en el Anexo B.

CAPTULO 2. DESCRIPCIN DEL MDULO

36

Adicionalmente, la CLI15 presenta la ventaja de permitir la ejecucin de la aplicacin


desde scripts de shell16 . Esto permite una interfaz simple con otras aplicaciones, y
en este caso, con aplicaciones de reconocimiento de caracteres.

15
16

Command Line Interface, Interfaz de linea de comandos.


La plataforma de ejecucin considerada es del tipo UNIX.

CAPTULO 3
IMPLEMENTACIN

El objetivo de esta implementacin es disponer de un banco de pruebas para medir


el desempeo del mtodo para la deteccin de placa descrito en el Captulo anterior,
y determinar los valores de los parmetros que necesita.
La implementacin prctica del mtodo se realiz escogiendo la sencillez antes que
la eficiencia, con la finalidad de obtener un cdigo fcil de leer y depurar.
Para mantener la modularidad, y facilitar la depuracin, el cdigo se separ en
8 archivos y 22 funciones, manteniendo separadas la definicin de las funciones
de la implementacin de las mismas. La descripcin de cada funcin as como la
explicacin de los argumentos que esperan de entrada, y los valores devueltos se
encuentra en el cdigo fuente, en el Anexo A.
En esta seccin se explican las caractersticas de la implementacin del mtodo
para la deteccin de placa. Se exponen los diagramas de flujo de cada etapa con la
finalidad de facilitar la lectura del cdigo fuente.
Tambin se explican aqu los valores de los parmetros que se necesitan. Estos
parmetros son constantes numricas, como los valores de umbral usados en la
etapa de binarizacin, que fueron establecidas experimentalmente.
Durante la implementacin, fue necesario contar con un conjunto de imgenes vehiculares con la finalidad de hacer la depuracin de cada etapa, y adems determinar
los valores de las constantes antes mencionadas. Para estos fines, se recolect un

37

CAPTULO 3. IMPLEMENTACIN

38

conjunto de 100 imgenes1 , bajo las mejores condiciones posibles2 , poniendo especial cuidado en que en estas imgenes el detector de contornos siempre encuentre
un contorno alrededor de la placa. Este es el conjunto de fotografas al que se hace
referencia mas adelante, en este captulo.

3.1.

PLATAFORMA DE DESARROLLO

En este proyecto, plataforma de desarrollo se denomina al conjunto de los siguientes elementos:

Plataforma de hardware
Sistema Operativo
Libreras
Compilador y Depurador

Las siguientes secciones enumeran las caractersticas de la plataforma de desarrollo usada en este proyecto. Informacin detallada respecto a la configuracin de
una plataforma de desarrollo como la usada aqu, se encuentra disponible en el
libro The Linux Development Platform [28], listado en la bibliografa.

3.1.1. PLATAFORMA DE HARDWARE


Esta es la parte tangible del sistema de desarrollo. Comprende la eleccin de hardware. Para este proyecto se eligi la plataforma PC, debido a consideraciones de
tipo econmico, adems de familiaridad con esta plataforma de hardware. Las caractersticas mas relevantes se enumeran en el Cuadro 3.1.
1

Este conjunto de imgenes se encuentra en el CD que se entrega con este trabajo.


Para una definicin mas precisa de lo que se entiende como las mejores condiciones posibles
vase el Captulo siguiente.
2

CAPTULO 3. IMPLEMENTACIN
Procesador:
Memoria RAM:
Tarjeta Grfica:

39

Intel Pentium 3, 900MHz


384MB
ATI Mach 64 RAGE Mobility AGP

Cuadro 3.1: Caractersticas del hardware usado

3.1.2.

SISTEMA OPERATIVO

El sistema operativo elegido es Linux, concretamente la distribucin Ubuntu 6.06.


Linux est disponible libremente, es un sistema operativo estable, en el cual vienen
incluidas todas las herramientas necesarias para el desarrollo de aplicaciones, esto
sin un costo econmico adicional.
El Cuadro 3.2 resume las caractersticas del sistema operativo usado.
Sistema Operativo:
Versin del Kernel:

Ubuntu 6.06.1 LTS


2.6.15-26-386

Cuadro 3.2: Caractersticas del sistema operativo usado

3.1.3. COMPILADOR Y DEPURADOR


El compilador es la herramienta central para el desarrollo de aplicaciones, debido
a que convierte el cdigo fuente a su forma ejecutable. Existe una amplia variedad
de compiladores disponibles para Linux, sin embargo uno de los mas conocidos es
GCC.
La coleccin de compiladores GNU, comnmente conocida como GCC, es un conjunto de compiladores para una amplia variedad de lenguajes entre los que se incluyen los siguientes:

C
C++
Java
Fortran

CAPTULO 3. IMPLEMENTACIN

40

El propsito del depurador es permitir al programador ver que es lo que esta sucediendo dentro [28] de un programa, lo cual es til para determinar las causas de
los errores que ste pudiera presentar.
Para este proyecto se eligi el depurador GNU Debugger o GDB, por ser el de uso
mas comn en Linux.
El Cuadro 3.3 enumera las caractersticas del compilador y del depurador usados
en este proyecto.
Compilador:
Versin del compilador:
Depurador:
Versin del depurador:

GNU Compiler Collection


4.0.3 (Ubuntu 4.0.3-1ubuntu5)
GNU Debugger
GNU gdb 6.3-debian

Cuadro 3.3: Caractersticas del compilador y el depurador

3.1.4.

LIBRERAS

Existen en la actualidad muchas libreras para el anlisis de imagen por computadora. El Cuadro 3.4 presenta un resumen de las que fueron consideradas. Para
la evaluacin de estas libreras se tom en cuenta la disponibilidad de las tcnicas de proceso de imagen necesarias para implementar este proyecto. Tambin se
consideraron otros factores como la disponibilidad de documentacin y el tipo de
licencia permitida. Por comodidad los tipos de licencia se clasificaron en licencia
comercial y licencia libre. El tipo de licencia comercial exige el pago de dinero por
el uso comercial y en ocasiones por el uso no comercial del producto, adems de
que algunas de las libreras amparadas por esta licencia no se proporcionan con el
cdigo fuente. El tipo de licencia libre, en cambio no exige el pago por el uso de la
librera, adems de poner a disposicin el cdigo fuente de la misma, y permitir al
usuario distribuir libremente los trabajos que realice usando la librera.

3.1.5.

OPENCV

OpenCV[14] es un conjunto de libreras para el procesamiento de imagen y visin


por computadora desarrollado por Intel para los procesadores de la arquitectura IA32. Liberada bajo licencia libre en el ao 2000, desde entonces se ha mantenido en
constante desarrollo.

CAPTULO 3. IMPLEMENTACIN
Caractersticas
Deteccin de
Contornos
Aproximacin
Poligonal
Binarizacin
Morfologa
Transformacin
Geomtrica
Licencia
Documentacin
y Usabilidad

41

Intel IPL
Si

OpenCV
Si

Gandalf
No

Matlab
Si

Octave
No

Si

Si

No

Si

Si

Si
Si
Si

Si
Si
Si

Si
No
Si

Si
Si
Si

Si
Si
Si

Comercial
Amplia, Ok

Libre
Amplia, Ok

Libre
Amplia, Ok

Comercial
Amplia,Ok

Libre
Amplia, Ok

Cuadro 3.4: Libreras y herramientas de procesamiento de imagen.

Actualmente OpenCV es una de las ms completas libreras de procesamiento de


imagen y visin por computadora que existen. Esta escrita en C, y funciona en
plataformas Windows y Linux, adems de estar optimizada para usar la familia de
procesadores IA-32 de Intel.
En el campo que interesa, OpenCV ofrece manejo de diferentes formatos reconocidos de imagen. Algoritmos de deteccin de bordes, extraccin de contornos, aproximacin poligonal, lgebra lineal, convoluciones, operaciones morfolgicas, clculo
de histograma, etc.
En realidad OpenCV es un compendio de libreras que contiene:
CV: Algoritmos de visin artificial.
CVAUX: Funciones auxiliares.
CXCORE: lgebra lineal, representacin digital de imagen, tipos bsicos.
HighGUI: Interfaz de usuario, soporte para imagen y vdeo.
Existe documentacin extensa en la pgina Web del proyecto en:

http://www.sourceforge.net/projects/opencvlibrary
Adems de foros de discusin en:

CAPTULO 3. IMPLEMENTACIN

42

http://groups.yahoo.com/group/OpenCV/
Con excepcin de las funciones definidas en el archivo imgproc.h e implementadas
en el archivo imgproc.c3 , las funciones y estructuras que empiezan con el prefijo
cv o Cv en el cdigo fuente, pertenecen a la librera OpenCV.

3.2.

IMPLEMENTACIN DEL SISTEMA

Debido a la naturaleza secuencial del mtodo expuesto en el captulo anterior, adems de que las libreras elegidas estn escritas en C, se hace natural la eleccin
de este lenguaje para la programacin.
El diagrama de la Figura 3.1 muestra la implementacin total del mtodo. Como
puede verse, la etapa de preprocesamiento de imagen se ha expandido en dos
lazos anidados, esto permite que la etapa de deteccin de rectngulos trabaje sobre
una imagen binaria por vez. Los lazos exploran cada uno de los niveles de umbral
sobre cada canal de color. En total existen 9 niveles de umbral y 3 canales de color.
OpenCV implementa la mayora de los algoritmos de procesamiento de imagen,
por lo que no es necesario profundizar en ellos. Sin embargo, hay procedimientos que no estn implementados en OpenCV, los cuales son explicados con mas
detenimiento en las secciones siguientes.
Se recomienda mirar el cdigo fuente correspondiente a cada etapa. Ah se definen
las funciones usadas as como los parmetros de entrada y salida de cada una.

3.2.1. ETAPA DE PRE-PROCESAMIENTO DE IMAGEN


El preprocesamiento de imagen comprende tres secciones, estas son: separacin
RGB, Ecualizacin y Binarizacin. De acuerdo a la Figura 3.1, estas secciones estn distribuidas en dos lazos.
Por las caractersticas de la etapa planteadas en el captulo anterior, esta debe producir nueve imgenes binarias por canal de color, dando un total de 27 imgenes,
3

Ver cdigo fuente en el anexo A

CAPTULO 3. IMPLEMENTACIN

Figura 3.1: Diagrama de flujo general del mtodo de deteccin de placa propuesto.

43

CAPTULO 3. IMPLEMENTACIN

44

lo cual requiere que al menos haya aproximadamente 8 MB de memoria disponibles


para su almacenamiento4 . La distribucin de las secciones entre los lazos permite
disminuir esta cantidad de memoria usada para almacenar resultados intermedios,
ya que solo se trabaja con una imagen a la vez. Adems esto tambin facilita el
trabajo de las secciones siguientes al tener que procesar imgenes individuales, en
lugar de las 27 previstas.

Separacin en los componentes RGB


Funciones definidas en OpenCV se encargan de leer la imagen del disco y almacenarla en la memoria. Una vez ah, la imagen en color es representada usando tres
bytes por pxel, siendo un byte para el componente rojo, uno para el verde, y uno
para el azul.
La separacin en los componentes RGB se realiza simplemente copiando los bytes
correspondientes a un componentede color a un nuevo espacio de memoria. Este
espacio representa una imagen en escala de gris, donde cada pxel es representado
usando un byte, lo que permite 256 niveles de gris.

Ecualizacin
El procedimiento usual para implementar la ecualizacin es a travs de una tabla de
sustitucin o LUT5 . Una LUT es un procedimiento usual en la manipulacin digital
de imgenes que consiste en reemplazar el valor de un pxel por su valor correspondiente en una tabla [21]. Por ejemplo, como se ve en la Figura 3.2, un pxel con
el valor de 2, es reemplazado por el contenido de la ubicacin 2 de la LUT, un pxel con el valor de 4 es reemplazado por el ubicado en la posicin 4, y as hasta
terminar con todos los pxeles de la imagen.
OpenCV proporciona medios para representar y aplicar la LUT en la imagen. Esto
simplifica el procedimiento de implementar la ecualizacin al reducirlo a un problema de llenar una LUT.
4

Cada pxel de la imagen binaria es representado por 1 byte. Las imgenes para este proyecto
constan de 640 480 pxeles, lo que significa que debe haber al menos 307200 bytes por imagen,
como son 27 imgenes esto representa un total de 8294400 bytes, sin considerar los encabezados
que usa OpenCV para representar la imagen
5
LUT: Look Up Table

CAPTULO 3. IMPLEMENTACIN

45
0

Figura 3.2: Procedimiento para aplicar una LUT.

Figura 3.3: Procedimiento de ecualizacin

La LUT es llenada usando la distribucin de probabilidad acumulada descrita en la


Seccin 2.3.1.La Figura 3.3 ilustra todo este procedimiento.

Binarizacin
Para determinar los niveles de umbral necesarios para la binarizacin, se us el
conjunto de cien fotografas de prueba6 definidas al principio de este captulo. Estas fueron binarizadas a todos los niveles de umbral posibles. Debido a la representacin de las imgenes en escala de gris usada, la cual usa ocho bits por pxel,
existen nicamente 256 niveles de umbral. Una imagen se consider binarizada
correctamente si el detector de rectngulos de la etapa siguiente encontraba un
rectngulo que rodeara la placa del vehculo. La Figura 3.4 muestra los resultados.
Puede verse que la mayora de fotografas produjeron rectngulos que encerraban
la placa al ser binarizadas con valores de umbral cercanos a 150. Sin embargo,
fotografas con escasa iluminacin se binarizan mejor con niveles de umbral bajos,
mientras que fotografas luminosas se binarizan mejor con niveles de umbral altos,
esto a pesar de que la ecualizacin mejora considerablemente estas imgenes.
Con el propsito de permitir al mdulo trabajar mejor con fotografas tomadas en
diversas condiciones de iluminacin, se eligieron nueve niveles de umbral. Estos
6

Las fotografas de prueba usadas aqu se encuentran en el CD que acompaa a este trabajo.

CAPTULO 3. IMPLEMENTACIN

46

60

50

40

Nmero
de
Fotografas

30

20

10

umbral

0
50
100
150
200
250

300

Nivel de umbral

Figura 3.4: Variacin de el nmero de placas detectadas de acuerdo al nivel de umbral


usado en las fotografas de prueba.

niveles son: 68, 75, 110, 135, 143, 157, 175, 190, 209 y se eligieron de manera
que se distribuyeran entre todos los niveles de umbral posibles, escogiendo los
puntos en donde se consiguen la mayor cantidad de placas detectadas, esto es los
mximos locales, en la Figura 3.4.

3.2.2.

ETAPA DE DETECCIN DE RECTNGULOS

La Figura 3.5 muestra el diagrama de flujo de esta etapa. Funciones definidas en


la librera (OpenCV) se encargan de la deteccin de contornos y la aproximacin
poligonal. Para la seleccin de candidatos, cada polgono obtenido es revisado individualmente, en busca de aquellos que cumplan las condiciones establecidas de
nmero de lados, rea, relacin entre lados adyacentes y ngulo. El orden en el que
se realizan estas comprobaciones se eligi buscando minimizar el tiempo de ejecucin. Es por esto que las comprobaciones mas simples7 son realizadas primero.
Para la aproximacin poligonal es necesario determinar el valor de la tolerancia de
la aproximacin, esto es el valor de . Se us el valor recomendado en la librera
de 0,025 perimetro del contorno, obtenindose buenos resultados. Cada polgono
obtenido es representado como un vector de puntos, que contiene las coordenadas
rectangulares de los vrtices de dicho polgono.
7

Es decir, las operaciones que requieren menor tiempo de procesamiento.

CAPTULO 3. IMPLEMENTACIN

Figura 3.5: Diagrama de flujo de la etapa de deteccin de rectngulos

47

CAPTULO 3. IMPLEMENTACIN

48

Seleccin de candidatos
El ngulo entre dos lados adyacentes se obtiene utilizando la siguiente frmula:
c2 = a2 + b2 2ab cos()

(3.1)

Los valores de a, b y c se indican en la Figura 3.6.

Figura 3.6: ngulo entre lados adyacentes

Debido a imperfecciones en la imagen, los ngulos del rectngulo que rodea la


placa no son exactamente de 90 . Por esto un intervalo de valores es elegido. Esto
significa que un candidato a placa aprueba este criterio si y solo si al menos uno de
sus ngulos cae dentro de este intervalo de valores.
Para determinar los lmites de este intervalo, el programa se ejecut con las fotografas de prueba. Luego, de entre los contornos detectados se escogieron manualmente aquellos que despus de la aproximacin poligonal se transformaran en
polgonos que fueran cuadrilteros similares a la placa de un vehculo. Se midi el
ngulo de estos cuadrilteros. El resultado de esta medicin se muestra en la Figura 3.7. Como se observa en la grfica, la mayora de estos cuadrilteros similares
al de una placa de identificacin contienen al menos un par de lados cuyo ngulo
esta comprendido entre 81,4 y 98,6 (0 | cos()| 0,15), sin embargo, para dejar
cierto margen se fijaron los lmites entre 72,5 y 107,5 (0 | cos()| 0,3).
Con respecto a la relacin entre lados ocurre algo similar. La Figura 3.8 muestra la
relacin entre el lado mas ancho y el mas angosto en los cuadrilteros que se describieron en el prrafo anterior. Aunque la mayora de estos cuadrilteros presentan
una relacin entre lados que se ubica entre 1,8 y 2,4, se eligi un intervalo entre 1,3
y 2,7, esto para permitir que placas en imgenes con defectos de perspectiva sean
reconocidas.

CAPTULO 3. IMPLEMENTACIN

49

0.35

coseno del ngulo

0.3
0.25
0.2
|cos()|
0.15
0.1
0.05
0
0

500

1000

1500

2000

2500

Nombre de la muestra

Figura 3.7: ngulos de los contornos encontrados en las fotografas de prueba

3
Relacin

2.8
2.6
2.4
2.2
Relacin
entre
lados

2
1.8
1.6
1.4
1.2
1
0

500

1000

1500

2000

Nombre de la muestra

Figura 3.8: Relacin entre lados de los contornos de prueba

2500

CAPTULO 3. IMPLEMENTACIN

50

Eliminacin de duplicados
Los rectngulos duplicados se encuentran comparando todas las combinaciones de
rectngulos detectados posibles. Para este propsito, los rectngulos detectados
son colocados en una pila. El procedimiento consiste en tomar el primer rectngulo
de la pila y compararlo con el segundo. Si los rectngulos se intersecan, el segundo
rectngulo es eliminado, si no, el segundo rectngulo es colocado al final de la pila.
Luego se compara el tercero con el primero y as sucesivamente hasta que todos
los rectngulos restantes en la pila han sido evaluados. Esto se ilustra mejor en el
diagrama de la Figura 3.9.

3.2.3.

ETAPA DE SELECCIN Y FILTRADO

El diagrama de la Figura 3.10 muestra el flujo general de la etapa. En esta se recortan los segmentos de la imagen encerrados por los rectngulos que quedan
luego de la eliminacin de duplicados. Un lazo se encarga de tomar los rectngulos
individualmente. Estos son analizados en busca de la secuencia de picos en la proyeccin vertical que es caracterstica de la placa de identificacin. Finalmente los
segmentos de imagen que aprueben este anlisis pasan por un proceso de filtrado,
para luego guardarse en un archivo.

Transformacin Geomtrica
Cada rectngulo est representado por un arreglo de cuatro puntos que corresponden a sus vrtices. Estos deben ordenarse de forma que el primer elemento
del arreglo sea el vrtice ubicado en la esquina inferior izquierda del rectngulo
(pt0), el segundo elemento del arreglo debe ser el ubicado en la esquina superior
izquierda (pt1), el tercer elemento debe ser el vrtice ubicado en la esquina inferior
derecha(pt2), y el cuarto debe estar ubicado en la esquina superior derecha(pt3).
Estos son los puntos de origen en para el clculo de la matriz de perspectiva.
Los puntos de destino para el clculo de la matriz de perspectiva se encuentran
mediante una correspondencia simple, como se indica en el Cuadro 3.5. Esta representa el punto de origen y el punto de destino correspondiente. Hay que recordar
que en la pantalla el pxel ubicado arriba a la izquierda es el (0,0).

CAPTULO 3. IMPLEMENTACIN

51

Figura 3.9: Eliminacin de duplicados

Puntos de origen
Esquina superior izquierda
Esquina inferior izquierda
Esquina superior derecha
Esquina inferior derecha

Puntos de destino
(0,0)
(0,50)
(100,0)
(100,50)

Cuadro 3.5: Puntos para el clculo de la matriz de transformacin

CAPTULO 3. IMPLEMENTACIN

Figura 3.10: Diagrama de flujo de la etapa de seleccin y filtrado

52

CAPTULO 3. IMPLEMENTACIN

53

Funciones definidas en la librera se encargan del clculo de la matriz de transformacin, usando un procedimiento similar al descrito en la Seccin 2.3.3. Esta matriz
sirve para realizar una transformacin geomtrica sobre la imagen original.El efecto de esta transformacin puede verse en la Figura 3.12. Ntese que la placa del
vehculo se ha desplazado hacia el rectngulo de vrtices: (0,0), (0,50), (100,0),
(100,50). Esta zona es recortada de la fotografa.

Figura 3.11: Rectngulo detectado

Hay que destacar que la transformacin geomtrica trabaja sobre una copia de la
imagen original, y no sobre las imgenes binarias obtenidas en la etapa de preprocesamiento. Esto se debe a que las imgenes binarias obtenidas durante el
preprocesamiento no siempre preservan los caracteres que forman el nmero de
placa. Para garantizar que los caracteres que forman el nmero de placa estn en
las mejores condiciones, la transformacin geomtrica recorta la placa de la imagen original, en color. Esto hace necesario una transformacin a escala de gris, y
ecualizacin sobre este segmento recortado de la fotografa original.
El mtodo de transformacin a escala de gris usado aqu consiste en producir una
nueva imagen, en donde sus pxeles corresponden al componente de luminancia
de la imagen original. Este componente se obtiene mediante la suma ponderada de
los componentes de color de los pxeles originales, segn la siguiente frmula[14]:

Y = 0,212671R + 0,715160G + 0,072169B

(3.2)

CAPTULO 3. IMPLEMENTACIN

54

donde Y es el valor del nuevo pxel en escala de gris, y R, G, B son los valores de
los componentes del pxel de la imagen en color.

Figura 3.12: Rectngulo normalizado. La placa de la Figura 3.11 se ha desplazado a


la parte superior izquierda

Seleccin de Placa
Esta seccin realiza la proyeccin vertical de el trozo de fotografa seleccionado por
la seccin anterior y realiza un anlisis en busca de una firma caracterstica, esto
es una secuencia de picos en la proyeccin vertical.
1

Proyeccion Vertical
promedio
Limite Superior
Limite Inferior

0.9
0.8
0.7
0.6
0.5
0.4
0.3
0

10

20

30

40

50

60

70

80

Figura 3.13: Proyeccin vertical de una placa tpica

90

100

CAPTULO 3. IMPLEMENTACIN

55

Esta secuencia de picos se distingue por una serie de parmetros como el nmero
de picos, la separacin entre estos, etc. El problema a resolver aqu consiste en
encontrar los parmetros que definen esta firma, y usarlos para la discriminacin
de entre las imgenes que contienen la placa de identificacin y las que no.
En el procedimiento implementado, los siguientes parmetros son usados para
identificar la firma caracterstica en las placas de vehculos:

Desviacin Estndar Debido a que la proyeccin vertical de la placa de identificacin presenta caractersticas como las de la Figura 3.13, en donde gran parte
de los valores se apartan del valor medio, es razonable esperar valores de
desviacin estndar grandes.
Valor promedio El balance mas o menos equilibrado de zonas obscuras y zonas
claras presentes en las placas de identificacin permiten suponer que los valores medios de la proyeccin sern similares en todas las placas.
Nmero de picos El nmero de picos en la proyeccin vertical esta relacionado
con los espacios entre caracteres. Estos picos tienen una amplitud que depende del ancho mnimo y mximo de los espacios entre caracteres.
Nmero de valles El nmero de valles en la proyeccin vertical esta relacionado
con los caracteres que forman el nmero de placa. Estos valles tienen una
amplitud que esta relacionada con el ancho mnimo y mximo de los caracteres.

El diagrama de la Figura 3.14 muestra el diagrama de flujo del procedimiento para


el anlisis de proyeccin horizontal usado aqu. Este usa los parmetros definidos
arriba. Para justificar la eleccin de los valores que se han usado para estos parmetros, se utiliz el conjunto de las 100 fotografas de prueba descritas al inicio
de este captulo. A continuacin se explica mas detalladamente cada uno de estos
parmetros.

CAPTULO 3. IMPLEMENTACIN

Figura 3.14: Procedimiento de anlisis de la proyeccin vertical

56

CAPTULO 3. IMPLEMENTACIN

57

Valor Promedio
El valor promedio de la proyeccin vertical se define como:

N
1 X
xi
x =
N i=1

(3.3)

donde N es el nmero de elementos de la proyeccin y xi es el valor de cada


elemento.
Para medir el valor promedio que debe esperarse en una placa de identificacin se
recolect un conjunto de muestras de la siguiente manera:

1. El programa desarrollado se ejecut usando las 100 fotografas de prueba


descritas al inicio de este captulo.
2. Se clasificaron manualmente los resultados a la salida de la transformacin
geomtrica. Mediante esta clasificacin se encontraron 100 rectngulos que
contenan la placa de identificacin, y 30 rectngulos que contenan elementos
diversos, como faros y ventanas, de dimensiones similares a las placas.

La Figura 3.15 muestra los valores del promedio para las proyecciones verticales
de los 100 rectngulos que contenan una placa de identificacin. El rango elegido
en consecuencia es el de 0,5 x 0,8

Desviacin Estndar
La desviacin estndar de la proyeccin se define como:
v
u
N
u1 X
t
=
(xi x)2
N i=1

(3.4)

Donde N representa el nmero de elementos de la proyeccin vertical, xi es el


elemento i de la proyeccin y x es el valor promedio de la misma.

CAPTULO 3. IMPLEMENTACIN

58

0.74
Promedio
0.72
0.7
0.68
0.66
Promedio
0.64
0.62
0.6
0.58
0.56
10

20

30

40

50

60

70

80

90

100

Nombre de la Muestra

Figura 3.15: Promedio de la proyeccin vertical en el conjunto de imgenes de prueba

La desviacin estndar puede interpretarse como una medida de lo alejados que


se encuentran los elementos de la proyeccin vertical de su valor promedio.
La Figura 3.16 muestra las de desviaciones estndar de la proyeccin en el conjunto
de 100 rectngulos que contenan la placa del vehculo. Puede verse que los valores
caen dentro del rango comprendido entre 0,13 0,21. Sin embargo, en la
implementacin se fijo el rango en 0,12 0,22, para dejar cierto margen a
placas que presenten defectos como corrosin o suciedad.
0.21
Desviacion Estndard
0.2
0.19
0.18
Desviacion
Standard

0.17
0.16
0.15
0.14
0.13
10

20

30

40

50

60

70

80

90

100

Nombre de la Muestra

Figura 3.16: Desviacin estndar de la proyeccin vertical en el conjunto de imgenes


de prueba que contienen la placa de identificacin

CAPTULO 3. IMPLEMENTACIN

59

En contraste la Figura 3.17 muestra los valores de desviacin estndar de los rectngulos que no contenan la placa del vehculo. Puede verse claramente por que la
desviacin estndar es una condicin necesaria, pero no suficiente para clasificar
a un rectngulo como placa de identificacin.
0.22
Desviacion Estndard
0.2
0.18
0.16
0.14
Desviacin
Estndard

0.12
0.1
0.08
0.06
0.04
5

10

15

20

25

30

Nombre de la Muestra

Figura 3.17: Desviacin estndar de la proyeccin vertical en el conjunto de imgenes


de prueba que no contienen la placa de identificacin

Nmero de picos
Un pico en la proyeccin vertical se define como un mximo local. El procedimiento
para contar los picos se expone en el cuadro 3.6. Puede verse que nicamente son
tomados en cuenta aquellos que sobrepasan el nivel limite_superior , y que estn
separados una distancia comprendida entre distancia_minima y distancia_maxima
del pico anterior, y ademas estn precedidos por un valle.
Los valores de distancia_minima y distancia_maxima corresponden aproximadamente al ancho de los caracteres, y se determin midiendo las separaciones entre
picos de las proyecciones obtenidas en las secciones anteriores. Estos valores se
fijaron en 5 para distancia_minima y 30 distancia_maxima .
El valor de limite_superior puede verse en el grfico de la Figura 3.13. Este se
elige dinmicamente para adaptarse a las variaciones de cada proyeccin. Este
lmite se calcula usando la siguiente frmula:

CAPTULO 3. IMPLEMENTACIN

60

procedure contar_picos (double proyeccion_vertical[],


double limite_superior, double limite_inferior, int
distancia_maxima, int distancia_minima)
int numero_de_picos = 0;
int posicion_pico_anterior = 0;
int esvalle=1;
for (i = 2; i < numero_de_elementos_de_proyeccion_vertical - 1; i++)
if (proyeccion_vertical[i-1] < proyeccion_vertical[i]
<= proyeccion_vertical[i+1])
if (distancia_minima<(i - posicion_pico_anterior)<distancia_maxima)
if (espico==1)
if (proyeccion_vertical[i] > limite_superior)
numero_de_picos=numero_de_picos+1;
posicion_pico_anterior = i;
esvalle = 0;
endif
endif
endif
endif
if (proyeccion_vertical[i-1] > proyeccion_vertical[i] >=
proyeccion_vertical[i+1])
if(proyeccion_vertical[i]<limite_inferior)
esvalle=1;
endif
endif
endfor
return numero_de_picos
endprocedure

Cuadro 3.6: Procedimiento para contar el nmero de picos

CAPTULO 3. IMPLEMENTACIN

61

limite_superior = x +

(3.5)

Esto permite que el lmite superior se ajuste de forma automtica. As, para proyecciones que presentan picos bastante mayores que el valor medio, el lmite superior
es mayor que en proyecciones que presentan mas picos cercanos al valor medio de
la proyeccin. El divisor 2 para fue elegido experimentalmente.
La Figura 3.18 muestra el nmero de picos sobre este lmite contados en las placas de prueba descritas en secciones anteriores. Por esta razn se eligi 4 como
el nmero de picos que debe poseer la proyeccin vertical para ser considerada
perteneciente a una placa de identificacin vehicular.
11

Nmero de picos

10
9
8
Nmero
de
Picos

7
6
5
4
10

20

30

40

50

60

70

80

90

100

Nombre de la Muestra

Figura 3.18: Nmero de picos sobre el lmite superior en las fotografas de prueba

Nmero de valles
El procedimiento para contar valles en la proyeccin puede verse en el cuadro 3.7.
El algoritmo es en esencia el mismo que el usado para contar picos. Los limites
distancia_minima y distancia_maxima son los mismos expuestos en la seccin
anterior. El valor de limite_inferior se ha elegido en:
limite_inf erior = x

(3.6)

CAPTULO 3. IMPLEMENTACIN

62

siguiendo el mismo razonamiento expuesto para el limite_superior , debido a la


simetra que presentan las proyecciones alrededor del valor promedio.
procedure contar_picos (double proyeccion_vertical[],
double limite_inferior, double limite_superior, int
distancia_maxima, int distancia_minima)
int numero_de_valles = 0;
int posicion_valle_anterior = 0;
int espico=1;
for (i = 2; i < numero_de_elementos_de_proyeccion_vertical - 1; i++)
if (proyeccion_vertical[i-1] >= proyeccion_vertical[i]
> proyeccion_vertical[i+1])
if (distancia_minima<(i - posicion_pico_anterior)<distancia_maxima)
if (proyeccion_vertical[i] < limite_inferior)
numero_de_valles=numero_de_valles+1;
posicion_valle_anterior = i;
espico=0;
endif
endif
endif
if (proyeccion_vertical[i-1] < proyeccion_vertical[i] <=
proyeccion_vertical[i+1])
if(proyeccion_vertical[i] > limite_superior)
espico=1;
endif
endif
endfor
return numero_de_valles
endprocedure

Cuadro 3.7: Procedimiento para contar el nmero de valles

La Figura 3.19 muestra el nmero de picos bajo limite_inferior en las placas de


prueba antes descritas. Ntese que es de 4. Por esto se ha escogido este nmero
como el mnimo de valles que requiere la proyeccin vertical para ser considerada
como perteneciente a una placa de identificacin vehicular.

Filtrado
La Figura 2.35 muestra el procedimiento seguido para el filtrado de la imagen. El
objetivo es obtener una imagen que en lo posible contenga nicamente los nmeros
que forman el identificador de la placa.

CAPTULO 3. IMPLEMENTACIN

63

10

Nmero de picos

Nmero
de
Picos

4
10

20

30

40

50

60

70

80

90

100

Nombre de la Muestra

Figura 3.19: Nmero de valles bajo el limite inferior en las fotografas de prueba

Figura 3.20: Procedimiento de filtrado

CAPTULO 3. IMPLEMENTACIN

64

Las imgenes que llegan a esta seccin son las que fueron recortadas y normalizadas por la transformacin geomtrica y adems aprobaron el anlisis de la proyeccin vertical descrito anteriormente. Esto significa imgenes en escala de gris
ecualizadas, que fueron recortadas de la imagen original y que contienen la placa
del vehculo.
Debido a que estas imgenes estn compuestas nicamente por dos zonas de brillo definido, las zonas claras, que corresponden al fondo de la placa, y las zonas
obscuras que corresponden a los caracteres que conforman el nmero de identificacin, el histograma que les corresponde es similar al de la Figura 3.21. Este
histograma representa la distribucin de valores de pxel. Como puede verse, existe
una aglomeracin de valores en dos zonas claramente definidas.

Figura 3.21: Imagen e histograma correspondiente

Esta distribucin particular de valores de histograma facilita la determinacin automtica del nivel de umbral que mejor binariza la imagen.
Es por esto que para el filtrado de la imagen se usa el algoritmo de Otsu [23] para
la determinacin del umbral. La implementacin usada aqu es una variacin del
cdigo expuesto por Ryan Dibble8 , para imgenes en escala de gris. Una forma de
explicar el algoritmo de Otsu, es imaginar al histograma como un objeto masivo. El
algoritmo divide primero a este objeto en dos puntos con mayor aglomeracin de
masa, y luego trata de encontrar el punto que equidiste de estos, en este punto se
encuentra el nivel ptimo de umbral. El cuadro 3.8 muestra el pseudocdigo de este
procedimiento. Este considera una imagen en escala de gris con una representacin
de 8 bits por pxel, lo que permite 256 niveles de gris.
Para resaltar las zonas mas obscuras de la imagen, el umbral obtenido anteriormente es dividido para 1, 6 antes de aplicar la binarizacin. Esto consigue que se elimine
8

dibbler@umich.edu

CAPTULO 3. IMPLEMENTACIN

procedure otsu (imagen)


int histograma[256]
int i
int hist_sz = 256
int sum = 0, umbral = 0
int mom = 0
double fmax = -1, csum = 0, m1, m2, sb
int n1 = 0, n2 = 0
histograma = calcular_histograma(imagen)
for (i = 0; i < hist_sz; i++)
sum = sum + histograma[i]
mom = mom + i * histograma[i]
endfor
for (i = 0; i < hist_sz; i++)
n1 = n1 + histograma[i]
if (n1==0)
continua con la siguiente iteracion
endif
n2 = sum - n1
if (n2 == 0)
termina el lazo
endif
csum += i * histograma[i]
m1 = csum / n1
m2 = (mom - csum) / n2
sb = n1 * n2 * (m1 - m2) * (m1 - m2)
if (sb > fmax)
fmax = sb
umbral = i
endif
endfor
return umbral;
endprocedure

Cuadro 3.8: Procedimiento para encontrar automticamente el nivel de umbral

65

CAPTULO 3. IMPLEMENTACIN

66

la mayor cantidad de elementos grises, quedando los mas obscuros los cuales son
los caracteres de la placa.
El filtro morfolgico es aplicado por funciones de librera. El elemento estructurante
usado es un elemento rectangular de tres pxeles de ancho y tres pxeles de alto, el
cual durante las pruebas realizadas mostr buen desempeo en eliminar elementos
diferentes a los caracteres que conforman el nmero de placa.
Finalmente la imagen es guardada en un archivo. Debido a que pueden existir mas
de una placa en la fotografa, las imgenes son guardadas anexndoles la extensin
-x.png donde x es un nmero que empieza en cero, y va aumentando conforme
se encuentran y guardan mas placas de identificacin. Antes del guin va un prefijo
que se pasa como argumento al programa.

3.3.

EVALUACIN DE COSTOS

La correcta evaluacin de costos de desarrollo de un proyecto de software es an


un problema sin resolver. Muchas variables deben tomarse en cuenta para esta
evaluacin, algunas tan subjetivas como el estado de nimo del programador.
Existen variadas estrategias para ayudar en la determinacin de costos. Estas van
desde la comparacin con proyectos similares, hasta modelos matemticos detallados que tratan de considerar todas las variables que entran en juego. La aplicacin
correcta de estos ltimos puede aadir un costo apreciable al software desarrollado.
En este proyecto, para la evaluacin de costos se usa un modelo matemtico llamado COCOMO bsico. COCOMO es un modelo para la evaluacin de costos de
software propuesto por Barry Bohem [29].
COCOMO (Constructive Cost Model) consiste en realidad de una jerarqua de tres
modelos[29]:

COCOMO bsico, que es un modelo que calcula el esfuerzo de desarrollo de


software como una funcin del tamao del programa expresado en el nmero
de lineas de cdigo escritas.

CAPTULO 3. IMPLEMENTACIN

67

COCOMO intermedio el cual calcula el esfuerzo de desarrollo como una funcin del tamao del programa y un conjunto de costos adicionales (costdrivers) que incluyen la evaluacin subjetiva del producto, hardware, personal, y
atributos del proyecto.
COCOMO Detallado. incorpora todas las caractersticas de la versin intermedia mas una evaluacin de los costos en cada paso (anlisis, diseo, etc.) del
proceso de desarrollo de software.

El modelo bsico COCOMO, a su vez puede aplicarse a los siguientes tipos de


proyectos de software[29]:
Proyectos Orgnicos: Son relativamente pequeos y simples proyectos de software, en que equipos pequeos trabajan para cumplir un conjunto relajado
de requerimientos.
Proyectos Semi-Desconectados: Son proyectos intermedios, en tamao y complejidad en que un equipo grande y mixto en experiencia trabaja para cumplir
un conjunto de requerimientos estrictos y no tan estrictos.
Proyectos Embebidos: Son proyectos de software que deben desarrollarse para
cumplir un conjunto de apretadas constantes operacionales de hardware y
software.
Formalmente el modelo se describe como[29]:

E = ab (KSLOC)bb

(3.7)

D = cb (E)db

(3.8)

P =

E
D

(3.9)

donde E es el esfuerzo aplicado en personas por mes, D es el tiempo de desarrollo


en meses, KSLOC es el nmero de lineas de cdigo entregadas, expresado en

CAPTULO 3. IMPLEMENTACIN
Proyecto de software
orgnico
semi-desconectado
embebido

68
ab
2.4
3.0
3.6

bb
1.05
1.12
1.20

cb
2.5
2.5
2.5

db
0.38
0.35
0.32

Cuadro 3.9: Coeficientes para el modelo COCOMO[29]

miles, P es el nmero de personas requeridas. Los coeficientes ab , bb , ,cb y db estn


dados en el Cuadro 3.9.
El modelo COCOMO bsico es bueno para la rpida y temprana estimacin de
los costos de software, pero su precisin est limitada por no considerar calidad
del personal y experiencia, el uso de herramientas y tcnicas modernas y otros
atributos conocidos por tener una influencia significativa en el costo de software.
Debido al tamao de este proyecto, (no mas de unos cientos de lineas de cdigo
fuente), y por haber sido desarrollado por una persona el modelo COCOMO bsico para proyectos orgnicos es suficiente. Este es aplicado al proyecto usando
la herramienta sloccount. Sloccount cuenta las lneas fsicas de cdigo residentes
en un directorio y en base a ellas calcula el esfuerzo necesario. El resultado es la
estimacin en esfuerzo humano y monetario para producir el software.
Sloccount es una aplicacin de software libre desarrollada por David A. Wheeler.
Esta herramienta ha sido aplicada con xito en la evaluacin de proyectos de software libre, como Debian [30]. Amplia informacin acerca del uso de esta aplicacin
puede encontrarse en la pagina web de Sloccount en:

http://www.dwheeler.com/sloc
En el cuadro 3.10 puede verse la salida de sloccount. Para la estimacin se ha
considerado un salario promedio de 10138,92 dlares por ao que es el promedio
para programadores en Ecuador9 .
El costo total de desarrollo de esta aplicacin est en 3078 dlares, los cuales
incluyen documentacin, y costos adicionales de investigacin y prueba.

Datos tomados de http://www.quito.gov.ec/invierta_quito/3costoslabor.htm

CAPTULO 3. IMPLEMENTACIN

69

Cuadro 3.10: Resultados de SLOCCOUNT

SLOC
1022
466

Directory
src
scripts

SLOC-by-Language (Sorted)
ansic=1022
sh=424,awk=42

Totals grouped by language (dominant language first):


ansic:
1022 (68.68%)
sh:
424 (28.49%)
awk:
42 (2.82%)

Total Physical Source Lines of Code (SLOC)


= 1,488
Development Effort Estimate, Person-Years (Person-Months) = 0.30 (3.64)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months)
= 0.34 (4.09)
(Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule) = 0.89
Total Estimated Cost to Develop
= $ 3,078
(average salary = $10,138.92/year, overhead = 1.00).
SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL.
SLOCCount comes with ABSOLUTELY NO WARRANTY, and you are welcome to
redistribute it under certain conditions as specified by the GNU GPL license;
see the documentation for details.
Please credit this data as "generated using David A. Wheeler's 'SLOCCount'."

CAPTULO 4
EVALUACIN

Este captulo muestra el resultado de la evaluacin realizada sobre la implementacin del algoritmo para la deteccin de placa expuesto. Una correcta evaluacin
debe permitir no solamente establecer criterios para la ponderacin, sino tambin
encontrar posibles errores u omisiones, o sugerir maneras de mejorar el desempeo. Est claro que es difcil establecer un conjunto adecuado de pruebas que
permitan realizar estas tareas. Para facilitar esto, se han planteado los siguientes
objetivos a cumplir en esta evaluacin:

1. Determinar el ndice de efectividad del programa construido.


2. Determinar las secciones del programa que presentan fallos en la deteccin.
3. Determinar las causas de los fallos en la deteccin.
4. Conocer el tiempo promedio de ejecucin que necesita la implementacin del
mtodo, para la deteccin de la placa en la fotografa.
5. Encontrar las secciones del programa que consumen mas tiempo de procesamiento.

Para llevarlos a cabo se ha diseado un conjunto de pruebas. Para la realizacin


de las mismas se han recolectado muestras1 de fotografas de vehculos, bajo unas
condiciones que se explican mas adelante. El orden de realizacin de las pruebas
tiene relacin con la naturaleza secuencial del algoritmo propuesto, y es el siguiente:
1

Las fotografas usadas en el captulo anterior se eligieron de forma que el mdulo siempre
encuentre un rectngulo que rodee la placa. Para evitar que este hecho altere los resultados, las
muestras usadas en este captulo corresponden a un conjunto diferente del usado en el captulo de
implementacin.

70

CAPTULO 4. EVALUACIN

71

1. Prueba del mdulo con la totalidad de las muestras recolectadas. De esta


prueba se obtiene un conjunto de fotografas en las que el mdulo tuvo xito
en la deteccin de placa, y un conjunto de fotografas en las que no tuvo xito.
2. Prueba de la etapa de preprocesamiento con las fotografas en las que el
mdulo no tuvo xito en la deteccin, durante la prueba uno. Una vez ms
se obtiene un conjunto de fotografas en las que la etapa funcion como se
esperaba, y un conjunto en las que la etapa fracas.
3. Prueba de la etapa de deteccin de rectngulos con las fotografas que tuvieron xito en la prueba anterior. Tambin aqu se obtienen un conjunto de
fotografas en las que la etapa funcion como se esperaba y uno en el que no.
4. Prueba de la etapa de seleccin y filtrado con las fotografas que tuvieron xito
en la etapa anterior. Durante esta etapa se espera nicamente un conjunto de
fotografas en las que la etapa fracas.

El orden en el que se prueban los componentes de cada etapa es similar al expuesto


aqu. La naturaleza secuencial del algoritmo propuesto, en el que la etapa siguiente
procesa los resultados de la etapa actual, justifica plenamente el orden elegido.
Esto permite rastrear las etapas en las que ocurren los errores en la deteccin.
En las secciones siguientes se explican las condiciones bajo las que se tomaron las
fotografas usadas durante las pruebas del mdulo. Tambin se explica con algn
detalle cada una de las pruebas realizadas, exponiendo los resultados.
Finalmente, se realiza la integracin del mdulo diseado con una aplicacin de
reconocimiento de caracteres. Se analiza el desempeo de esta integracin y se
muestran los resultados de las pruebas realizadas sobre esta integracin.

4.1.

MUESTRAS

Las condiciones en las que se obtienen las muestras son casi ideales, esto es, fotografas tomadas a distancias del vehculo que varan entre 0,4 y 2 m, vehculos
estticos y condiciones de iluminacin ptimas (iluminacin natural entre las 7H00 y
17H00, sin iluminacin exterior adicional).En contraste, en circunstancias reales los
vehculos se encontraran en movimiento, existiran obstculos ocasionales (peatones, sombras producidas por otros vehculos, etc.).

CAPTULO 4. EVALUACIN

72

El uso del flash debe tener un tratamiento muy particular, debido a que este dispositivo en cmaras convencionales produce un efecto de deslumbramiento, como
puede apreciarse en la Figura 4.1, por lo que la utilizacin de luz artificial en condiciones diurnas y nocturnas debera ser investigado con mayor detalle.

Figura 4.1: Ejemplo de uso de flash en la toma de imagen

Debido a que el algoritmo de reconocimiento se basa en atributos de forma y luminosidad, estos deben considerarse dentro de unos mrgenes dados por las restricciones expuestas en la Seccin 1.3.
En estas condiciones se procedi a recoger un conjunto imgenes, cuidando que
nicamente contengan una placa por fotografa. Como se dijo antes, se evitaron las
condiciones extremas en la iluminacin, sin altas luces ni sombras pronunciadas.
Las placas tambin fueron seleccionadas por su estado de conservacin, evitando
aquellas que presentan decoloraciones, xido, o abolladuras.
En el conjunto de fotografas obtenido no se incluyeron placas deterioradas, con
fondos de colores no slidos2 , placas con bordes decorativos ni cubiertas protectoras, sin embargo, se recopil un segundo conjunto de fotografas con estos defectos para determinar la respuesta del algoritmo a placas de estas caractersticas.
Sin embargo, estas fotografas son probadas por separado y no se cuentan en la
determinacin de la efectividad del mdulo, por no cumplir con las restricciones de
diseo expuestas en la Seccin 1.3.
2

Placas multicolores, por ejemplo, placas con fondos como la bandera del Ecuador.

CAPTULO 4. EVALUACIN

73

El dispositivo de toma de imgenes es una cmara Concord Eye-Q 4363Z, con sensor de 4.1 mega pxeles CCD. Las matrices que representan la imagen en el computador, a esta resolucin presentan inconvenientes de tiempo de procesamiento, volumen de clculos, proceso de depuracin. Por esto, se probaron resoluciones mas
bajas durante el proceso de desarrollo de la aplicacin. Se escogi la resolucin de
640x480 por las siguientes razones:

1. El tiempo de procesamiento aumenta de manera exponencial en relacin al


incremento de la resolucin de la imagen.
2. El tamao de la matriz de imagen a una resolucin de 640x480 es un estndar
dentro de los dispositivos de imagen.
3. Las mejoras que se obtendran a resoluciones mayores no seran significativas, aunque permitiran tomar fotografas a mayor distancia.
4. El costo de sensores de imagen con una resolucin de 640x480 pxeles es
bastante econmico, aspecto a tener en cuenta en futuras aplicaciones comerciales.

Es lgico suponer, que al basarse el mdulo de deteccin en atributos como el brillo


de la placa, los errores en la deteccin se darn cuando el brillo de las porciones
de la imagen inmediatamente adyacentes a la placa sea similar al brillo de la placa.
Esta situacin se presenta cuando el vehculo, o al menos las porciones del vehculo
sobre las que est montada la placa, tienen un color similar a la placa; por ejemplo,
autos de color blanco o gris claro.
Los vehculos con estas caractersticas son bastante comunes, pero no son predominantes, y se estima3 que su proporcin es de aproximadamente el 30 %. Las
muestras, por consiguiente reflejan esta proporcin y cuentan con un 29 % de imgenes de esas caractersticas.
En resumen, dos conjuntos de fotografas se han tomado para esta evaluacin:
Un conjunto de 215 fotografas que cumple con las restricciones impuestas,
llamado conjunto primario.
3

Ni la Jefatura Provincial de Trnsito y Transporte Terrestre ni la Polica Nacional poseen estadsticas al respecto. Esta estimacin se realiz de forma emprica, contando el nmero de vehculos de
colores claros en los estacionamientos en donde se tomaron las muestras.

CAPTULO 4. EVALUACIN

74

Un conjunto de 40 fotografas que no cumplen con las restricciones impuestas,


llamado conjunto de control.
Estos conjuntos de fotografas fueron tomados al azar, y son completamente diferentes del conjunto usado durante la implementacin del mtodo.

4.2.
4.2.1.

RESULTADOS EXPERIMENTALES
EFECTIVIDAD EN LA DETECCIN

El criterio para la evaluacin del xito del mdulo es simple. Si el mdulo detecta y
recorta la placa correctamente se considera que ha tenido xito. Si no, se cataloga
como error. La deteccin es correcta si el mdulo encuentra un rectngulo que
encierre completamente el nmero de placa del vehculo. Es necesario aclarar que
el resultado puede llevar o no a un reconocimiento de caracteres exitoso4 .

Figura 4.2: Ejemplo de resultados del mdulo. (a) Deteccin Correcta y (b) Distorsin
en el resultado

Se define como efectividad en la deteccin de placa al porcentaje de fotografas


en las que el mdulo detect la placa correctamente. sta se calcula mediante la
frmula:
ef ectividad =

N umero de f otografias detectadas correctamente


100[ %]
T otal de f otografias evaluadas

(4.1)

El Cuadro 4.1 muestra los resultados de la evaluacin del mdulo con el conjunto
primario de 215 fotografas de prueba. Para el anlisis posterior los resultados se
clasifican en:
4

La integracin de el programa desarrollado con un sistema de reconocimiento de caracteres se


tratar mas adelante.

CAPTULO 4. EVALUACIN

75

Deteccin Correcta: Son aquellas fotografas en la que la placa fue detectada y


recortada correctamente.
Falsos Positivos: Son aquellas fotografas en que se recort un rectngulo que no
contena la placa del vehculo.
Falsos Negativos Son aquellas fotografas en las que no se detect la placa, a
pesar de estar presente en la fotografa.
Clasificacin
Deteccin Correcta
Falsos Positivos
Falsos Negativos
Total

Nmero de Fotografas
163
3
49
215

Porcentaje
75.8 %
1.4 %
22.8 %
100 %

Cuadro 4.1: Resultados de la evaluacin

Este cuadro permite calcular la efectividad del mdulo aplicando la frmula 4.1:
ef ectividad =

163
100 = 75,814 %
215

(4.2)

Estos resultados permiten suponer que la efectividad del mdulo de deteccin de


placa oscila alrededor del 75 %. Al ejecutar el mdulo de deteccin de placa varias
veces sobre un mismo conjunto de fotografas de prueba, se obtuvieron siempre los
mismos resultados, lo que demuestra que el mdulo construido carece de memoria,
y por lo tanto no necesita entrenamiento.
Es importante resaltar que el mtodo de deteccin se basa en el supuesto que
las placas presentan un brillo superior al medio que las rodea. En consecuencia,
cabe esperar que las fallas en la deteccin se presenten especialmente en aquellas
fotografas en que esta diferencia sea poco notable, por ejemplo, placas blancas
sobre autos blancos o grises claros. En el Cuadro 4.2 se muestra la clasificacin de
los resultados de acuerdo a esta consideracin.
Color
Placas sobre fondo claro
Placas sobre fondo obscuro
Total

Placas
Analizadas
65
150
215

Falsos
Negativos
33
16
49

Cuadro 4.2: Clasificacin por contraste

Falsos
Positivos
1
2
3

Deteccin
Correcta
31
132
163

CAPTULO 4. EVALUACIN

76

El Cuadro 4.3 muestra el resultado de la evaluacin del mdulo con el conjunto de


control. Debido a que las fotografas de este conjunto no cumplen con los requisitos expuestos en la Seccin 1.3, no se realiza un anlisis posterior con el fin de
determinar las causas a las que se deben los fallos en estas fotografas.
Total de fotografas
40

xito
0

Fracaso
40

Cuadro 4.3: Resultados de la evaluacin del mdulo con fotografas que no cumplen
los requisitos descritos en el Captulo 1.

Por ltimo, el Cuadro 4.4 muestra los tiempos de ejecucin del programa. Estos
tiempos se obtuvieron sobre una computadora ACER travelmate 529 ATX, con procesador Intel Pentium III 900MHz con 384 MB de memoria RAM.
Mximo [ms]
4500

Mnimo [ms]
600

Promedio [ms]
1200

Cuadro 4.4: Tiempos de Ejecucin

La Figura 4.3 muestra a la imagen en donde se consigui el mayor tiempo de procesamiento, la Figura 4.4 muestra a la imagen en donde se consigui el menor tiempo
de procesamiento. En general se observa que las imgenes que presentan muchos
objetos necesitan mas tiempo de procesamiento.

Figura 4.3: Imagen en la que se obtuvo el mayor tiempo de procesamiento

El tiempo promedio es la media aritmtica de los tiempos de procesamiento de las


215 fotografas.

CAPTULO 4. EVALUACIN

77

Figura 4.4: Imagen en la que se obtuvo el menor tiempo de procesamiento

En las secciones siguientes se evala cada etapa con las 49 fotografas que produjeron falsos negativos, con el fin de encontrar las secciones en donde se producen
estos fallos. No es necesario realizar este anlisis con las 3 fotografas que produjeron los falsos positivos, ya que estos se pueden atribuir directamente a la etapa
de seleccin y filtrado. Los falsos positivos se producen cuando el nmero de picos
producidos por la proyeccin vertical de la regin de inters est dentro del rango
definido en la Seccin 3.2.3.

4.2.2. PREPROCESAMIENTO
El xito de esta etapa puede considerarse de dos formas diferentes. La primera,
comparando el comportamiento de cada componente con patrones conocidos. Por
ejemplo, para determinar si la ecualizacin est funcionando como se espera, se
compara la salida de esta seccin con una imagen ecualizada mediante otros medios (puede ser a mano, o con un programa de manipulacin de imgenes5 ). Si
ambas imgenes concuerdan para un conjunto grande de imgenes de prueba, se
asume que la ecualizacin funciona correctamente. De la misma manera se procede para la descomposicin en componentes RGB y para la binarizacin. Esta forma
de proceder tiene valor para determinar el correcto funcionamiento de cada una
5

El autor de este documento utiliz Gimp, un programa de manipulacin de imagenes, para comparar los resultados obtenidos en las diferentes etapas.

CAPTULO 4. EVALUACIN

78

de las secciones que conforman la etapa, y se us mucho durante la implementacin de las diferentes etapas del mtodo expuesto. Desde esta perspectiva la etapa
funciona correctamente, ya que el porcentaje de xito es del 100 %.
Un segundo criterio de xito considera la salida esperada del preprocesamiento,
desde el punto de vista de los requerimientos de la etapa de deteccin de rectngulos. Como se expres en la Seccin 2.3.2, para que la deteccin encuentre
un rectngulo que contenga la placa, el preprocesamiento le debe entregar imgenes binarias como la de la Figura 4.5(a). Ntese que se forma un rectngulo claro
alrededor de la placa. En contraste la Figura 4.5(b) muestra un ejemplo de una
fotografa que no cumple con estos requisitos.

Figura 4.5: Ejemplos de binarizacin (a)correcta (b)incorrecta

La evaluacin de la etapa de preprocesamiento de acuerdo al segundo criterio,


permite determinar hasta que punto es correcta la suposicin que las placas de
identificacin son rectngulos fcilmente distinguibles en la que se basa el mtodo
de deteccin implementado. Para esta evaluacin se consideran nicamente las
fotografas del conjunto primario en las que el mdulo fall en detectar la placa.
Esto se realiza de esta manera para determinar cual porcentaje de las fallas en la
deteccin pueden atribuirse a esta etapa.
El Cuadro 4.5 muestra el resultado de la evaluacin de la etapa de preprocesamiento, de acuerdo al segundo criterio expuesto en esta seccin. Se ha realizado una
clasificacin de acuerdo al color del rea que rodea a la placa de identificacin para
resaltar que los fallos en esta etapa se deben principalmente a la falta de contraste
entre la placa y el entorno que la rodea.
Puede verse claramente que de las 52 fotografas en las que el mdulo fall en la
deteccin, 49 se deben a que el preprocesamiento fall en obtener una fotografa

CAPTULO 4. EVALUACIN

79

Color del vehculo


Autos color claro
Autos de color obscuro

xito
0
3

Fracaso
31
15

Cuadro 4.5: Resultados de la etapa de preprocesamiento

binaria que cumpla con los requerimientos expuestos anteriormente. Si se considera que las 49 fotografas corresponden al 100 % de los casos de error, entonces 46
fotografas corresponden al 93,88 %, y este valor tambin corresponde al porcentaje
de error debido a esta etapa.
El siguiente cuadro muestra los tiempos de procesamiento de esta etapa. Estos se
obtuvieron tomando el tiempo que se tarda en procesar el conjunto primario de 215
fotografas.
Mximo[ms]
29

Mnimo[ms]
22

Promedio[ms]
25

Cuadro 4.6: Etapa de preprocesamiento de imagen. Tiempos promedio de ejecucin

4.2.3.

DETECCIN DE RECTNGULOS

Al igual que en la etapa de preprocesamiento, el criterio de xito en esta etapa


consiste en comparar la salida obtenida con la necesaria para la etapa siguiente de
seleccin y filtrado. Esto significa que una fotografa pasa con xito esta etapa si a
la salida de la misma hay disponible un rectngulo que contiene la placa. Los datos
usados para esta prueba son las tres fotografas que pasaron con xito la etapa
anterior, del conjunto de imgenes en las que el mdulo fall en identificar la placa.
La Figura 4.6 muestra la nica fotografa que fall en esta seccin. Como puede
verse, se detect correctamente un rectngulo que contiene la placa. Puede observarse que existe otro rectngulo que lo encierra, lo que causa que la eliminacin
de duplicados deseche uno de los rectngulos. Desafortunadamente, el rectngulo
desechado es el menor, el cual es el que rodea la placa de identificacin.
El Cuadro 4.7 muestra los tiempos de procesamiento de la etapa de deteccin de
rectngulos. Estos tiempos estn tomados del procesamiento de las 215 fotografas
de prueba.

CAPTULO 4. EVALUACIN

80

Figura 4.6: Fotografa que presento errores en la eliminacin de duplicados

Mximo [ms]
4430

Mnimo [ms]
540

Promedio [ms]
1130

Cuadro 4.7: Tiempos de procesamiento de la etapa de deteccin de rectngulos

4.2.4. SELECCIN Y FILTRADO


Las ltimas dos fotografas que presentaron errores en la deteccin se deben a
problemas en la etapa de seleccin y filtrado.
Dos fotografas son desechadas por errores en esta etapa. Ambas no aprueban
el anlisis de proyeccin vertical. Esto se debe a que el nmero de picos en su
proyeccin no est dentro del rango definido en la Seccin 2.3.3
El Cuadro 4.8 muestra los tiempos de procesamiento para esta etapa.
Mximo [ms]
23

Mnimo [ms]
20

Promedio [ms]
21

Cuadro 4.8: Tiempos de procesamiento de la etapa de deteccin de rectngulos

4.3.

ANLISIS DE RESULTADOS

El Cuadro 4.9 muestra los porcentajes de error en la deteccin debidos a cada


etapa. El principal inconveniente para una deteccin 100 % exitosa est en el pro-

CAPTULO 4. EVALUACIN

81

Figura 4.7: Ejemplo de fotografa en la que fall el anlisis de la proyeccin vertical

Figura 4.8: Proyeccin vertical para la placa de la Figura 4.7

cedimiento de binarizacin dentro de la etapa de preprocesamiento de imagen.


Si para cada fotografa analizada, se pudiera encontrar un nivel de umbral T tal que
se produjera una binarizacin como la descrita en la Seccin 4.2.2, la efectividad
del mdulo aumentara considerablemente. Sin embargo, existen fotografas como
la de la Figura 4.9, en las que no existe un nivel de umbral capaz de producir tal
binarizacin 6 .
6

En la implementacin del captulo anterior se utiliza una representacin de 8 bits por pxel, esto
permite hasta 28 niveles de umbral.

CAPTULO 4. EVALUACIN
Etapa
Preprocesamiento
Deteccin de Rectngulos
Seleccin y filtrado

82
Porcentaje de falsos negativos
93,88 %
2,17 %
3,95 %

Cuadro 4.9: Clasificacin de las etapas segn el porcentaje de falsos negativos

Figura 4.9: Ejemplo de fotografa con poco contraste entre la placa y el vehculo

Hay varias formas de mejorar el desempeo de esta etapa. Una sera usar mas
bits para representar el brillo del pxel. Con 8 bits nicamente existen 256 niveles
de umbral, con 16 bits existen 65536. Sin embargo, al aumentar los bits por pixel,
tambin aumenta el tiempo de procesamiento. Una forma mas fcil sera colocar
alrededor de la placa una franja de color negro, o montar la placa en una superficie
opaca.
Dentro de la etapa de deteccin de rectngulos, el procedimiento que muestra un
comportamiento no deseado, al menos con los conjuntos de fotografas de prueba,
es el de eliminacin de duplicados. El problema se presenta cuando el detector de
rectngulos encuentra rectngulos anidados. En esta situacin, al tener mas del
30 % del rea en comn, todos los rectngulos anidados menos 1 son eliminados.
Sin embargo, no hay nada en el mtodo de eliminacin de duplicados que garantice
se eliminen los rectngulos que no delimitan la placa. Esto significa que el eliminador de duplicados puede como sucede en la imagen de la Figura 4.6 eliminar el
rectngulo que delimita la placa y quedarse con el rectngulo mas externo, o mas
interno.
Para evitar este error, en el caso de existir rectngulos anidados, el mtodo de eliminacin de duplicados debera marcar todos los rectngulos anidados como rec-

CAPTULO 4. EVALUACIN

83

tngulos vlidos y enviarlos a la etapa siguiente. Existe otra manera de corregir este
error, que requiere una implementacin ligeramente diferente del mtodo expuesto,
pero que eliminara la necesidad de una seccin para la eliminacin de rectngulos
duplicados. Esta solucin se expone en el captulo siguiente, en las recomendaciones para trabajos futuros.
La ltima de las causas de errores se encuentra en la etapa de seleccin y filtrado,
en el procedimiento de proyeccin vertical, que se usa para discriminar los rectngulos que no contienen la placa, de los que si los contienen. Este procedimiento
nicamente considera el nmero de picos7 . Existen imgenes que sin ser placa
contienen un nmero de picos dentro del rango necesario, o puede ser que placas
reales no presenten el nmero de picos necesarios en la proyeccin vertical.
Hay que notar que las correcciones propuestas para las etapas de deteccin de rectngulos y de seleccin y filtrado son irrelevantes, esto si se considera que apenas
el 6.12 % de los errores en la deteccin se presentan en estas secciones. Cualquier
mejora en el mtodo de deteccin de rectngulos debera empezar corrigiendo la
etapa de preprocesamiento de imagen.
Con respecto al tiempo de procesamiento del mdulo, la etapa de deteccin de
rectngulos es la que mas tiempo consume; dentro de esta etapa, el mecanismo de
deteccin de contornos. Debe tenerse cuidado en la interpretacin de estos tiempos
de proceso, ya que es necesario considerar que factores como memoria disponible,
CPU disponible, procesos ejecutndose simultneamente, pueden variar, a menudo
de forma considerable, los tiempos descritos.

4.4.

RECONOCIMIENTO DE CARACTERES

Como parte de este proyecto se implement la integracin de el mdulo desarrollado con un OCR 8 . El desarrollo separado de un mdulo de deteccin de placa
permite la integracin con tecnologas de reconocimiento de caracteres existentes,
evitando la necesidad de desarrollar esta tecnologa por separado.
El problema que hay que resolver para conseguir este objetivo es el de producir
resultados limpios, sin excesivas impurezas que puedan entorpecer el reconocimiento. Esta labor se vuelve mas complicada si se considera que, por estar las
7
8

Para una mejor comprensin de el procedimiento de proyeccin vertical, ver la Seccin 3.2.3
OCR: Optical Character Recognition Reconocedor ptico de Caracteres

CAPTULO 4. EVALUACIN

84

placas expuestas a las inclemencias del ambiente, stas presentan la mayora de


las veces suciedad o deterioro en los caracteres.
El algoritmo de filtrado explicado en la Seccin 2.3.3, se encarga de eliminar estas
impurezas y producir imgenes mas limpias para el reconocimiento. Sin embargo,
aunque la reduccin en las impurezas en la imagen final es considerable, es necesario que el sistema de reconocimiento de caracteres a usar disponga de algn
mecanismo de filtrado adicional.
Se probaron tres programas para el reconocimiento de caracteres: Clara, Ocrad, y
GOCR. De entre stos, GOCR produjo mejores resultados, debido a que permite
ajustar varios de sus parmetros de funcionamiento. En contraste Clara y Ocrad no
presentaban las opciones de GOCR.

4.4.1.

GOCR

GOCR (GNU Optical Character Recognition) es una aplicacin para el reconocimiento de caracteres desarrollado por Jrg Schulemburg y liberado bajo licencia
libre. Puede descargarse de forma gratuita en:

http://altmark.nat.uni-magdeburg.de/ jschulen/ocr/index.html
La forma de uso de GOCR es la siguiente:

diego@NetStar: $ gocr [options] imagen_a_reconocer.pgm


Donde options representa las opciones que presenta el programa para el reconocimiento de imgenes. GOCR presenta mltiples opciones para ajustar los parmetros del reconocimiento de caracteres. De estas opciones las mas importantes para
sta aplicacin particular son:
-f Formato de salida. ASCII, HTML, XML, UTF8. En esta aplicacin se elige
ASCII. La opcin completa seria -fASCII.

CAPTULO 4. EVALUACIN

85

-m Modo de operacin. GOCR presenta un modo de operacin que permite


entrenar el motor de reconocimiento, el cual construye una base de datos de
los caracteres que no conoce. Este es el modo usado en este proyecto. Para
acceder a este modo la opcin completa es -m2. Con la opcin -m130 se
puede entrenar el motor de reconocimiento.
-p[path] Donde path es la ubicacin de la carpeta que contiene la base de
datos de reconocimiento, resultado del entrenamiento.
-C Permite especificar a GOCR que caracteres se desean reconocer. Por las
caractersticas del problema estos caracteres son: ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210. Esto es as por que las placas solo usan estos caracteres.
-d Tamao de los elementos de ruido. Este es el ruido inevitable que aparece
en el resultado y que no es removido por el filtro. Este valor se estableci
experimentalmente en 450.

4.4.2. INTEGRACIN
Con el propsito de automatizar el proceso de reconocimiento se desarroll un
script tipo bash. Este script, llamado vlpr (ver Anexo A.4), es el encargado de llamar al programa de deteccin de placa. Luego enva los resultados al OCR para el
reconocimiento. Esto hace posible ejecutar los dos procesos deteccin de placa y
reconocimiento de caracteres con una sola orden.
Tambin se escribi un script para realizar el entrenamiento del OCR. Este script se
llama trainer y consta en el Anexo A.4. Estos scripts realizan la integracin del sistema de deteccin de placa desarrollado en este proyecto de titulacin, y el sistema
de reconocimiento de caracteres elegido.
Para facilitar la lectura de los resultados, stos son presentados en una pgina web,
escrita en html. Un tercer script escrito en awk fue desarrollado para construir esta
pgina; ste consta en el Anexo A.4. La manera de usar estos scripts se explica en
el manual de usuario del programa en el Anexo B.

CAPTULO 4. EVALUACIN

86

Figura 4.10: Muestra de la base de datos del OCR

4.4.3.

RESULTADOS EXPERIMENTALES

Para la evaluacin de la integracin del mdulo desarrollado con el OCR se usaron


las 163 fotografas que proporcionaron resultados correctos. Como el OCR admite
entrenamiento, se usaron 63 de las 163 fotografas para este propsito. La Figura
4.10 presenta una muestra de la base de datos construida en el entrenamiento.
Luego se evalu el desempeo del OCR con los 100 resultados de la deteccin que
no se usaron para el entrenamiento. Los resultados se muestran en el Cuadro 4.10.
xito
Fracaso
Total

Nmero de Fotografas
54
46
100

%
54 %
46 %
100 %

Cuadro 4.10: Resultados de la integracin con el OCR

Los casos de error se han clasificado en el Cuadro 4.11. Estos se deben principalmente a dos causas:

Ambigedad: el OCR se confunde con caracteres que son similares. Esto ocurre con caracteres como O (letra o), 0 (nmero 0), D (letra d).

CAPTULO 4. EVALUACIN

87

Errores del motor de reconocimiento: se deben principalmente a placas en


mal estado o sucias. Estas presentan demasiado ruido que confunde al OCR,
este tipo de placas suelen producir caracteres entrecortados luego de la binarizacin.

Ambigedad en los caracteres


Otros

Nmero de fotografas
20
36

%
35.7 %
64.3 %

Cuadro 4.11: Categorizacin de los errores en el reconocimiento de caracteres.

Fallas en el reconocimiento de caracteres, como las que ocurren en fotografas


como la Figura 4.11 (c) nicamente pueden corregirse mejorando la calidad de la
fotografa. En cambio, las fallas de ambigedad, como las de la Figura 4.11 (a) y (b)
pueden corregirse en parte, entrenando el OCR con mas fotografas.

Figura 4.11: Ejemplo de imgenes que producen errores en el OCR. Errores de ambigedad (a) Similitud entre 6 y G, (b) Similitud entre 0 y O. (c) Errores en la
fotografa a reconocer

CAPTULO 5
CONCLUSIONES Y RECOMENDACIONES

5.1.

CONCLUSIONES

El propsito de este proyecto ha sido construir una aplicacin que extraiga el rectngulo que contiene la placa de identificacin en fotografas de vehculos. Para
alcanzarlo, se empez por enumerar las caractersticas de las placas vehiculares.
Esto sirvi para establecer un conjunto de requisitos que debera cumplir la aplicacin, requisitos que se escogieron para que no sean demasiado estrictos, y facilitar
en lo posible el desarrollo de la misma.
Luego se describieron los mtodos que se han desarrollado para resolver este problema anteriormente. Se expusieron tres de los mtodos mas comunes para la deteccin de la placa en una fotografa. Aunque entre estos, el que usa la proyeccin
de la imagen a lo largo de las ejes vertical u horizontal de la fotografa (ver Seccin
2.1.1) es la eleccin usual en la bibliografa consultada; para este proyecto se eligi
un mtodo diferente.
El mtodo elegido se expone en la Seccin 2.3. Este mtodo usa la forma de la
placa y su brillo para encontrarla y separarla de la fotografa. Este se eligi debido a
que resulta relativamente fcil de entender e implementar, y adems no consta en
la bibliografa consultada.
Este mtodo es planeado como un procedimiento de tres pasos. El primero encargado de preparar la imagen, y extraer las zonas mas brillantes de la misma.
El segundo, se encarga de analizar estas zonas brillantes y extraer aquellas que
tengan forma rectangular. Finalmente estos rectngulos son analizados usando el

88

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

89

mtodo de proyeccin con la finalidad de encontrar el nmero de picos caractersticos de una placa. Para realizar cada uno de estos pasos, se usan tcnicas de
procesamiento de imgenes ampliamente conocidas.
La aplicacin se implemento en C, debido a experiencia previa con ese lenguaje
de programacin, y a la naturaleza secuencial del mtodo propuesto. Se ha puesto
especial inters en el uso de libreras de cdigo para el procesamiento de imgenes. Esto tiene la ventaja de reducir el tiempo de desarrollo y los costos asociados,
adems de permitir el uso de cdigo existente que implementa las tcnicas de procesamiento de imgenes a usar. Un conjunto limitado de libreras fue evaluado,
pero finalmente se eligi OpenCV por implementar la mayora de las tcnicas de
procesamiento de imgenes necesarias, y adems poseer licencia libre. Aunque es
posible el uso combinado de libreras, esta opcin se desecho por que requera el
trabajo adicional de adaptar las diferentes formas para representar la imagen que
usa cada librera.
Para la evaluacin de los costos se usa el modelo COCOMO. Este modelo relaciona el costo de desarrollo de un programa, como funcin del nmero de lneas de
cdigo que lo conforman. Se us el programa SLOCCOUNT para contar las lneas
de cdigo de la aplicacin desarrollada, y aplicar el modelo. Si bien COCOMO no
proporciona resultados exactos, y sus crticos afirman que es un mal modelo pues
no considera factores como experiencia del programador, afinidad del grupo de trabajo, motivacin, etc, para una aplicacin desarrollada por una sola persona, como
la expuesta en este proyecto, es suficiente. El costo fue calculado en 2986 dlares,
tomando como referencia un salario anual para un programador de 7200 dlares.
Tambin se evalu el mtodo con un conjunto de fotografas de prueba. Estas fotografas fueron tomadas respetando los requisitos impuestos en el Captulo 1. De
esta evaluacin, el resultado de efectividad del mdulo es del 75 %.
Aunque ese porcentaje de xito no permite el uso del programa escrito en la mayora de aplicaciones prcticas que se le puedan dar, es lo suficientemente alto como
para considerar que el objetivo inicial de este proyecto se ha cumplido. El anlisis
de los resultados obtenidos, indica que la mayora de las causas de error se deben
al proceso de binarizacin llevado a cabo en la etapa de preprocesamiento de imagen. Esto se debe a que no siempre es posible encontrar un nivel de umbral que
separe la placa del resto de la fotografa. Este problema se presenta con preferencia
en autos que tienen el mismo color que la placa de identificacin. Al menos existen
dos maneras de corregir este problema. La primera consiste en un cambio en la

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

90

reglamentacin que obligue a los dueos de vehculos a montar la placa sobre una
superficie opaca, o que aumente el tamao del borde negro que rodea la placa. La
segunda implica modificar la aplicacin para que trabaje con fotografas de mayor
resolucin. Entre estas dos soluciones, la primera permitira aumentar el porcentaje
de xito en el reconocimiento sin necesidad de aumentar el tiempo que necesita la
aplicacin para procesar la imagen.
Como parte de este proyecto, se integr la aplicacin desarrollada con un programa
de reconocimiento ptico de caracteres. La finalidad de esta integracin es producir
una aplicacin que pueda obtener el nmero de la placa de identificacin partiendo
de la fotografa de un vehculo. Se evaluaron tres programas de reconocimiento.
Se eligi GOCR por ser el que mejores resultados present con un conjunto de
imgenes de prueba.
Las pruebas realizadas sobre esta integracin dan como resultado que es capaz
de encontrar correctamente el nmero de placa en un 54 % de las fotografas. Las
causas de error en el reconocimiento se presentan debido a ambigedad en caracteres como la letra O y el nmero 0, o a defectos como suciedad y deterioro
en los caracteres que forman el nmero de placa. En esta parte, un cambio de
reglamentacin se hace necesario para evitar la ambigedad.
En este proyecto se ha demostrado que un sistema de reconocimiento automtico
de nmero de placa de vehculos puede construirse con la tecnologa disponible.
Tambin se ha demostrado que los costos y la dificultad para la construccin de
dicho sistema pueden reducirse si se usan libreras de cdigo existentes. Adems
de que el uso de sistemas de reconocimiento ptico de caracteres disponibles en la
actualidad dan buenos resultados y evitan la necesidad de implementar uno exclusivamente para esta aplicacin.
En resumen, las siguientes conclusiones pueden extraerse de este proyecto:

La debilidad del procedimiento para la deteccin de placa presentado en este


proyecto es la binarizacin. Si para cada imagen se pudiera encontrar un nivel
de umbral tal que segmente la placa del resto de la imagen claramente, el
mtodo desarrollado alcanzara una efectividad del 97,2 %1 . Como se explic
en la Seccin 4.3, existen fotografas para las que no se puede especificar
1

Si se corrigen los fallos en la binarizacin, 46 fotografas se sumaran al numero de xitos. Esto


significa que el nmero de fotografas exitosas aumenta a 163 + 46 = 209 dando un porcentaje de
xito de 209
215 100 = 97,2 %

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

91

un nivel de umbral que separe la placa del resto de la fotografa. Esto constituye una limitacin en el mtodo propuesto. Aunque esta limitacin puede
superarse por distintos medios, existen otros mtodos de deteccin de placa
que podran resultar mas econmicos en recursos, los cuales deben explorarse.
El borde negro que rodea a la placa, ayudara a superar esta limitacin. Desgraciadamente este borde es muy angosto, y tiende a deteriorarse con facilidad. Marcos como el de la Figura 5.1 son bastante comunes. Desgraciadamente la mayora de ellos se montan de tal manera que bloquean parte de
la placa e impiden al mecanismo de binarizacin segmentar la la fotografa
correctamente. No obstante, si estos marcos se montaran de tal forma que rodearan la placa sin tapar sus caracteres permitiran al proceso para deteccin
propuesto funcionar mejor.

Figura 5.1: Ejemplo de un marco porta-placa

La implementacin efectiva de un sistema para el reconocimiento automtico


del nmero de placa de vehculos, debe ir acompaada de un cambio en la
reglamentacin orientado a facilitar la tarea de dicho sistema. Este cambio
de reglamentacin debe considerar los problemas que se presentan debido a
ambigedad en los caracteres, placas en mal estado, ubicacin de la placa en
el vehculo, iluminacin, etc.
El problema con la ambigedad de los caracteres se presenta con cualquier
sistema de reconocimiento automtico. Si bien, problemas de ambigedad
entre los campos de letras y nmeros de la placa son triviales, y pueden solucionarse fcilmente con mecanismos que verifiquen la sintaxis2 de la placa,
2

Una posible implementacin de un verificador de sintaxis, considerara que los tres primeros
caracteres de la placa son letras y los segundos tres caracteres son nmeros. De acuerdo a esto, si
el reconocimiento de caracteres produce un nmero en el campo de letras, el verificador de sintaxis
corregira transformando este nmero en la letra con la que tenga mayor similitud de forma. De la
misma manera procedera si se encuentran letras en el campo de los nmeros. Por ejemplo, si el
reconocedor de caracteres produce un el nmero de placa 1T6-B4G, el reconocedor de sintaxis

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

92

la ambigedad entre elementos de un mismo campo es mas complicada de


resolver, y puede confundir incluso a seres humanos. Este problema es muy
difcil de resolver en el reconocimiento automtico de caracteres, y seria mas
econmico un cambio en la reglamentacin que aada caractersticas que
quiten la ambigedad a los caracteres que conforman el nmero de placa. La
Figura5.2es una muestra de tipos de fuente especialmente preparados para
evitar ambigedad, y que son usados en las placas de la Repblica de Alemania3 , para facilitar el trabajo de los sistemas de reconocimiento automtico de
caracteres.

Figura 5.2: Ejemplo de fuente usada en placas Alemanas

Con respecto a este proyecto, un cambio de reglamentacin que incremente


unos centmetros al borde negro que rodea la placa aumentara considerablemente el porcentaje de xito en la deteccin. Sin embargo, existen otras
formas de aumentar el porcentaje de xito, las cuales deben explorarse antes
de realizar tal modificacin. En las recomendaciones de la seccin siguiente
se presenta un mtodo alternativo al propuesto en este trabajo, que no necesita que la placa presente un contraste apreciable con el medio que la rodea.
Existen formas mas agresivas de disminuir los errores en la deteccin. Por
ejemplo, en el cinturn de acero implementado en Londres para lidiar con
amenazas terroristas, existen sistemas de reconocimiento automtico de nmero de placa de vehculos. En este caso, se eliminan los problemas relacionados con la iluminacin, la ubicacin de la placa en el vehculo y la velocidad
del vehculo, con la construccin de obstculos especiales frente a las cmaras por los que los autos deben circular. Estos obstculos estn construidos
de tal manera que, cuando el vehculo los pasa, debe reducir la velocidad, y
el frente del vehculo apunta directamente hacia la cmara[31].
Correcciones al reglamento de la ley de trnsito de esta naturaleza deben ser
estudiadas cuidadosamente. Antes de cualquier correccin es necesario estudiar con mas detenimiento los beneficios y los perjuicios que traeran sistemas
de deteccin automtica de nmero de placa de vehculos.
producira la siguiente salida: ITG-846. Ntese que se han reemplazado los nmeros del primer
campo por las letras con las que tienen mayor similitud fsica, y se han reemplazado las letras del
segundo campo por los nmeros que mas se les parecen.
3
Tomado de: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

93

Es mi opinin que los sistemas de vigilancia automtica no son recomendables. Una solucin mas efectiva, aunque requiere mas recursos es la educacin. Orwell en el ya clsico libro 1984 describi una sociedad controlada, que
es a donde nos dirigimos si seguimos buscando formas de vigilar a las personas. Es indudable que un sistema de vigilancia automtica es una herramienta
valiosa en las manos adecuadas. La pregunta entonces es Cules son las
manos adecuadas?. La historia nos ha enseado que cualquier persona en
una situacin de poder tiende a abusar de dicha situacin. Irnicamente esta
desconfianza en la naturaleza humana nos lleva a confiar en las personas y
eliminar la vigilancia.
Para tareas como el control de trfico otras soluciones pueden resultar mejores que el reconocimiento automtico de placa. Drachten4 , por ejemplo, es
una ciudad de Holanda que trata de solucionar sus problemas de trfico vehicular de una manera no ortodoxa y que al parecer les est dando buenos
resultados. Esta iniciativa consiste en eliminar lneas de seguridad, seales,
semforos y otros mtodos tradicionales de seguridad vial, forzando a los conductores a dejar de mirar las seales y empezar a mirar a las personas.

5.2.

RECOMENDACIONES

Aun queda mucho trabajo por realizar para obtener un sistema de deteccin de
placa fiable. Una serie de mejoras pueden realizarse al trabajo expuesto en este
documento con la finalidad de mejorar el porcentaje de xito y reducir los tiempos de
procesamiento. A continuacin se exponen algunas recomendaciones para futuros
trabajos sobre el tema.

El mtodo propuesto en este trabajo puede optimizarse para disminuir los


tiempos necesarios para la deteccin de la placa. La Figura 5.3 muestra la implementacin actual del mtodo junto a una implementacin alterna que permitira obtener una disminucin en el tiempo de procesamiento. Como puede
observarse, en la implementacin actual, primero se obtiene un conjunto de
imgenes binarias para cada nivel de umbral y canal de color. Luego este
conjunto de imgenes es analizado para encontrar rectngulos. Si se considera que dos imgenes binarias a niveles de umbral prximos se diferencian
4
Mas informacin acerca de Drachten y el peculiar experimento de control de trfico se encuentra
en la siguiente direccin web: http://en.wikipedia.org/wiki/Drachten#Traffic_experiment

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

94

muy poco, es probable que stas produzcan los mismos rectngulos. Por esta
razn es necesaria la eliminacin de rectngulos duplicados.

Figura 5.3: Optimizacin del mtodo de deteccin de placa

En la misma figura puede verse una implementacin que no produce informacin duplicada. Aqu las imgenes obtenidas luego de la binarizacin son
analizadas individualmente en busca de la placa. De esta manera se reducen
tambin los tiempos de procesamiento, aunque de una forma aleatoria. En
el mejor de los casos, el programa solamente necesita analizar una imagen
binaria para encontrar la placa del vehculo. En el peor, el programa necesita
analizar las imgenes binarias para todos los umbrales en los tres canales de
color.
El tiempo promedio de procesamiento puede reducirse aun mas si el anlisis
anterior se realiza empezando por los umbrales en los que es mas probable
se encuentre la placa del vehculo.
Un mtodo alterno para la deteccin de placa que no requiere la binarizacin
y solo necesita que exista un claro contraste entre el fondo de la placa y los

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

95

caracteres que contiene puede verse en la Figura 5.4. Este mtodo usa el
operador morfolgico apertura con un elemento estructurante horizontal con la
finalidad de producir lneas paralelas al rededor del nmero de placa como se
muestra en la Figura 5.5. Estas lneas pueden encontrarse usando un mtodo
como la transformada de Hough, o incluso usando la proyeccin a lo largo del
eje vertical de la imagen.

Figura 5.4: Mtodo alterno para la deteccin de placa

Figura 5.5: Efecto de la operacin morfolgica apertura con un elemento estructurante


horizontal en el mtodo de la Figura 5.4. Ntese las lneas paralelas que se
forman alrededor de los caracteres de la placa

ltimamente se ha planteado, como medida para mejorar el trnsito vehicular en Quito, un esquema de control de trfico que impone restricciones a la
circulacin de vehculos de acuerdo al nmero de placa. Esto requiere que
personal de la polica o el municipio se encargue de verificar los nmeros de
placa de los vehculos circulando.
Futuros trabajos en el tema de reconocimiento de matrculas podran referirse
a la implementacin de sistemas completos, que incluiran los elementos para

CAPTULO 5. CONCLUSIONES Y RECOMENDACIONES

96

la toma de imgenes, y la posible implementacin en esquemas de control de


trfico como el descrito.
Debido a la naturaleza no crtica de mecanismos de control de trfico como
el expuesto con el calificativo de no crtica, me refiero a que no hay vidas
en juego si el sistema no reconoce correctamente el nmero de placa de un
vehculo hasta un sistema con un modesto ndice de reconocimiento sera
aceptable.
Deberan tambin realizarse estudios de costo de implementacin y mantenimiento de sistemas como estos, as tambin como el impacto social que
representan los sistemas de vigilancia automtica.
El porcentaje de exitos del reconocedor de caracteres puede aumentarse si se
usa algn procedimiento para extraer y enviar los caracteres individualmente
al reconocimiento.
Esta segmentacin de caracteres podra conseguirse, por ejemplo, usando
la proyeccin vertical, como lo hacen en [32], o, de una manera mas simple,aprovechando que luego de la transformacin geomtrica los caracteres
estan separados por distancias fijas y conocidas.

Bibliografa

[1] Jun-Wei Hsieh, Shih-Hao Yu , and Yung-Sheng Chen. Morphology-based License Plate Detection from Complex Scenes. Proceedings of the 16 th International Conference on Pattern Recognition (ICPR02).
[2] Bai Hongliang and Liu Changping. A hybrid License Plate Extraction Method
Based On Edge Statistics and Morphology. Proceedings of the 17th International Conference on Pattern Recognition (ICPR04).
[3] Sebastin Thrun, Gary Bradski, Daniel Russakoff. Stanford course cs223b on
computer vision. http://robots.stanford.edu/cs223b
[4] Reglamento a la Ley de Trnsito y Transporte Terrestre. Decreto Ejecutivo No.
505. RO/ Sup 118 de 28 de Enero de 1997.
[5] 3M Traffic Control Materials Division. 3M Scotchlite(tm) Engineer Grade Reflective Sheeting, series 320, Product Bulletin 3260. September 1996.
[6] Ching-Tang Hsieh, Yu-Shan Juan, Kuo-Ming Hung, Multiple License Plate Detection for Complex Background. Proceedings of the 19th International Conference on Advanced Information Networking and Applications (AINA05).
[7] Ian T. Young, Jan J. Gerbrands, Lucas J. van Vliet, Fundamentals of image
Processing. Delft University of Technology, Netherlands. 1998.
[8] R. C. Gonzalez, R. E. Woods, Digital Image Processing, 2nd Ed., Prentice Hall.
2002.
[9] Antoine Desilets Revelo mis Fotos, Ediciones Daimon, Barcelona-Espaa.
1973.
[10] J. Canny. A Computational Approach to Edge Detection, IEEE Trans. on Pattern
Analysis and Machine Intelligence, 8(6), pp. 679-698 (1986).

97

BIBLIOGRAFA

98

[11] Halina Kwasnicka and Bartosz Wawrzyniak. License plate localization and recognition in camera pictures. Conference In Artificial Intelligence Methods. AIMETH 2002.
[12] Feng Yang, Zheng Ma. Vehicle License Plate location Based on Histogramming
and Mathematical Morphology. Proceedings of the Fourth IEEE Workshop on
Automatic Identification Advanced Technologies (AutoID05).
[13] Sunghoon Kim, Daechul Kim, Younbok Ryu, and Gyeonghwan Kim. A Robust
Licence-Plate Extraction Method under Complex Image Conditions. Proceedings of the 16 th International Conference on Pattern Recognition (ICPR02).
IEEE Computer Society.
[14] Intel Corporation. Open Source Computer Vision Library Reference Manual.
Intel Corporation. 2001.
[15] Arturo Legarda Senz, Mario I. Chacn M. Alejandro Zimmerman Sols. Localizacin De Placas En Vehculos Automotores. Instituto Tecnolgico de
Chihuahua.
[16] Mi-Ae Ko, Young-Mo Kim. License Plate Surveillance System Using Weighted
Template Matching. Proceedings of the 32nd Applied Imagery Pattern Recognition Workshop (AIPR03).
[17] Tran Duc Duan, Tran Le Hong Du, Tran Vinh Phuoc, Nguyen Viet Hoang. Building an Automatic Vehicle License-Plate Recognition System. Intl. Conf. in
Computer Science RIVF05. February 2005, Can Tho, Vietnam.
[18] Martnez Gonzalo. Estudio de diferentes mtodos de extraccin de caractersticas fsicas de imagen y su aplicacin al reconocimiento de patrones. Tesis.
Escuela Politcnica Nacional. 1999.
[19] Yusuf A Syed, Sarfraz M. Color Edge Enhancement based Fuzzy Segmentation of License Plates. Proceedings of the Ninth International Conference on
Information Visualisation (IV05).
[20] Hany Farid. Fundamentals of image procesing. Darmouth University Press.
1997.
[21] John C. Cruss, The image Processing Handbook, CRC Press, 1995.
[22] M. Shridhar and J. W. V. Miller G. Houle and Leendert Bijnagte. Recognition of
Licence Plate Images: Issues and Perspectives. Electrical & Computer Eng

BIBLIOGRAFA

99

University of Michigan-Dearborn, USA TRW Financial Systems, CA-USA &


Nieuwegein-The NetherlandsK.
[23] N. Otsu. A thresholding selection method from gray-scale histogram. IEEE
Trans. on System, Man, and Cybernetics, vol. 9, pp. 6266, 1979.
[24] Satoshi Suzuki, Keiichi Abe. Topological Structural Analysis of Digitized Binary
Images by Border Following, CVGIP Vol. 30, No. 1. 1985. Pg. 3246.
[25] Gustavo Germn Aguilar Carrera. Procesamiento Digital de Imgenes Utilizando Filtros Morfolgicos. Tesis, Escuela Politcnica Nacional, 1995.
[26] Pesoa Lcio, Maragos Petros. Morphological Filtering for image enhancement
and detection. Image and video processing handbook. Academic Press.
[27] W.S. Kendall, O.E. Barndorff-Nielsen, M.C.Van Lieshout. Current Trends in
Stochastic Geometry and its Applications. Editorial Chapman & Hall, London,
1997.
[28] Rafeeq Ur Rehman, Christopher Paul. The Linux Development Plataform. Prentice Hall. 2003.
[29] Bohem B. Software engineering economics. Prentice Hall 1981.
[30] Amor Jose Juan, Robles Gregorio, Gonzales-Barahona Jesus, Herraiz Israel.
From Pigs to Stripes: A Travel through Debian.European Commission 1st CALIBRE Program, University Rey Juan Carlos and Spanish CICyT. 2005.
[31] Mullins Justin. Ring of Steell 2 IEEE Spectrum Magazine, July 2006. International Edition. Pg6-7.
[32] Yungang Zhang, Changshui Zhang. A New Algorithm for Character Segmentation of Licence Plate, Dept of Automation, Tsingua University. The Institute of
Information Processing. Beijing, China.
[33] Vladimir Shapiro Georgi Gluhchev. Multinational License Plate Recognition
System: Segmentation and Classification. Proceedings of the 17th International Conference on Pattern Recognition (ICPR04).
[34] Ley de Trnsito y Transporte Terrestre. Ley No. 000. RO/ 1002 de 2 de Agosto
de 1996.
[35] E. Dougherty. Mathematical Morphology in Image Processing. Editorial
MarcellDekker, New York, September 1992.

BIBLIOGRAFA

100

[36] Jefferson Vega Aguirre. Simulacin de un sistema de seguimiento antirrobo


basado en el procesamiento digital de imagen y reconocimiento de patrones.
Tesis. Escuela Politcnica Nacional. 1997.
[37] Bernardo Barraza Sotomayor, Clesio Luis Tossi. Segmentacin de imagen para
visin por Computadores. XX Jornadas de Ingeniera Elctrica, Escuela Politcnica Nacional. 1985.
[38] Mark Burges, Ron Hale-Evans. The GNU C Programing Tutorial. Free Software
Foundation, 2002. 4.1 Ed.
[39] Luc Vincent, Grayscale Area openings and closings their efficient implementation and applications. Proc. EURASIP Workshop on Mathematical Morphology
and its Applications to Signal Processing, Barcelona, Spain, pp. 2227. May
1993.
[40] Luc Vincent. Morphological Gray Scale Reconstruction: Definition, Efficient Algorithm and Applications in Image Analysis. Proc. IEEE Conf. on Comp. Vision
and Pattern Recog., pp. 633635, Champaign IL, June 1992.
[41] Hsi-Jian Lee, Si-Yuan Chen and Shen-Zheng Wang. Extraction and Recognition of License Plates of Motorcycles and Vehicles on Highways. Proceedings
of the 17th International Conference on Pattern Recognition (ICPR04).
[42] Khairel A. MohamedAbstracting Digital Ink Traces with the Douglas-Peucker
Algorithm. Multimedia Research Group. Institute of computer science, AlbertLudwigs-Universitat Freiburg.
[43] Wenjing Jia, Huaifeng Zhang and Xiangjian He. Mean Shift for Accurate Number Plate Detection. Proceedings of the Third International Conference on Information Technology and Applications (ICITA05).
[44] D.G. Bailey, D. Irecki, B.K. Lim and L. Yang. Test Bed For Number Plate Recognition Aplications. Proceedings of the First IEEE International Workshop on
Electronic Design, Test and Applications (DELTA02).

ANEXO A
CDIGO FUENTE

101

APNDICE A. CDIGO FUENTE

A.1.

ENUMERACIN DE LAS FUNCIONES IMPLEMENTADAS

A.1.1.

Archivo imgproc.c, imgproc.h

102

cvEqualizeHist: Realiza la ecualizacin del histograma. Adaptada de la versin


0.9.9RC1 de OpenCV.
cvOtsu: Calcula el umbral ptimo usando el mtodo de Otsu. Cdigo adaptado
de la versin 0.3 de gocr.
cvVertProy: Calcula la proyeccin vertical de una imagen.
make_message: Construye una cadena de caracteres combinando sus argumentos. Adaptado de un ejemplo aparecido en The GNU C Library Reference
Manual, version 0.1.

A.1.2. Archivo auxfunc.c, auxfunc.h


findRectangles: Encuentra rectngulos en la imagen. Partes del cdigo fueron
tomadas de un programa de ejemplo que viene con la librera OpenCV. El
programa se llama squares, y se encuentra en la carpeta examples que se
distribuye junto con el cdigo fuente de OpenCV.
findPlate: Encuentra la placa de identificacin en una imagen.
drawSquares: Dibuja los rectangulos encontrados sobre la imagen. Partes del
cdigo fueron tomadas de un programa de ejemplo que viene con la librera
OpenCV. El programa se llama squares, y se encuentra en la carpeta examples que se distribuye junto con el cdigo fuente de OpenCV.
ocrprepare: Implementa el procedimiento de filtrado.

A.1.3.

Archivo vlpdgeom.c, vlpdgeom.h

distance: Encuentra la distancia entre dos puntos.


compare_elements: Verifica si dos rectngulos se intersecan.

APNDICE A. CDIGO FUENTE

103

pop_element: Toma los rectngulos de la parte de arriba de la pila.


push_element_end: Pone los rectngulos al final de la pila.
push _element: Pone los rectngulos al inicio de la pila.
angle: Calcula el ngulo entre dos vectores que tienen un punto comn.
proporcion: Calcula la proporcin entre dos lados adyacentes.
duplicados: Esta funcin elimina los rectngulos duplicados.
ordenar_vertices: Ordena los vrtices del rectngulo.
analisis_proyeccion: Implementa el anlisis de la proyeccin vertical.
picos_sobre_avg: Encuentra el nmero de picos en la proyeccin vertical.
picos_bajo_minsdv: Encuentra el nmero de valles en la proyeccin vertical.

A.1.4. Archivo parseargs.h


parse_opt: Realiza el procesamiento de los argumentos pasados en la lnea
de comandos a la aplicacin.

A.1.5. Archivo main.c


main: Programa Principal.

APNDICE A. CDIGO FUENTE

A.2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

PROGRAMA PRINCIPAL

/** \brief VLPD es un programa para la deteccion automatica de placa de


Identificacion en fotografias de vehiculos.
*
*
* VLPD Programa principal
* Programa para la deteccion de la placa de vehiculos\n
* (c) Escuela Politecnica Nacional, Diego F. Asanza. 2006.\n
* El codigo fuente aqui descrito se distribuye con la esperanza de que
* sea util, pero sin ninguna garantia,
* ni siquiera la garantia implicita de mercantibilidad o adecuacion para
* un proposito particular. \n
* @param: vlpd [opciones] imagen_entrada imagen_salida.\n
* Los argumentos que pueden pasarse se explican en parseargs.h
*/
#include
#include
#include
#include
#include
#include

<s t d i o . h>
<h i g h g u i . h>
" p a r s e a r g s . h"
" auxfunc . h"
" imgproc . h"
" vlpdgeom . h"

int

main ( int argc , char ** argv )


{
// declaracion de variables
// Imagenes
I p l I m a g e * img0 ;
IplImage * r e s u l t ;
I p l I m a g e * gray ;
IplImage *canalx ;
I p l I m a g e * temp ;
// secuencias
CvSeq * c o n t o r n o s ;
CvSeq * r e c t a n g u l o s ;
// memoria

CvMemStorage * almacen ;
CvMemStorage * almacen2 ;
int cs , t s ;

// umbrales
double umbral [ ] = { 6 8 , 7 5 , 1 1 0 , 1 3 5 , 1 4 3 , 1 5 7 , 1 7 5 , 1 9 0 , 2 0 9 } ;
// proceso de argumentos de entrada
struct arguments argumentos ;

argumentos . v e r b o s e = 0 ;
argumentos . otsu_div = OTSU_DIV;
argumentos . max_area = MAX_AREA;
argumentos . min_area = MIN_AREA;
argumentos . max_area_comun = MAX_AREA_COMUN;
argumentos . max_cos = COS_MAX;
argumentos . max_rel = REL_MAX;
argumentos . min_rel = REL_MIN;
argumentos . res_ht = RESULT_HT;
argumentos . res_wt = RESULT_WT;
argumentos . dp_dist_min = DP_DIST_MIN;
argumentos . std_dev_max_val = STD_DEV_MAX_VAL;
argumentos . std_dev_min_val = STD_DEV_MIN_VAL;
argumentos . avg_max_val = AVG_MAX_VAL;
argumentos . avg_min_val = AVG_MIN_VAL;
argumentos . pk_min_sep = PK_MIN_SEP;
argumentos . pk_max_down = PK_MAX_DOWN;
argumentos . pk_max_sep = PK_MAX_SEP;
argumentos . pk_max_up = PK_MAX_UP;
argp_parse (&argp , argc , argv , 0 , 0 , &argumentos ) ;

// carga de la imagen del disco a la memoria


if ( argumentos . v e r b o s e )

p r i n t f ( " Cargando l a imagen : %s \n" , argumentos . a r g s [ 0 ] ) ;


img0 = cvLoadImage ( argumentos . a r g s [ 0 ] , 1 ) ;

104

APNDICE A. CDIGO FUENTE


70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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

if

105

( ! img0 )
{
printf

( "No

return

1;

se

puede

abrir

%
s \n" ,

argumentos . a r g s [ 0 ] ) ;

// inicializo imagenes temporales


if ( a r g u m e n t o s . v e r b o s e )
printf
canalx
gray

(" Inicializando

temp =
result

cvCreateImage

Imagenes

Temporales . . . \ n" ) ;

( cvGetSize

( img0 ) ,

IPL_DEPTH_8U,

1);

cvCreateImage

( cvGetSize

( img0 ) ,

IPL_DEPTH_8U,

1);

cvCreateImage

( cvGetSize

( img0 ) ,

IPL_DEPTH_8U,

1);

cvCloneImage

( img0 ) ;

// memoria de almacenamiento dinamico


if ( a r g u m e n t o s . v e r b o s e )
printf
almacen

(" Inicializando
=

almacen2

memoria

cvCreateMemStorage

cvCreateMemStorage

rectangulos

cvCreateSeq

de

alocacion

Dinamica . . . \ n" ) ;

(0);
(0);

sizeof

(0 ,

sizeof

( CvSeq ) ,

( CvPoint ) ,

almacen2 ) ;

// Lazo principal.
if ( a r g u m e n t o s . v e r b o s e )
printf

for

( cs

(" Iniciando
=

1;

c s <=

rutina

3;

principal

. . .

\n" ) ;

c s ++)

// separacion de los canales RGB.


if ( a r g u m e n t o s . v e r b o s e )
printf

( " Separando

cvSetImageCOI

( img0 ,

cvCopy

gray ,

for

( img0 ,

( ts

0;

ts

<

el

canal

%
d\n" ,

cs ) ;

cs ) ;
0);

9;

t s ++)

// ecualizacion
if ( a r g u m e n t o s . v e r b o s e )
printf

( " Ecualizando

cvEqualizeHist

if

( gray ,

imagen . . . \ n" ) ;
canalx ) ;

( argumentos . v e r b o s e

&&

ts

==

4)

{
cvNamedWindow
cvShowImage
cvWaitKey

(" Ecualizacion " ,

(" Ecualizacion " ,

1);

canalx ) ;

(0);

cvDestroyWindow

(" Ecualizacion " ) ;

// binarizacion, umbral[ts] contiene el nivel de umbral.


if ( a r g u m e n t o s . v e r b o s e )
printf

( " Binarizando

cvThreshold

if

( canalx ,

imagen ,

canalx ,

( argumentos . v e r b o s e

&&

nivel

de

umbral

umbral [ t s ] ,

ts

==

255 ,

%f \ n " ,

umbral [ t s ] ) ;

CV_THRESH_BINARY ) ;

4)

{
cvNamedWindow
cvShowImage
cvWaitKey

(" Binarizacion " ,

(" Binarizacion " ,

1);

canalx ) ;

(0);

cvDestroyWindow

(" Binarizacion " ) ;

if

( argumentos . v e r b o s e )
printf

( " Encontrando

Contornos . . . \ n" ) ;

// encuentra contornos en la imagen


cvFindContours

( canalx ,

sizeof

almacen ,

CV_LINK_RUNS,

if

( argumentos . v e r b o s e

&c o n t o r n o s ,

( C v C ontour ) ,

&&

ts

CV_RETR_LIST,

cvPoint
==

(0 ,

0));

4)

// dibuja los contornos en la imagen original


// usado para depuracion
printf

( " Encontrados

IplImage

*img1

cvSetImageCOI
cvDrawContours

cvNamedWindow
cvShowImage

%
d

c o n t o r n o s \n" ,

cvCloneImage

( img1 ,
( img1 ,

contornos

> t o t a l

( img0 ) ;

0);
contornos ,

cvScalar

(1 ,

255 ,

1,

1) ,

cvScalar

(1 ,

255 ,

1,

1) ,

( " Contornos " ,

( " Contornos " ,

1);

img1 ) ;

1,

2,

8);

);

APNDICE A. CDIGO FUENTE


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
173
174
175
176
177
178
179
180
181
182
183
184
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

cvWaitKey ( 0 ) ;
cvDestroyWindow ( " Contornos " ) ;
c v R e l e a s e I m a g e (&img1 ) ;

// seleccion de precandidatos.(aproximacion poligonal +


// seleccion de candidatos
if ( argumentos . v e r b o s e )

p r i n t f ( " Entrando a l p r o c e s o de d e t e c c i o n de r e c t a n g u l o s . . . \ n" ) ;


f i n d R e c t a n g l e s ( c o n t o r n o s , r e c t a n g u l o s , argumentos . min_area ,
argumentos . max_area , argumentos . max_cos ,
argumentos . min_rel , argumentos . max_rel , 0 , argumentos . dp_dist_min ) ;
if ( argumentos . v e r b o s e && t s == 4 )
{
I p l I m a g e * img1 = cvCloneImage ( img0 ) ;
cvSetImageCOI ( img1 , 0 ) ;
img1 = drawSquares ( img1 , r e c t a n g u l o s ) ;
cvNamedWindow ( " R e c t a n g u l o s " , 1 ) ;
cvShowImage ( " R e c t a n g u l o s " , img1 ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " R e c t a n g u l o s " ) ;
c v R e l e a s e I m a g e (&img1 ) ;
}
if ( argumentos . v e r b o s e )
p r i n t f ( " Encontrados %d r e c t a n g u l o s \n\n" , r e c t a n g u l o s >t o t a l / 4 ) ;

if ( argumentos . v e r b o s e )

p r i n t f ( " Encontrados %d r e c t a n g u l o s \n" , r e c t a n g u l o s >t o t a l / 4 ) ;

// eliminacion de areas duplicadas

d u p l i c a d o s ( r e c t a n g u l o s , argumentos . max_area_comun , argumentos . v e r b o s e ) ;

if ( argumentos . v e r b o s e )

p r i n t f ( " T o t a l %d c a n d i d a t o s a p l a c a \n" , r e c t a n g u l o s >t o t a l / 4 ) ;


p r i n t f ( " I n i c i a n d o l a d i s c r i m i n a c i o n f i n a l . . . \ n" ) ;

// La imagen original es necesaria para recortar la placa de la


// fotografia.

cvSetImageCOI ( img0 , 0 ) ;

// seleccion y filtrado
//transformacion Geometrica

f i n d P l a t e ( r e c t a n g u l o s , img0 , argumentos . res_wt , argumentos . res_ht ,


argumentos . std_dev_min_val , argumentos . std_dev_max_val ,
argumentos . avg_min_val , argumentos . avg_max_val ,
argumentos . pk_min_sep , argumentos . pk_max_sep ,
argumentos . pk_max_up , argumentos . pk_max_down ,
argumentos . otsu_div , argumentos . v e r b o s e , argumentos . a r g s [ 1 ] ) ;
if ( argumentos . v e r b o s e )

p r i n t f ( " Se ha e n c o n t r a d o %d p l a c a s v e h i c u l a r e s \n" ,
r e c t a n g u l o s >t o t a l / 4 ) ;

// liberacion de recursos

cvReleaseImage
cvReleaseImage
cvReleaseImage
cvReleaseImage
cvReleaseImage

(&img0 ) ;
(& r e s u l t ) ;
(& gray ) ;
(& c a n a l x ) ;
(&temp ) ;

// memoria

cvReleaseMemStorage (&almacen ) ;
cvReleaseMemStorage (&almacen2 ) ;

if ( r e c t a n g u l o s >t o t a l == 0 )

}
}

106

p r i n t f ( "No s e ha e n c o n t r a d o l a p l a c a d e l v e h i c u l o \n\n" ) ;

return ( 1);

return ( 0 ) ;

APNDICE A. CDIGO FUENTE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

A.3.

FUNCIONES AUXILIARES

A.3.1.

MANEJO DE ARGUMENTOS DE ENTRADA

107

/*
* Parseargs.h
* Funciones para el procesamiento de argumentos de entrada
*
* (c) 2006 Diego F. Asanza
*
*/
#ifndef _PARSEARGS_H
#define _PARSEARGS_H
#ifdef __cplusplus
extern "C"

#endif
#include <argp . h>
#include < g l i b . h>
const char * argp_program_version = " vlpd 0 . 2 " ;
const char * argp_program_bug_address = "<d i e g o _ a s a n z a @ i e e e . org>" ;
struct arguments

};

char * a r g s [ 2 ] ;
///< Archivo de entrada, archivo de salida
double otsu_div ;
///< Divisor para el metodo de otsu
double max_cos ;
///< Maximo coseno entre angulos de lados adyacentes
double max_rel ;
///< Maxima relacion entre lados
double min_rel ;
///< Minima relacion entre lados
int res_wt ;
///< Ancho de la imagen resultante
int res_ht ;
///< Alto de la imagen resultante
int min_area ;
///< Area minima
int max_area ;
///< Area maxima
double dp_dist_min ; ///< distancia minima para el algoritmo de DP
double std_dev_min_val ; ///<Minimo valor de la desviacion standard
double std_dev_max_val ; ///<max val de la desv standard
double avg_min_val ; ///<min val del promedio
double avg_max_val ; ///<max val del promedio
int pk_min_sep ; ///<minima separacion entre picos
int pk_max_sep ; ///<max separacion entre picos
int pk_max_up ; ///<mumero de picos sobre limite_superior
int pk_max_down ; ///<Numero de picos bajo limite_inferrior
double max_area_comun ; ///<area comun para considerar duplicados
int v e r b o s e ;
///< Switch de depuracion

static struct argp_option o p t i o n s [ ] = {

{ " v e r b o s e " , ' v ' , 0 , 0 , " S a l i d a de d e p u r a c i o n " } ,


{ " otsu_div " , ' u ' , " D i v i s o r para Otsu " , 0 , " D i v i s o r para Otsu " } ,
{ "max_cos" , ' c ' , " Coseno e n t r e a n g u l o s a d y a c e n t e s " , 0 ,
" Coseno e n t r e a n g u l o s a d y a c e n t e s " } ,
{ " max_rel " , 'R ' , "Maxima R e l a c i o n e n t r e l a d o s " , 0 ,
"Maxima r e l a c i o n e n t r e l a d o s " } ,
{ " min_rel " , ' r ' , "Minima r e l a c i o n e n t r e l a d o s " , 0 ,
"Minima r e l a c i o n e n t r e l a d o s " } ,
{ " res_wt " , 'w ' , "Ancho de l a imagen r e s u l t a n t e " , 0 ,
"Ancho de l a imagen r e s u l t a n t e " } ,
{ " res_ht " , ' h ' , " Alto de l a imagen r e s u l t a n t e " , 0 ,
" Alto de l a imagen r e s u l t a n t e " } ,
{ " min_area " , ' a ' , " Area minima d e l r e c t a n g u l o " , 0 ,
" Area minima d e l r e c t a n g u l o " } ,
{ "max_area" , 'A ' , " Area maxima d e l r e c t a n g u l o " , 0 ,
" Area maxima d e l r e c t a n g u l o " } ,
{ " dp_dist_min " , 'D ' , " D i s t a n c i a minima para d o u g l a s peuker " , 0 ,
" D i s t a n c i a minima para d o u g l a s peuker " } ,
{ " std_dev_min_val " , ' s ' , " D e s v i a c i o n Minima" , 0 , " D e s v i a c i o n Minima" } ,

APNDICE A. CDIGO FUENTE


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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

};

{ "std_dev_max_val" , ' S ' , " D e s v i a c i o n Maxima" , 0 , " D e s v i a c i o n Maxima" } ,


{ "avg_min_val" , ' p ' , " Promedio minimo" , 0 , " Promedio Minimo" } ,
{ "avg_max_val" , 'P ' , " Promedio Maximo" , 0 , " Promedio Maximo" } ,
{ "pk_min_sep" , ' k ' , " S e p a r a c i o n minima e n t r e p i c o s " , 0 ,
" S e p a r a c i o n Minima e n t r e p i c o s " } ,
{ "pk_max_sep" , 'K ' , " S e p a r a c i o n Maxima e n t r e p i c o s " , 0 ,
" S e p a r a c i o n Maxima e n t r e p i c o s " } ,
{ "pk_max_up" , 'U ' , "Numero maximo de p i c o s s o b r e e l l i m i t e " , 0 ,
"Numero maximo de p i c o s s o b r e e l l i m i t e " } ,
{ "pk_max_down" , ' d ' , "Numero maximo de p i c o s b a j o e l l i m i t e " , 0 ,
"Numero maximo de p i c o s b a j o e l l i m i t e " } ,
{ "max_area_comun" , 'C ' , " Area Comun maxima" , 0 , " Area comun maxima" } ,
{0}

static e r r o r _ t parse_opt ( int key , char * arg , struct a r g p _ s t a t e * s t a t e )

struct arguments * arguments = s t a t e >i n p u t ;


switch ( key )

case ' v ' :

arguments >v e r b o s e = 1 ;

break ;
case ' u ' :

arguments >otsu_div = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' c ' :

arguments >max_cos = g _ a s c i i _ s t r t o d ( arg ,NULL ) ;

break ;
case ' r ' :

arguments >min_rel = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'R ' :

arguments >max_rel = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'w ' :

arguments >res_wt = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' h ' :

arguments >res_ht = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' a ' :

arguments >min_area = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'A ' :

arguments >max_area = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'D ' :

arguments >dp_dist_min = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' s ' :

arguments >std_dev_min_val = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' S ' :

arguments >std_dev_max_val = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' p ' :

arguments >avg_min_val = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'P ' :

arguments >avg_max_val = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' k ' :

arguments >pk_min_sep = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'K ' :

arguments >pk_max_sep = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'U ' :

arguments >pk_max_up = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case ' d ' :

108

APNDICE A. CDIGO FUENTE


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
173
174
175
176

arguments >pk_max_down = ( int ) g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;
case 'C ' :

arguments >max_area_comun = g _ a s c i i _ s t r t o d ( arg , NULL ) ;

break ;

case ARGP_KEY_ARG:
if ( s t a t e >arg_num >= 2 )

argp_usage ( s t a t e ) ;
}
arguments >a r g s [ s t a t e >arg_num ] = a r g ;
break ;
case ARGP_KEY_END:
if ( s t a t e >arg_num < 2 )
{
argp_usage ( s t a t e ) ;
}
break ;
default :
return ARGP_ERR_UNKNOWN;
}
return 0 ;

static char args_doc [ ] = " i n f i l e ,

outfile";

static char doc [ ] = " vlpd E ste programa toma como e n t r a d a una \
f o t o g r a f i a de l a p a r t e f r o n t a l o p o s t e r i o r de un v e h i c u l o , \
y produce como s a l i d a una f o t o g r a f i a que c o n t i e n e l a p l a c a de d i c h o \
v e h i c u l o . \ v . Para mas i n f o r m a c i o n c o n s u l t e e l manual . " ;
static struct argp argp = { o p t i o n s , parse_opt , args_doc , doc } ;
#ifdef __cplusplus

#endif
#endif /* _PARSEARGS_H */

A.3.2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

109

DETECCIN DE RECTANGULOS, SELECCIN Y FILTRADO

/***************************************************************************
auxfunc.h
*
*
* Sun Aug 27 15:36:39 2006
* Copyright 2006 Diego F. Asanza
* diego_asanza@ieee.org
****************************************************************************/
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place Suite 330, Boston, MA 021111307, USA.

/* Definicion de funciones
* Las funciones aqui definidas se implementan en auxfunc.c
*/

APNDICE A. CDIGO FUENTE


28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

110

#ifndef _AUXFUNC_H
#define _AUXFUNC_H
#ifdef __cplusplus
extern "C"

#endif
#include <cv . h>
#include <c x c o r e . h>
/**\brief El area minima que debe tener un contorno para ser candidato
a placa
*
*/

#define MIN_AREA 450


/**\brief El area maxima que debe tener un contorno para ser candidato
a placa
*
*/
#define MAX_AREA 50000
/**\brief Multiplicador para el error minimo en el metodo de DouglasPeuker
*/

#define DP_DIST_MIN 0 . 0 2 5
/**\brief El valor del coseno de angulos adyacentes.
*/
#define COS_MAX 0 . 3
/**\brief La maxima relacion entre lados del rectangulo */
#define REL_MAX 2 . 7
/**\brief La minima relacion entre lados del rectangulo */
#define REL_MIN 1 . 3
/**\brief El ancho de la imagen resultado */
#define RESULT_WT 100
/**\brief El alto de la imagen resultado */
#define RESULT_HT 50
/**\brief Divisor para el metodo de otsu */
#define OTSU_DIV 1 . 6
/**\brief Encuentra rectangulos en un conjunto de contornos, que cumplan
* con ciertas condiciones.
* @param contornos Un puntero a la ubicacion de los contornos a analizar
* @param rectangulos Puntero al almacenamiento para los rectangulos
encontrados.
*
* @param area_min El area minima que necesita el contorno para ser
considerado un rectangulo valido
*
* @param area_max El area maxima que necesita el contorno para ser
considerado un rectangulo valido.
*
* @param cos_max El \f$|\cos(\Phi)|\f$ maximo del angulo \f$\Phi\f$ entre
lados consecutivos que el contorno necesita para ser
*
considerado rectangulo valido.
*
* @param rel_min Relacion minima entre el lado mas amplio y el mas angosto,
para que el rectangulo sea considerado valido.
*
* @param rel_max Relacion maxima entre el lado mas amplio y mas angosto para
que el contorno sea considerado un rectangulo valido.
*
* @param verbose Si es diferente de cero, muestra informacion util para la
depuracion.
*
*/
void f i n d R e c t a n g l e s ( CvSeq * c o n t o r n o s , CvSeq * r e c t a n g u l o s , int area_min ,
int area_max , double cos_max , double rel_min ,
double rel_max , int v e r b o s e , double dp_dist_min ) ;
/**\brief Encuentra los rectangulos en la imagen que contienen la placa del
del vehiculo.
*
*
* @param rectangulos Los rectangulos que se desean analizar.
* @param imagen La imagen sobre la que se buscara la placa del vehiculo
* @param width El ancho de la imagen resultado
* @param height El alto de la imagen resultado
* @param minsdev El valor minimo de la desviacion standard que debe cumplir
el rectangulo analizado para ser considerado placa.
*
* @param maxsdev El valor maximo de la desviacion standard que debe cumplir
el rectangulo analizado para ser considerado placa.
*
* @param minavg El valor promedio minimo que debe cumplir el rectangulo
analizado para ser considerado placa.
*

APNDICE A. CDIGO FUENTE


100
101
102
103
104
105
106
107
108
109
110
111
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

* @param
*
* @param
*
* @param
*
* @param
*
* @param
*
* @param
* @param
*
* @param
*
*/

maxavg El valor promedio maximo que debe cumplir el rectangulo


analizado para ser considerado placa.
pkmin El limite bajo el cual se cuentan los picos en la
Proyeccion vertical.
pkmax El limite sobre el cual se cuentan los picos en la
proyeccion vertical
pkup
Numero de picos sobre el limite pkmax que debe tener el
rectangulo de imagen analizado para ser considerado placa.
pkdown Numero de picos bajo el limite pkmin que debe tener el
Rectangulo analizado para ser considerado placa.
otsu_div Divisor para el metodo de otsu
verbose
Si es diferente de cero muestra la salida de
Depuracion.
archivo_salida El nombre del archivo con el que se guardara el
resultado

void f i n d P l a t e ( CvSeq * r e c t a n g u l o s , I p l I m a g e * imagen , int width ,


int h e i g h t , double minsdev , double maxsdev , double minavg ,
double maxavg , int pkmin , int pkmax , int pkup , int pkdown ,
double otsu_div , int v e r b o s e , char * a r c h i v o _ s a l i d a ) ;
/**\brief Dibuja los rectangulos sobre la imagen.
*
Imagen sobre la que se dibujaran los rectangulos
* @param img
Rectangulos que se dibujaran sobre la imagen
* @param squares
img.
*
*/
I p l I m a g e * drawSquares ( I p l I m a g e * img , CvSeq * s q u a r e s ) ;
/**\brief Encuentra la distancia entre los puntos p0 y p1.
*
@param p0,p1 puntos entre los que se calculara la distancia.
*
*/
float d i s t a n c e ( CvPoint * p0 , CvPoint * p1 ) ;
/**\brief Filtra la imagen para el uso del OCR
*
@param imagen Imagen a filtrar
*
@param verbose si es diferente de cero muestra informacion de depuracion */
*
void o c r p r e p a r e ( I p l I m a g e * imagen , int v e r b o s e ) ;
#ifdef __cplusplus

#endif
/* _AUXFUNC_H */

#endif

/* auxfunc.c
* implementacion de las funciones auxiliares
*
* (c) Diego F. Asanza 2006
*/
#include
#include
#include
#include
#include

111

<s t d i o . h>
<h i g h g u i . h>
" auxfunc . h"
" imgproc . h"
" vlpdgeom . h"

/* Funcion findRectangles
* @args: Secuencia contornos, secuencia rectangulos, int verbose flag
* Analiza los elementos de una secuencia de contornos, los aproxima
* a poligonos, y devuelve aquellos que mas se aproximen a rectangulos
* con una relacion de ancho a alto de 2.
*/
void

f i n d R e c t a n g l e s ( CvSeq * c o n t o r n o s , CvSeq * r e c t a n g u l o s , int area_min ,


int area_max , double cos_max , double rel_min , double rel_max ,
int v e r b o s e , double dp_dist_min )
{
CvSeq * r e s u l t ;

APNDICE A. CDIGO FUENTE


26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

CvMemStorage * s t o r a g e 2 ;
float s , r , t , p ;
int i ;

s t o r a g e 2 = cvCreateMemStorage ( 0 ) ;

while ( c o n t o r n o s )

/* Se aproxima el contorno a un poligono */


if ( v e r b o s e )

p r i n t f ( " Aproximando a p o l i g o n o . . . \ n" ) ;


r e s u l t = cvApproxPoly ( c o n t o r n o s , sizeof ( CvContour ) ,
s t o r a g e 2 , CV_POLY_APPROX_DP,
c v C o n t o u r P e r i m e t e r ( c o n t o r n o s ) * dp_dist_min , 0 ) ;

/* Los contornos de los rectangulos deben tener 4 vertices,


* tener un area adecuada, ni muy grande ni muy pequena y de
* ben ser convexos.
*/
if ( v e r b o s e )

p r i n t f ( " Revisando a n g u l o s y r e l a c i o n . . . \ n" ) ;

if ( r e s u l t >t o t a l == 4 &&

f a b s ( cvContourArea ( r e s u l t , CV_WHOLE_SEQ) ) > area_min &&


f a b s ( cvContourArea ( r e s u l t , CV_WHOLE_SEQ) ) < area_max &&
cvCheckContourConvexity ( r e s u l t ) )

s = 0;
r = 0;
for ( i = 0 ; i < 5 ; i ++)
{
// encuentra el angulo entre lados adyacentes
//encuentra la proporcion entre lados adyacentes
if ( i >= 2 )

t = fabs ( angle
( ( CvPoint * )
cvGetSeqElem ( r e s u l t , i ) ,
( CvPoint * )
cvGetSeqElem ( r e s u l t ,
i 2) ,
( CvPoint * ) cvGetSeqElem ( r e s u l t , i 1 ) ) ) ;
p = fabs ( proporcion
( ( CvPoint * )
cvGetSeqElem ( r e s u l t , i ) ,
( CvPoint * )
cvGetSeqElem ( r e s u l t ,
i 2) ,
( CvPoint * ) cvGetSeqElem ( r e s u l t , i 1 ) ) ) ;

s = s > t ? s : t;
r = r > p ? r : p;

/* Si los cosenos de los angulos son pequenos, y se


* cumple la relacion, entonces escribir los rectangulos
* en la secuencia.
*/
if ( s < cos_max && r > rel_min && r < rel_max )

for ( i = 0 ; i < 4 ; i ++)

cvSeqPush ( r e c t a n g u l o s ,
( CvPoint * ) cvGetSeqElem ( r e s u l t , i ) ) ;

}
c o n t o r n o s = c o n t o r n o s >h_next ;

}
cvReleaseMemStorage (& s t o r a g e 2 ) ;

/* imagen drawSquares

112

APNDICE A. CDIGO FUENTE


98
99
100
101
102
103
104
105
106
107
108
109
110
111
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

* @args: Imagen img, Secuencia Rectangulos


* Dibuja los rectangulos definidos en la secuencia sobre la imagene
* img. Se usa para mostrar los rectangulos detectados sobre la imagen
* original.
*/
IplImage *
drawSquares ( I p l I m a g e * img , CvSeq * s q u a r e s )

CvSeqReader r e a d e r ;
I p l I m a g e * cpy = cvCloneImage ( img ) ;
int i ;
CvPoint pt [ 4 ] ;
// inicializa el lector de secuencias

cvStartReadSeq ( s q u a r e s , &r e a d e r , 0 ) ;

// lee los cuatro elementos de la secuencia a un tiempo


for ( i = 0 ; i < s q u a r e s >t o t a l ; i += 4 )

CvPoint * r e c t = pt ;
int count = 4 ;
// lee los cuatro vertices del rectangulo

memcpy ( pt , r e a d e r . ptr , s q u a r e s >e l e m _ s i z e ) ;


CV_NEXT_SEQ_ELEM ( s q u a r e s >elem_size , r e a d e r ) ;
memcpy ( pt + 1 , r e a d e r . ptr , s q u a r e s >e l e m _ s i z e ) ;
CV_NEXT_SEQ_ELEM ( s q u a r e s >elem_size , r e a d e r ) ;
memcpy ( pt + 2 , r e a d e r . ptr , s q u a r e s >e l e m _ s i z e ) ;
CV_NEXT_SEQ_ELEM ( s q u a r e s >elem_size , r e a d e r ) ;
memcpy ( pt + 3 , r e a d e r . ptr , s q u a r e s >e l e m _ s i z e ) ;
CV_NEXT_SEQ_ELEM ( s q u a r e s >elem_size , r e a d e r ) ;
// dibuja los rectangulos como una linea cerrada

c v P o l y L i n e ( cpy , &r e c t , &count , 1 , 1 , CV_RGB ( 0 , 2 5 5 , 0 ) , 3 , 8 , 0 ) ;

// retorna la imagen resultante


return cpy ;

/* FindPlate
* @args: secuencia rectangulos, imagen imagen, int verb. flag,
char nombre_archivo
*
* Encuentra las placas en la secuencia de rectangulos, las recorta de la imagen
* y las almacena en nombre_archivo.
*/
void
f i n d P l a t e ( CvSeq * r e c t a n g u l o s , I p l I m a g e * imagen , int width , int h e i g h t ,
double minsdev , double maxsdev , double minavg , double maxavg ,
int pkmin , int pkmax , int pkup , int pkdown , double otsu_div ,
int v e r b o s e , char * a r c h i v o _ s a l i d a )

if ( v e r b o s e )

{
}

p r i n t f ( " Entrando en l a e t a p a de s e l e c c i o n y f i l t r a d o \n" ) ;

//puntos para los ajustes de perspectiva

CvPoint t p t [ 4 ] ;
CvPoint2D32f s r c [ 4 ] ;
CvPoint2D32f d s t [ 4 ] ;

//ancho y alto del resultado


int num , r e c t ;
//Rectangulo normalizado para la transformacion de perspectiva

dst
dst
dst
dst

[0]
[1]
[2]
[3]

=
=
=
=

cvPoint2D32f
cvPoint2D32f
cvPoint2D32f
cvPoint2D32f

//contadores varios.
int i , j , a r c v = 0 ;

(0 , height ) ;
(0 , 0);
( width , h e i g h t ) ;
( width , 0 ) ;

113

APNDICE A. CDIGO FUENTE


170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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
234
235
236
237
238
239
240
241

CvMat * map_matrix ;
IplImage * re su lta d o ;
I p l I m a g e * temp ;
IplImage * f i n a l , * r e s ;
double th ;

//matriz para la transformacion perspectiva


//resultado
//imagen temporal
//umbral otsu

//crea una matriz de float de 3x3 que contendra


//los coeficientes de la transformacion de perspectiva

map_matrix = cvCreateMat ( 3 , 3 , CV_32FC1 ) ;

//inicializo las imagenes

r e s u l t a d o = cvCreateImage ( c v G e t S i z e ( imagen ) , 8 , 3 ) ;
temp = cvCreateImage ( c v S i z e ( width , h e i g h t ) , 8 , 3 ) ;
f i n a l = cvCreateImage ( c v S i z e ( width , h e i g h t ) , 8 , 1 ) ;
r e s = cvCreateImage ( c v S i z e ( width , h e i g h t ) , 8 , 1 ) ;

//tomo los rectangulos de uno en uno.


r e c t = r e c t a n g u l o s >t o t a l / 4 ;
for ( j = 0 ; j < r e c t ; j ++)

if ( v e r b o s e )

p r i n t f ( " \n\n **** A na liza n do e l r e c t a n g u l o %d ******** \n" , j ) ;


pop_element ( r e c t a n g u l o s , t p t ) ;
//al retirar un rectangulo de la pila

//rectangulos>total varia.
//ordena los vertices de tpt1 en src

o r d e n a r _ v e r t i c e s ( tpt , s r c ) ;

if ( v e r b o s e )

p r i n t f ( " Puntos para l a t r a n s f o r m a c i o n : \n" ) ;

for ( i = 0 ; i < 4 ; i ++)

p r i n t f ( " s r c [ %d ] = ( %.3 f , %.3 f ) => d s t[ %d ] = ( %.3 f , %.3 f ) \ n" , i ,


src [ i ] . x , src [ i ] . y , i , dst [ i ] . x , dst [ i ] . y ) ;

//calculo de la matriz para la transformacion de perspectiva.


if ( v e r b o s e )

p r i n t f ( " C a l c u l a n d o m a t r i z para l a t r a n s f o r m a c i o n . . . \n" ) ;


cvWarpPerspectiveQMatrix ( s r c , dst , map_matrix ) ;

//Aplica la transformacion de perspectiva


if ( v e r b o s e )

p r i n t f ( " Transformando imagen . . . \n" ) ;


cvW arpPerspective ( imagen , r e s u l t a d o , map_matrix ,
CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS,
cvScalarAll (0));
if ( v e r b o s e )
{
cvNamedWindow ( " t r a n s f o r m " , 1 ) ;
cvShowImage ( " t r a n s f o r m " , r e s u l t a d o ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " t r a n s f o r m " ) ;
}
//Selecciona el roi en la imagen. Este es el rectangulo dentro
//de la imagen que contiene la placa de identificacion.
if ( v e r b o s e )

p r i n t f ( " Recortando Imagen . . . \n" ) ;


cvSetImageROI ( r e s u l t a d o , cvRect ( 0 , 0 , width , h e i g h t ) ) ;

//copia el rectangulo que contiene la placa a una


//nueva imagen

cvCopy ( r e s u l t a d o , temp , 0 ) ;
cvResetImageROI ( r e s u l t a d o ) ;

//La nueva imagen esta en color, las siguientes lineas la transforman


//a una imagen en escala de gris.

cvCvtColor ( temp , f i n a l , CV_RGB2GRAY) ;


cvCopy ( f i n a l , r e s , 0 ) ;
if ( v e r b o s e )
{
cvNamedWindow ( " Candidato " , 1 ) ;
cvShowImage ( " Candidato " , f i n a l ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " Candidato " ) ;
}
//ecualiza la imagen recortada

114

APNDICE A. CDIGO FUENTE


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
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313

cvEqualizeHist ( final , f i n a l ) ;
num =
a n a l i s i s _ p r o y e c c i o n ( f i n a l , minsdev , maxsdev , minavg , maxavg , pkmin ,
pkmax , pkup , pkdown , v e r b o s e ) ;
if ( v e r b o s e )
p r i n t f ( " A n a l i s i s de proy v e r t i c a l = %d \n" , num ) ;
if (num == 1 2 )
{
//binarizacion usando otsu

th = cvOtsu ( f i n a l , v e r b o s e ) ;

if ( v e r b o s e )

p r i n t f ( "Umbral optimo a a p l i c a r = %f \n" , th / otsu_div ) ;


c v T h r e s h o l d ( f i n a l , f i n a l , th / otsu_div , 2 5 5 , CV_THRESH_BINARY) ;

//realiza el filtrado de la imagen antes de guardarla


if ( v e r b o s e )

p r i n t f ( " F i l t r a n d o imagen \n" ) ;


ocrprepare ( f i n a l , verbose ) ;
if ( v e r b o s e )
{
cvNamedWindow ( " f i n a l " , 1 ) ;
cvShowImage ( " f i n a l " , f i n a l ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " f i n a l " ) ;
}
push_element_end ( r e c t a n g u l o s , t p t ) ;
char * out ;
out = make_message ( a r c h i v o _ s a l i d a , a r c v ) ;
if ( v e r b o s e )
p r i n t f ( " Guardando imagen %s \n" , out ) ;
cvSaveImage ( out , f i n a l ) ;
a r c v ++;
}

//libera memoria temporal

c v R e l e a s e I m a g e (& r e s u l t a d o ) ;
c v R e l e a s e I m a g e (&temp ) ;
c v R e l e a s e I m a g e (& f i n a l ) ;

/**\brief Filtra la imagen obtenida para el OCR


*
* @param imagen Es la imagen a filtrar
* @param verbose Si es diferente de cero, muestra la salida de depuracion
*/
void
o c r p r e p a r e ( I p l I m a g e * imagen , int v e r b o s e )

IplImage * res1 ;
r e s 1 = cvCreateImage ( c v G e t S i z e ( imagen ) , 8 , 1 ) ;
if ( v e r b o s e )
{
cvNamedWindow ( " f i n a l " , 1 ) ;
cvShowImage ( " f i n a l " , imagen ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " f i n a l " ) ;
}
c v D i l a t e ( imagen , r e s 1 , NULL, 1 ) ;
if ( v e r b o s e )
{
cvNamedWindow ( " d i l a t e " , 1 ) ;
cvShowImage ( " d i l a t e " , r e s 1 ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " d i l a t e " ) ;
}
cvErode ( r e s 1 , imagen , NULL, 1 ) ;
if ( v e r b o s e )
{
cvNamedWindow ( " e r o d e " , 1 ) ;
cvShowImage ( " e r o d e " , imagen ) ;
cvWaitKey ( 0 ) ;
cvDestroyWindow ( " e r o d e " ) ;

115

APNDICE A. CDIGO FUENTE


314
315
316

}
c v R e l e a s e I m a g e (& r e s 1 ) ;

A.3.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

116

PROCESAMIENTO DE IMAGEN

/***************************************************************************
imgproc.h
*
*
* Sun Aug 27 15:17:58 2006
* Copyright 2006 Diego F. Asanza
* diego_asanza@ieee.org
****************************************************************************/
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place Suite 330, Boston, MA 021111307, USA.

#ifndef _IMGPROC_H
#define _IMGPROC_H
#ifdef __cplusplus
extern "C"

#endif
#include <cv . h>
#include <c x c o r e . h>
/** \brief Ecualiza la imagen.
*
Este algoritmo ecualizacion es una adaptacion de un algoritmo
*
* implementado en OpenCV 0.98.
* @param src Imagen a ecualizar
* @param dst Imagen donde almacenar el resultado
*/
void c v E q u a l i z e H i s t ( I p l I m a g e * s r c , I p l I m a g e * d s t ) ;
/**
\brief Encuentra el umbral optimo usando el metodo de otsu
*
Usa el metodo de otsu para encontrar el nivel optimo de umbral. Devuelve
*
un entero que representa el nivel de umbral calculado usando el metodo de
*
* otsu. Puede estar entre 0 y 255.
*
@param imagen Imagen de la cual calcular el nivel optimo de umbral
*
@param verbose si es diferente de cero muestra la informacion de depuracion
*
*/
int cvOtsu ( I p l I m a g e * imagen , int v e r b o s e ) ;
/**
*
*
*
*
*
*
*/

\brief Calcula la proyeccion vertical de la imagen


@param img imagen de la cual calcular la proyeccion horizontal
@param proy matriz en la que se almacenara la proyeccion. Debe tener una
fila, y el mismo numero de columnas de la imagen. Ademas debe ser del tipo
CV32SC1, (ver documentacion de CvMat en OpenCV).
@param verbose si es diferente de cero publica informacion de depuracion
void cvVertProy ( I p l I m a g e * img , CvMat * proy , int v e r b o s e ) ;

APNDICE A. CDIGO FUENTE


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

/** \brief Construye una cadena de caracteres conbinando sus parametros


*
Construye una cadena de caracteres combinando los valores pasados como
*
parametros. Por ejemplo, si name="muestra1" y value=2, el valor devuelto
*
por la funcion sera "muestra12.png". Se usa para construir nombres de
*
archivo que difieran en el ultimo numero. Es util para guardar diferentes
*
imagenes bajo el mismo prefijo comun, en caso de haberse encontrado mas de
*
una placa en la imagen.
*
*
@param name Cadena de caracteres
*
@param value Un entero
*
*/
char * make_message ( char * name , int v a l u e ) ;
#ifdef __cplusplus

#endif
#endif

/* _IMGPROC_H */

/***************************************************************************
imgproc.c
*
Funciones para el procesamiento de imagenes
*
* Sun Aug 27 13:09:15 2006
* Copyright (c)2006 Diego F. Asanza, Escuela Politcnica Nacional.
* diego_asanza@ieee.org
****************************************************************************/
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place Suite 330, Boston, MA 021111307, USA.

/* Implementacion de algunas funciones de procesamiento de imagenes. */


/* Ecualiza la imagen.
* @args: imagen src fuente, imagen dst destino
* retorna 1 si la imagen no es del tipo CV_8C1
*
* El codigo de esta funcion fue adaptado de una
* implementacion aparecida en OpenCV 0.9.6.
*/
#include " imgproc . h"
#include <s t d i o . h>
void
cvEqualizeHist ( IplImage * src , IplImage * dst )

//Declaracion de variables
CvHistogram * h i s t = 0 ;
CvMat * l u t = 0 ;
int i , h i s t _ s z = 2 5 6 ;

CvSize img_sz ;

float s c a l e ;
float * h ;
int sum = 0 ;
int type ;

//Esta funcion unicamente trabaja con imagenes del tipo CV_8UC1

117

APNDICE A. CDIGO FUENTE


52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

type

if

cvGetElemType

( type

!=

118

( src );

CV_8UC1)

{
printf
exit

( " CvEqualize ,

tipo

no

reconocido " ) ;

1);

//Inicializa el histograma y la LUT


hist
lut

=
=

cvCreateHist

cvCreateMat

(1 ,

(1 ,

&h i s t _ s z ,

256 ,

CV_HIST_ARRAY,

NULL,

0);

CV_8UC1 ) ;

//calculo del histograma


cvCalcHist
img_ sz

(& s r c ,

hist ,

cvGetSize

0,

NULL ) ;

( src );

//escala: 255/totaldepixeles
scale
h =

255. f

float * )

( img_sz . w i d t h

cvPtr1D

( hist

* img_ sz . h e i g h t
>b i n s , 0 , 0 ) ;

);

//Calcula la probabilidad acumulada y llena la LUT


for ( i = 0 ; i < h i s t _ s z ; i ++)
{
sum += cvRound
lut

>d a t a . p t r [

(h [ i ] ) ;
i ]

( uchar )

cvRound

( sum

scale );

}
l u t >d a t a . p t r [ 0 ] = 0 ;
//aplica la LUT (hace la ecualizacion)
cvLUT

( src ,

dst ,

lut );

/**\briefCalcula el umbral usando el metodo de otsu


* @aparam imagen, variable de depuracion.
imagen es un puntero a la imagen de la
*
que se calculara el umbral optimo. Verbose
*
controla la salida de depuracion.
*
devuelve el valor del umbral calculado para esa
*
imagen.
*
*/
int
cvOtsu

( IplImage

int

imagen ,

verbose )

if

( verbose )
printf

(" Iniciando

la

deteccion

//Declaracion de variables
CvHistogram * h i s t = 0 ;
int i , h i s t _ s z = 2 5 6 ;
float * h ;
int sum = 0 , t h = 0 ;
double mom = 0 ;
int t y p e ;
double fmax = 1 , csum = 0 . 0
int n1 = 0 , n2 = 0 ;

m1 ,

optima

m2 ,

de

umbral \n" ) ;

sb ;

//Esta funcion unicamente trabaja con imagenes del tipo CV_8UC1


//imagen en escala de gris de un canal.
type

if

cvGetElemType

( type

!=

( imagen ) ;

CV_8UC1)

{
printf
exit

( " cvOtsu ,

tipo

no

reconocido " ) ;

1);

//Inicializa el histograma
hist

cvCreateHist

(1 ,

&h i s t _ s z ,

CV_HIST_ARRAY,

//calculo del histograma


cvCalcHist

(& i m a g e n ,

hist ,

0,

NULL ) ;

NULL,

0);

APNDICE A. CDIGO FUENTE


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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

h =

float * )

cvPtr1D

( hist

>b i n s

119
0,

0);

//calcula la masa y el momento de masa


for ( i = 0 ; i < h i s t _ s z ; i ++)
{
sum += cvRound
mom +=

(h [ i ] ) ;

double )

* ( double )

cvRound

(h [ i ] ) ;

/* Aplica el metodo de global de Otsu para calcular el umbral optimo.


* Este codigo fue implementado por Ryan Dibble <dibbler@umich.edu>
* para el programa GOCR.
* El metodo compara el histograma en escala de gris con el diagrama de
* densidad de masa. Es como dividir un cuerpo (el histograma) en dos
* partes, de tal manera que los centros de masa de cada parte tengan la
* mayor distancia entre ellos.
*/
for ( i = 0 ; i < h i s t _ s z ; i ++)
{
n1 += cvRound

if

(h [ i ] ) ;

( ! n1 )
{

continue ;
}
n2

= sum

if

n1 ;

( n2 ==

0)

break ;
}
csum +=

double )

m1 = csum

(mom

sb

if

( sb

* cvRound

csum ) / n2 ;
double ) n1 * ( double )

m2 =
=

>

(h [ i ] ) ;

n1 ;

n2

* (m1

m2 )

( m1

m2 ) ;

fmax )

{
fmax
th

sb ;

i ;

if

( verbose )
printf

return

( " Umbral

optimo

otsu

%
d\n" ,

th ) ;

th ;

/* calcula la proyeccion vertical de la Imagen.


*
* @args: imagen, int * proy,int verbose
imagen es la imagen que contiene unicamente la placa del
*
vehiculo. (es una imagen en escala de grises)
*
CvMat pv es el vector que contendra la proyeccion vertical
*
debe ser del tipo CV32SC1 y tener el ancho de la imagen.
*
*/
void
cvVertProy

( IplImage

img , CvMat

* pv , int

verbose )

{
CvMat

int

*tp , * o p t ;

i ;

>w i d t h , CV_32SC1 ) ;
>w i d t h , CV_8SC1 ) ;

t p=c v C r e a t e M a t ( 1 , img

o p t=c v C r e a t e M a t ( 1 , img

//obtiene la primera fila de la imagen y la guarda en opt


cvGetRow ( img , o p t , 0 ) ;

//convierte los datos de 8 bits en opt a 32 bits en pv. Esto es


//necesario por que la suma exede los 8 bits.
c v C o n v e r t S c a l e ( o p t , pv , 1 , 0 ) ;

//toma las siguientes filas y las suma.


for ( i = 1 ; i <img>h e i g h t ; i ++)
{
cvGetRow ( img , o p t , i ) ;

APNDICE A. CDIGO FUENTE


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

c v C o n v e r t S c a l e ( opt , tp , 1 , 0 ) ;
cvAdd ( t p , pv , pv , 0 ) ;
}
c v R e l e a s e M a t (& t p ) ;
c v R e l e a s e M a t (& o p t ) ;
}

char *
make_message

char * name , int

value )

/* A lo mucho se usan 100 caracteres de espacio */


int s i z e = 1 0 0 ;
char * b u f f e r = ( char * ) m a l l o c ( s i z e ) ;
int n c h a r s ;
if ( b u f f e r == NULL)
return NULL ;
/* Se intenta imprimir al espacio determinado */
nchars = s n p r i n t f
( buffer ,
size , " %
s %d . png " ,
name ,

if

( nchars

!=

value ) ;

size )

/* Se reacomoda el buffer, pues ya se sabe el espacio necesario */


b u f f e r = ( char * )
realloc
( buffer ,
nchars + 1 ) ;
if

( buffer
snprintf

!=

NULL)

( buffer ,
name ,

size ,

%d . png " ,

"%
s

value ) ;

return

buffer ;

A.3.4.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

FUNCIONES AUXILIARES

/***************************************************************************
vlpdgeom.h
*
*
* Sun Aug 27 15:12:28 2006
* Copyright 2006 Diego F. Asanza
* diego_asanza@ieee.org
****************************************************************************/
/*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/

This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place Suite 330, Boston, MA 021111307, USA.

/* Definicion de funciones, estas funciones se implementan en vlpdgeom.h */


#ifndef
#define
#ifdef
extern

_VLPDGEOM_H
_VLPDGEOM_H

__cplusplus
"C"

#endif
#include

< c x c o r e . h>

120

APNDICE A. CDIGO FUENTE


36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

121

#include <cv . h>


//Definicion de constantes
/**
\brief El minimo valor de la desviacion estandard de la proyeccion vertical
que deben cumplir los candidatos a placa.
*
*
* Para que un rectangulo sea considerado placa, la desviacion standard de la
Proyeccion vertical de este rectangulo debe estar comprendida entre los
*
limites marcados por los valores STD_DEV_MIN_VAL y STD_DEV_MAX_VAL.
*
*/
#define STD_DEV_MIN_VAL 0 . 1 2
/**
\brief El maximo valor de la desviacion estandard de la proyeccion vertical
que deben cumplir los candidatos a placa
*
*/
#define STD_DEV_MAX_VAL 0 . 2 2
/** \brief El maximo valor del promedio de la proyeccion vertical que deben
* cumplir los candidatos a placa.
*
* Para que un rectangulo sea considerado placa, la media aritmetica de la
Proyeccion vertical de este rectangulo debe estar comprendida entre los
*
limites marcados por los valores AVG_MAX_VAL y AVG_MIN_VAL.
*
*/
#define AVG_MAX_VAL 0 . 8
/** \brief El minimo valor del promedio de la proyeccion vertical que deben
* cumplir los candidatos a placa.
*/
#define AVG_MIN_VAL 0 . 5
/** \brief El maximo valor de la separacion entre picos de
* la proyeccion vertical que deben cumplir los candidatos a placa.
*/
#define PK_MAX_SEP 30
/** \brief El minimo valor de la separacion entre picos de
* la proyeccion vertical que deben cumplir los candidatos a placa.
*/
#define PK_MIN_SEP 5
/** \brief El maximo numero de picos en la proyeccion vertical que deben
* tener los candidatos a placa.
*/
#define PK_MAX_UP 4
/** \brief El maximo numero de valles en la proyeccion vertical que deben
* tener los candidatos a placa.
*/
#define PK_MAX_DOWN 4
/** \brief La maxima area que deben compartir dos rectangulos antes de ser
* considerados el ser el mismo.
*/
#define MAX_AREA_COMUN 1 . 3
/** \brief Esta funcion encuentra la distancia entre dos puntos.
*
Devuelve el
*
* valor de la distancia entre dos puntos usando la formula:
* \f$ d=\sqrt{(x_0x_1)^2+(y_0y_1)^2}\f$, donde \f$(x_0,y_0)\f$
* y \f$(x_1,y_1)\f$ son las coordenadas de p0 y p1 respectivamente.
*
@param p0,p1 los puntos.
*
*/
float d i s t a n c e ( CvPoint * p0 , CvPoint * p1 ) ;
/** \brief Encuentra si dos rectangulos se intersecan.
*
Esta funcion toma como argumentos las coordenadas de los vertices de dos
*
rectangulos pt0[] y pt1[]. Si estos comparten un area mayor a
*
* \f$(1ca)\times100\f$ la funcion devuelve 1. Si el area compartida es menor

APNDICE A. CDIGO FUENTE


108
109
110
111
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
173
174
175
176
177
178
179

* devuelve \f$0\f$.
*
@param pt0[],pt1[] vectores que contienen las coordenadas de los vertices
*
de los rectangulos a comparar.
*
@param ca Corresponde a 1+(maxima area compartida)
*
*/
int c o m p a r e _ e l e m e n t s ( CvPoint p t 0 [ ] , CvPoint p t 1 [ ] , double c a ) ;
/** \brief Toma los elementos de la parte de arriba de la pila
*
@param squares La pila de rectangulos
*
@param pt[] vector donde colocar los vertices del rectangulo de arriba
*
de la pila
*
*/
void pop_element ( CvSeq * s q u a r e s , CvPoint p t [ ] ) ;
/** \brief Coloca los elementos en la parte inferior de la pila
*
@param squares La pila de rectangulos
*
@param pt[] vector que contiene los vertices del rectangulo que se
*
colocara al final de la pila.
*
*/
void push_element_end ( CvSeq * s q u a r e s , CvPoint p t [ ] ) ;
/** \brief Coloca los elementos en la parte superior de la pila
*
@param squares La pila de rectangulos
*
@param pt[] vector que contiene los vertices del rectangulo que se
*
colocara al principio de la pila.
*
*/
void push_element ( CvSeq * s q u a r e s , CvPoint p t [ ] ) ;
/** \brief Esta funcion encuentra el angulo entre dos vectores
*
Devuelve el valor del coseno del angulo entre pt1<pt0>pt2.
*
* Usa la ley del
coseno.
*
*
@param pt0,p11,pt2 los puntos. pt0 es el punto central.
*
*/
double a n g l e ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * p t 0 ) ;
/** \brief Esta funcion encuentra la relacion entre dos vectores.
*
Devuelve el cociente de (pt1<>pt0)/(pt2<>pt0).
*
*
@param pt0,pt1,pt2 los puntos.
*
*/
double p r o p o r c i o n ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * p t 0 ) ;
/** \brief Esta funcion elimina los rectangulos duplicados de la pila.
*
* Esta funcion toma una pila de rectangulos, y elimina los repetidos.
*
@param squares la pila que contiene los rectangulos.
*
@param ca el maxima area comun que pueden compartir dos rectangulos antes
*
antes de considerarse ser el mismo.
*
@param verbose si es diferente de cero, imprime informacion de depuracion.
*
*/
int d u p l i c a d o s ( CvSeq * s q u a r e s , double ca , int v e r b o s e ) ;
/** \brief Esta funcion ordena los vertices de tpt.
*
Devuelve los vertice de tpt ordenados en src. Ordena los vertices en src
*
* de tal
* forma que el primer elemento del arreglo sea el vertice
* ubicado en la esquina inferior izquierda del rectangulo ($pt0$), el segundo
* elemento del arreglo
* debe ser el ubicado en la esquina superior izquierda ($pt1$), el tercer
* elemento debe ser el vertice ubicado en la esquina inferior derecha($pt2$), y
* el cuarto debe estar ubicado en la esquina superior derecha($pt3$).
*

122

APNDICE A. CDIGO FUENTE


180
181
182
183
184
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
234
235
236
237
238
239
240
241
1
2
3
4
5
6
7
8
9

123

@param tpt los vertices a ordenar.


*
* @param src sitio donde se colocan los vertices ordenados.
*/
void o r d e n a r _ v e r t i c e s ( CvPoint * t p t , CvPoint2D32f * s r c ) ;
/** \brief Realiza el analisis de la proyeccion vertical.
*
Esta funcion realiza el analisis de la proyeccion vertical de los
*
candidatos a placa. Devuelve 12 en caso de aprobar el analisis.
*
devuelve cero en caso contrario. Para aprobar el analisis la
*
proyeccion vertical debe tener al menos (picos_up) picos y
*
(picos_down) valles,
*
la media aritmetica de la proyeccion debe estar entre minavg y maxavg
*
y la desviacion estandard debe estar entre minsdev y max sdev. Los picos
*
de la proyeccion deben estar separados una distancia comprendida entre
*
dmin y dmax.
*
*
@param img La imagen a analizar
*
@param minsdev,maxsdev Los limites de la desviacion estandard
*
@param minavg,maxavg
Los limites de la media aritmetica
*
@param dmin,dmax
Los limites de la separacion entre picos, y entre valles
*
@param picos_up,picos_down El numero de picos y valles
*
@param si es diferente de cero, muestra informacion de depuracion
*
*/
int
a n a l i s i s _ p r o y e c c i o n ( I p l I m a g e * img , double minsdev , double maxsdev ,
double minavg , double maxavg , int dmin , int dmax ,
int picos_up , int picos_down , int v e r b o s e ) ;
/** \brief Esta funcion cuenta el numero de picos en la proyeccion vertical
que son mayores a un determinado valor.
*
*
Esta funcion cuenta el numero de picos de la proyeccion vertical
*
almacenada en scale, que son mayores a avg, y estan separados por
*
una distancia minima dmin y maxima dmax. Devuelve el numero de picos
*
sobre avg.
*
*
@param scale La proyeccion vertical
*
@param avg El valor sobre el cual se cuentan los picos
*
@param dmin,dmax
La separacion entre picos.
*
*/
int p i c o s _ s o b r e _ a v g ( CvMat * s c a l e , double avg , float minsdv , int dmax , int dmin ) ;
/** \brief Esta funcion cuenta el numero de valles en la proyeccion vertical
que son menores a un determinado valor.
*
*
Esta funcion cuenta el numero de valles de la proyeccion vertical
*
almacenada en scale, que son menores a minsdv, y estan separados por
*
una distancia minima dmin y maxima dmax. Devuelve el numero de picos
*
bajo minsdv.
*
*
@param scale La proyeccion vertical
*
@param avg El valor sobre el cual se cuentan los picos
*
@param dmin,dmax
La separacion entre picos.
*
*/
int p i c o s _ b a j o _ m i n s d v ( CvMat * s c a l e , float minsdv , float avg , int dmax , int dmin ) ;
#ifdef _ _ c p l u s p l u s
}

#endif
#endif

/* _VLPDGEOM_H */

/***************************************************************************
vlpdgeom.c
*
*
* Sun Aug 27 14:08:01 2006
* Copyright 2006 Diego F. Asanza
* diego_asanza@ieee.org
****************************************************************************/
/*

APNDICE A. CDIGO FUENTE


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81

*
*
*
*
*
*
*
*
*
*
*
*
*
*/

This program is free software; you can redistribute it and/or modify


it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place Suite 330, Boston, MA 021111307, USA.

/* Implementacion de funciones de uso comun. */


#include " vlpdgeom . h"
#include " imgproc . h"
#include <s t d i o . h>
/* calcula la distancia en pixeles de un punto a otro */
float
d i s t a n c e ( CvPoint * p0 , CvPoint * p1 )

float dx = p0>x p1>x ;


float dy = p0>y p1>y ;
return ( s q r t ( dx * dx + dy * dy ) ) ;

/* compare_elements
* @args: Puntos[] pt0, puntos[] pt1
* compara los rectangulos definidos por pt0 y pt1.
* si se intersecan en mas del 30 % del area, se consideran iguales y la
* funcion devuelve 1.
*/
int
compare_elements ( CvPoint pt0 [ ] , CvPoint pt1 [ ] , double ca )

int dx , dy , lx 1 , lx 2 , ly 1 , ly 2 , lx , l y ;
//obtiene lx y ly
//corregir esta parte de la implementacion
/* comprueba si los dos rectanguloe se intersecan */
if ( abs ( pt0 [ 0 ] . x pt1 [ 0 ] . x ) + abs ( pt0 [ 2 ] . x pt1 [ 0 ] . x ) <
ca * abs ( pt0 [ 0 ] . x pt0 [ 2 ] . x )
&& abs ( pt0 [ 0 ] . y pt1 [ 0 ] . y ) + abs ( pt0 [ 2 ] . y pt1 [ 0 ] . y ) <
ca * abs ( pt0 [ 0 ] . y pt0 [ 2 ] . y ) )

{
}

return 1 ;

else

{
}

return 0 ;

/* pop_elemet
* @args: Secuencia rectangulos, Puntos[] puntos
* Lee los elementos de la secuencia de cuatro en
* cuatro, y los almacena en un vector de puntos
*/
void
pop_element ( CvSeq * s q u a r e s , CvPoint pt [ ] )

cvSeqPop
cvSeqPop
cvSeqPop
cvSeqPop

( squares
( squares
( squares
( squares

,
,
,
,

&pt [ 0 ] ) ;
&pt [ 1 ] ) ;
&pt [ 2 ] ) ;
&pt [ 3 ] ) ;

124

APNDICE A. CDIGO FUENTE


82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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

/* push_element_end
* @args: Secuencia rectangulos, Puntos[] puntos
* Guarda los cuatro elementos al final de la secuencia desde vector de puntos
*/
void
push_element_end ( CvSeq * s q u a r e s , CvPoint pt [ ] )

cvSeqPushFront
cvSeqPushFront
cvSeqPushFront
cvSeqPushFront

( squares
( squares
( squares
( squares

,
,
,
,

&pt [ 0 ] ) ;
&pt [ 1 ] ) ;
&pt [ 2 ] ) ;
&pt [ 3 ] ) ;

/* push_element
* @args: Secuencia rectangulos, Puntos[] puntos
* guarda los cuatro elementos del vector puntos al inicio de la secuencia.
*/
void
push_element ( CvSeq * s q u a r e s , CvPoint pt [ ] )

cvSeqPush
cvSeqPush
cvSeqPush
cvSeqPush

( squares
( squares
( squares
( squares

,
,
,
,

&pt [ 0 ] ) ;
&pt [ 1 ] ) ;
&pt [ 2 ] ) ;
&pt [ 3 ] ) ;

/* Funcion Angle
*
* Angle, encuentra el coseno del angulo entre los vectores formados por los
* puntos pt1pt0pt2. (ley del coseno);
*/
double

a n g l e ( CvPoint
{
double dx1 =
double dy1 =
double dx2 =
double dy2 =
return ( ( dx1
dy1
}

* pt1 , CvPoint * pt2 , CvPoint * pt0 )

pt1 >x
pt1 >y
pt2 >x
pt2 >y
* dx2 +
* dy2 ) /

pt0 >x ;
pt0 >y ;
pt0 >x ;
pt0 >y ;
s q r t ( ( dx1 * dx1 + dy1 * dy1 ) * ( dx2 * dx2 +
dy2 * dy2 ) ) ) ;

/* Proporcion
* @args: punto pt1, punto pt2, punto pt0)
* Devuelve la relacion entre pt1<>pt0/pt2<>pt0
*/
double
p r o p o r c i o n ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * pt0 )

double
double
double
double
return

dx1 = pt1 >x pt0 >x ;


dy1 = pt1 >y pt0 >y ;
dx2 = pt2 >x pt0 >x ;
dy2 = pt2 >y pt0 >y ;
( s q r t ( ( dx1 * dx1 + dy1 * dy1 ) ) / s q r t ( ( dx2 * dx2 + dy2 * dy2 ) ) +
1 e 10);

/* duplicados
* @args: Secuencia Rectangulos
* Borra los elementos repetidos en una secuencia de rectangulos.
* Los rectangulos se consideran que encierran la misma area si comparten mas
* del 50 % de la misma. Devuelve cero si se ejecuto correctamente.
*/
int
d u p l i c a d o s ( CvSeq * s q u a r e s , double ca , int v e r b o s e )

if ( v e r b o s e )

p r i n t f ( " i n i c i a n d o l a e l i m i n a c i o n de d u p l i c a d o s \n" ) ;
CvPoint pt0 [ 4 ] ;

125

APNDICE A. CDIGO FUENTE


154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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

CvPoint
CvSeq

pt1 [ 4 ] ;

* temp ;

CvMemStorage

int

126

i ,

*storage

j ;

/* Si solo hay un posible candidato no es necesario discriminar rectangulos


* repetidos
*/
if ( s q u a r e s > t o t a l / 4 == 1 )
{

return

0;

//inicializa el almacen temporal de areas


storage

temp =

cvCreateMemStorage

cvCreateSeq

(0 ,

(0);

sizeof

( CvSeq ) ,

sizeof

( CvPoint ) ,

storage ) ;

// lee los cuatro elementos de la secuencia a un tiempo


for ( i = 0 ; i < ( s q u a r e s > t o t a l ) / 4 ; i ++)
{
pop_element

( squares ,

for

( j

0;

<

pt0 ) ;

( squares

> t o t a l )

4;

j ++)

{
pop_element

if

( squares ,

pt1 ) ;

( ! compare_elements

( pt0 ,

pt1 ,

ca ) )

{
push_element_end

( squares ,

pt1 ) ;

else
{
j

}
}
push_element_end

( squares ,

pt0 ) ;

}
cvReleaseMemStorage

if

(& s t o r a g e ) ;

( verbose )
printf

return

( " Eliminacion

de

duplicados

terminada .

\n" ) ;

0;

/* Funcion ordenar vertices. Ordena los vertices en src de tal


* forma que el primer elemento del arreglo sea el vertice
* ubicado en la esquina inferior izquierda del rectangulo ($pt0$), el segundo
* elemento del arreglo
* debe ser el ubicado en la esquina superior izquierda ($pt1$), el tercer
* elemento debe ser el vertice ubicado en la esquina inferior derecha($pt2$), y
* el cuarto debe estar ubicado en la esquina superior derecha($pt3$).
*/
void
ordenar_vertices

( CvPoint

tpt ,

CvPoint2D32f

int

i ,

k;

CvPoint

for

( i

tempt ;

0;

<

3;

i ++)

for

(k =

1;

k <

4;

k++)

if

( tpt [ i ] . x >

tpt [ k ] . x)

{
tempt

tpt [ i ] ;

tpt [ i ]

tpt [ k ] ;

tpt [ k ]

tempt ;

}
}
}

if

( tpt [ 0 ] . y >

tpt [ 1 ] . y)

{
src [ 0 ]

cvPointTo32f

( tpt [ 0 ] ) ;

src )

APNDICE A. CDIGO FUENTE


226
227
228
229
230
231
232
233
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
294
295
296
297

127

s r c [ 1 ] = cvPointTo32f ( tpt [ 1 ] ) ;

else

{
}

s r c [ 0 ] = cvPointTo32f ( tpt [ 1 ] ) ;
s r c [ 1 ] = cvPointTo32f ( tpt [ 0 ] ) ;

if ( t p t [ 2 ] . y > t p t [ 3 ] . y )

{
}

s r c [ 2 ] = cvPointTo32f ( tpt [ 2 ] ) ;
s r c [ 3 ] = cvPointTo32f ( tpt [ 3 ] ) ;

else

s r c [ 2 ] = cvPointTo32f ( tpt [ 3 ] ) ;
s r c [ 3 ] = cvPointTo32f ( tpt [ 2 ] ) ;

/* funcion analisis_proyeccion
* realiza el analisis de la proyeccion vertical
* calcula el numero de picos en la proyeccion que sobrepasan
* cierto nivel.
* Recibe como argumentos la imagen a analizar. Devuelve 12 a la salida si
* la proyeccion cumple con las caracteristicas de las placas. Devuelve 0
* si no cumple.
*/
int
a n a l i s i s _ p r o y e c c i o n ( I p l I m a g e * img , double minsdev , double maxsdev ,
double minavg , double maxavg , int dmin , int dmax ,
int picos_up , int picos_down , int v e r b o s e )

int p i c o s = 0 , r e s u l t a d o = 0 ;
CvMat * proy ;
CvMat * s c a l e ;
I p l I m a g e * temp1 ;
double min , max ;
CvPoint Min , Max ;
CvScalar avg , sdv ;
double maxsdv ;
int picos_min ;
double minsdv ;
double s c l ;
temp1 = cvCreateImage ( c v G e t S i z e ( img ) , 8 , 1 ) ;
proy = cvCreateMat ( 1 , img>width , CV_32SC1 ) ;
s c a l e = cvCreateMat ( 1 , img>width , CV_64FC1 ) ;
//bordes horizontales

cvCopy ( img , temp1 , NULL ) ;

//proyeccion vertical

cvVertProy ( temp1 , proy , v e r b o s e ) ;

//Analisis de la proyeccion.
//obtener maximo y minimo

cvMinMaxLoc ( proy , &min , &max , &Min , &Max , NULL ) ;

//La proyeccion normalizada se consigue multiplicando la


//matriz que contiene la proyeccion por 1/max

s c l = 1 / max ;
c v C o n v e r t S c a l e ( proy , s c a l e , s c l , 0 ) ;

//estadisticas varias, consigue el promedio (avg) y


//la desviacion estandar(sdv)

cvAvgSdv ( s c a l e , &avg , &sdv , NULL ) ;

//calcula el numero de picos sobre avg+sdv. Estos picos deben estar separados
//al menos una distancia minima dmin y maxima dmax determinadas experimentalmente.

maxsdv = avg . v a l [ 0 ] + sdv . v a l [ 0 ] / 3 ;


minsdv = avg . v a l [ 0 ] sdv . v a l [ 0 ] / 3 ;
p i c o s = picos_sobre_avg ( s c a l e , maxsdv , minsdv , dmax , dmin ) ;

//calcula el numero de picos bajo avgsdv

picos_min = picos_bajo_minsdv ( s c a l e , minsdv , maxsdv , dmax , dmin ) ;

if ( v e r b o s e )

p r i n t f ( " p i c o s s o b r e avg+s t d d e v= %d , p i c o s b a j o avgs t d d e v= %d\n" , p i c o s ,


picos_min ) ;

APNDICE A. CDIGO FUENTE


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
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369

128

p r i n t f ( " a v e r a g e= %f , s d e v i a t i o n= %f \n" , avg . v a l [ 0 ] , sdv . v a l [ 0 ] ) ;

//caracteristicas de las placas


if ( sdv . v a l [ 0 ] > minsdev && sdv . v a l [ 0 ] < maxsdev && avg . v a l [ 0 ] < maxavg

&& avg . v a l [ 0 ] > minavg )

if ( ( p i c o s >= picos_up && picos_min >= picos_down ) )

resultado = 12;

if ( v e r b o s e )

p r i n t f ( " Creo haber e n c o n t r a d o una p l a c a de v e h i c u l o . . . ; ) \ n" ) ;

c v R e l e a s e I m a g e (&temp1 ) ;
cvReleaseMat (&proy ) ;
cvReleaseMat (& s c a l e ) ;
return r e s u l t a d o ;

/**\brief Cuenta el numero de valles bajo el limite inferior


*
* cuenta el numero de picos bajo el limite_inferior, que tengan como
* predecesor a un pico sobre el limite superior, y que ademas esten
* separados una distancia entre dmin y dmax. No toma en consideracion
* la regularidad de los valles, es decir q no considera el ancho que
* tengan los picos sobre el limite_superior. Esto podria mejorarse.
*
* \param scale es la proyeccion vertical
* \param minsdv es el limite_inferior
* \param avg es el limite_superior
* \param dmin es la distancia minima
* \param dmax es la distancia maxima
*/
int
picos_bajo_minsdv (CvMat * s c a l e , float minsdv , float avg , int dmax , int dmin )

int
int
int
for

picos = 0 , i ;
picoanterior = 0;
espico = 1;
( i = 1 ; i < s c a l e >c o l s 1 ; i ++)
if ( cvGetReal1D ( s c a l e , i 1 ) >= cvGetReal1D ( s c a l e , i )

&& cvGetReal1D ( s c a l e , i ) <= cvGetReal1D ( s c a l e , i + 1 ) )

//minimomolocal, compara con el pico anterior. por comodidad se asume el


//primer pico en cero
if ( e s p i c o ) {
if ( ( i p i c o a n t e r i o r ) > dmin && ( i p i c o a n t e r i o r ) < dmax&& cvGetR

p i c o s ++;
picoanterior = i ;
e s p i c o =0;

else

if ( cvGetReal1D ( s c a l e , i ) < minsdv )

picoanterior = i ;

if ( cvGetReal1D ( s c a l e , i 1 ) <= cvGetReal1D ( s c a l e , i )

{
}

&& cvGetReal1D ( s c a l e , i ) >= cvGetReal1D ( s c a l e , i + 1)&& cvGetReal1D ( s c a l e , i ) > avg )


espico = 1;

return p i c o s ;

APNDICE A. CDIGO FUENTE


370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423

/**\brief Cuenta el numero de picos sobre el limite_superior


*
* cuenta el numero de picos bajo el limite_superior, que tengan como
* predecesor a un pico bajo el limite_inferior, y que ademas esten
* separados una distancia entre dmin y dmax. No toma en consideracion
* la regularidad de los picos, es decir q no considera el ancho que
* tengan los valles bajo el limite_inferior. Esto podria mejorarse.
*
* \param scale es la proyeccion vertical
* \param minsdv es el limite_inferior
* \param avg es el limite_superior
* \param dmin es la distancia minima
* \param dmax es la distancia maxima
*/
int
picos_sobre_avg

( CvMat

double

scale ,

float

avg ,

int

minsdv ,

dmax ,

int

dmin )

int
int
int
for

picos

esvalle

0,
=

i ;
1;

picoanterior
( i

1;

<

0;

scale

> c o l s

1;

i ++)

if

( cvGetReal1D

( scale ,

&& c v G e t R e a l 1 D

( scale ,

1 ) <=
i ) >=

cvGetReal1D
cvGetReal1D

( scale ,
( scale ,

i )
i

1))

//maximolocal, compara con el pico anterior. por comodidad se asume el


//primer pico en cero
if

( esvalle )
{

if

(( i

&& c v G e t R e a l 1 D

picoanterior )
( scale ,

i )

>

>

dmin &&

( i

picoanterior )

< dmax

avg )

{
p i c o s ++;
picoanterior

i ;

e s v a l l e =0;
}

else
{

if

( cvGetReal1D

( scale ,

i )

>

avg )

{
picoanterior

i ;

}
}
}
}

if

( cvGetReal1D

( scale ,

&& c v G e t R e a l 1 D

( scale ,

1 ) >=
i ) <=

cvGetReal1D
cvGetReal1D

( scale ,
( scale ,

{
esvalle

1;

}
}

return

picos ;

A.4.
1
2
3
4
5
6
7
8
9
10
11
12

129

INTEGRACION OCR

# ! / b i n / bash
#Archivo v l p r
# E s t e s c r i p t a n a l i z a l a s i m a g e n e s e n f o r m a t o JPG
# u b i c a d a s e n e l d i r e c t o r i o u s a d o como a r g u m e n t o .
# E l r e s u l t a d o d e l a n a l i s i s e s g u a r d a d o e n una p a g i n a
# web e n e s e d i r e c t o r i o . S i s e d i s p o n e d e l n a v e g a d o r
# M o z i l l a , e l r e s u l t a d o s e a b r e en e s e n a v e g a d o r .
#
# Uso : v l p r [ D i r e c t o r i o ]
IMAGESDIR=$ 1

i )
i

+ 1)&&

cvGetReal1D

( scale ,

i )

<

minsdv )

APNDICE A. CDIGO FUENTE


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

BINDIR=/home / d i e g o / p r o c e s o / s c r i p t s

130
#d i r e c t o r i o

contiene

los

scripts

de

#v l p d
ACTUALDIR=$PWD

if

[[

$# !=

]]

then

echo
echo

vlpr :

Integracion

entre

vlpd

el

ocr

echo
echo

Uso :

vlpr

directorio

de

prueba

echo
exit

fi

#se

ejecuta

tester

$BINDIR/ t e s t e r

sobre

#se

procesa . log

cat

$IMAGESDIR / . l o g | t r

con

el

mozilla

cd

browser
file :

con

directorio

| tee

parse1

" ? " | $BINDIR / p a r s e 1

#abre

el

$IMAGESDIR

ese
"

de

imagenes ,

se

guarda

en

. log

$IMAGESDIR / . l o g

es

" | tr

el

resultado
"(" | tr

")" | tr

> $IMAGESDIR/ r e s u l t a d o s . h t m l

el

resultado

///$IMAGESDIR/resultados.html &

$ACTUALDIR

exit

# ! / b i n / bash
#
#Archivo t r a i n i n g
# E s t e s c r i p t de bash s e e n c a r g a de r e a l i z a r l a i n t e g r a c i o n e n t r e
#programa v l p d y e l r e c o n o c e d o r o p t i c o de c a r a c t e r e s .
#
# A n a l i z a l a s f o t o g r a f i a s en f o r m a t o j p g u b i c a d a s en e l d i r e c t o r i o
# p a s a d o como a r g u m e n t o . M u e s t r a e n p a n t a l l a l o s c a r a c t e r e s no
# r e c o n o c i d o s p o r e l OCR y e s p e r a e n t r a d a d e l u s u a r i o . Usado p a r a
# e n t r e n a r e l OCR.
#
# Uso : t r a i n i n g [ d i r e c t o r i o ]
#
IMAGESDIR=$ 1
VLPD=v l p d

#E l

#l a

directorio

ubicacion

OCR=/ u s r / b i n / g o c r

del

donde

estan

programa

#U b i c a c i o n

del

las

fotografias

el

analizar

vlpd

OCR

ACTUALDIR=$PWD
DBDIR=~/ v l p d / db #u b i c a c i o n

if

[[

$# !=

]]

de

la

base

de

datos

del

OCR

then

echo
echo

tester :

utilidad

para

integrar

vlpd

gocr

echo
echo

Uso :

tester

directorio

de

prueba

echo
exit

fi

#Si

no

#echo
cd

existe

la

Generando

base

de

datos

la

crea .

lista

de

archivos .

$IMAGESDIR

for

file

in

*. jpg

$file

#t r a b a j a m o s

solamente

con

archivos

terminados

do
if

echo

No

exit

] ; then

h ay

archivos

jpg

en

el

directorio

$IMAGESDIR

fi

echo
echo

$IMAGESDIR/ $ f i l e

f i l e o u t =$IMAGESDIR / ` e c h o

$ f i l e | cut

"."

f 1

en

jpg

APNDICE A. CDIGO FUENTE


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

#e c h o

if

$VLPD

131

$fileout

$file

$fileout

then

let

"SUCCESS += 1 "

let

"NUMBERTOTAL +=1"

else
continue
fi

#t r a n s f o r m a
#asume

una

convert

la

salida

placa

$fileout

por

de

vlpd

pgm

para

el

OCR

fotografia

0 . png

$ f i l e o u t . pgm
rm

$fileout

#mv

#R e a l i z a

$OCR

0 . png

/ home / d i e g o / p l a c a . pgm

el

/ home / d i e g o / p r o c e s o / r e s u l t a d o s / $ f i l e . pgm

reconocimiento

$DBDIR

ASCII

de

los

130

caracteres

650

"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "

$ f i l e o u t . pgm
echo

let

"NUMBERTOTAL += 1 "

done
echo
cd

E x i t o s=$SUCCESS ,

Fotografias

e v a l u a d a s=$NUMBERTOTAL

$ACTUALDIR

exit

# ! / b i n / bash
#
#Archivo t e s t e r
# E s t e s c r i p t de bash s e e n c a r g a
#programa v l p d y e l r e c o n o c e d o r
#por e l s c r i p t v l p r
#
IMAGESDIR=$ 1
VLPD=v l p d

#E l

#l a

directorio

ubicacion

OCR=/ u s r / b i n / g o c r

del

de

realizar

optico

donde

estan

programa

#U b i c a c i o n

del

de

la

integracion

caracteres .

las

Es

fotografias

entre

el

llamado

analizar

vlpd

OCR

ACTUALDIR=$PWD

if

[[

$# !=

]]

then

echo
echo

tester :

utilidad

para

integrar

vlpd

gocr

echo
echo

Uso :

tester

directorio

de

prueba

echo
exit

fi

#echo
cd

Generando

lista

de

archivos .

$IMAGESDIR

for

file

in

*. jpg

$file

#t r a b a j a m o s

solamente

con

archivos

terminados

do
if

echo

No

exit

] ; then

h ay

archivos

jpg

en

el

directorio

$IMAGESDIR

fi

echo
echo

$IMAGESDIR/ $ f i l e

f i l e o u t =$IMAGESDIR / ` e c h o
#e c h o

if

$VLPD

$fileout

$file

$fileout

then

let

"SUCCESS += 1 "

let

"NUMBERTOTAL +=1"

else
continue

$ f i l e | cut

"."

f 1

en

jpg

APNDICE A. CDIGO FUENTE


45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

132

fi

#t r a n s f o r m a
#asume
#l a

una

imagen

convert

la

salida

placa

por

devuelta

$fileout

de

vlpd

pgm

fotografia ,
por

0 . png

vlpd

para

el

solamente

terminada

OCR
toma

0. png

en

$ f i l e o u t . pgm
rm

$fileout

#R e a l i z a
$OCR

0 . png

el

reconocimiento

de

los

/ home / d i e g o / p r o c e s o / db /

caracteres

m 2 d
\

ASCII

450

"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 "

$ f i l e o u t . pgm
echo

let

"NUMBERTOTAL += 1 "

done
echo
cd

E x i t o s=$SUCCESS ,

Fotografias

e v a l u a d a s=$NUMBERTOTAL

$ACTUALDIR

exit

# ! / u s r / b i n / gawk f
#Archivo parse1
# e s llamado por e l s c r i p t v l p r
# E s t e s c r i p t toma l o s r e s u l t a d o s p r o d u c i d o s
# y l o s p r e s e n t a e n f o r m a d e una p a g i n a web
BEGIN

FS =

por

vlpr

" \ n " ; RS=" \ n \ n " ;

print

"<h t m l> <h e a d> < t i t l e >

print

"<h1

print

"<p r e >"

print

"

a l i g n =c e n t e r e d >

Resultados

Resultado

de

del

VLPD</ t i t e > </he a d><body>"

Reconocimiento

</h1>"

/ jpg /

"

if ( l e n g t h ( $ 3 ) > 6 | | l e n g t h ( $ 3 ) < 6 )
print

"<a

h r e f =\" f i l e : / / / "

$2

" \"> "

$ 2 "</a>\ t "

print

"<a

h r e f =\" f i l e : / / / "

$2

" \"> "

$2

"<b>ERROR_R</b>

else
"</a>\ t "

};

/ Exitos /

END {

{ print }

print

"</ p r e >"

print

"<p>"

print

"</body></h t m l>"

NR

"

registros

analizados

</p>

"

$3

\t"

$3

ANEXO B
MANUAL DE USUARIO

133

Manual de Usuario
Programa para la deteccion automatica
del n
umero placa en fotografas de vehculos
vlpd version 0.1. Junio 03, 2006.

Diego F. Asanza.

Esta edicion del manual es para el programa vlpd (version 0.1, 03 Junio 2006), un programa
de an
alisis de imagen para detectar y recortar las placas de identificaci
on en fotografas de
vehculos.
c 2006 Escuela Politecnica Nacional, Diego F. Asanza.
Copyright
Ladron de Guevara E11-102
Quito-Ecuador
http://www.epn.edu.ec
Este manual de usuario es un documento libre; puede reproducirlo y/o modificarlo bajo los terminos de la version 2 (o, a su eleccion, cualquier version
posterior) de la Licencia General P
ublica GNU tal como ha sido publicada por
la Free Software Foundation.
Este manual se distribuye con la esperanza de que sea u
til, pero sin ninguna
garanta, ni siquiera la garanta implcita de comerciabilidad o adecuacion a un
proposito particular.
Publicado por Diego F. Asanza.

Indice General
1

Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Instalaci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Utilizaci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1 Programa vlpd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Programa training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Programa vlpr. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Limitaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Licencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Captulo 1: Requisitos

1 Requisitos
Antes de instalar vlpd se deben cumplir los siguientes requisitos:
R
R
R
R
o compatibles.
, Centrino
II, III, IV, Celeron
Pentium
1. Procesador Intel
2. Al menos 128 MB de Ram.
3. Linux Kernel 2.6.8 o superior.
4. GNU Compiler Collection (GCC) Version 4.0.2 o superior.
R
Version 0.9-6 Beta 4.
5. Libreras OpenCV
Vlpd ha sido probado sobre las distribuciones de Linux:
Ubuntu version 6.06 LTS "Dapper Drake"
Ubuntu version 5.10 "Breezy Badger"
Debian version 3.01 "Sarge"
por lo que se recomienda su utilizacion. Este documento asume que se dispone de una
de estas distribuciones de Linux. Para mas informacion respecto a como conseguir estas
distribuciones, puede dirigirse a las siguientes direcciones electronicas:
P
agina Web del proyecto Debian: http://www.debian.org
P
agina Web del proyecto Ubuntu: http://www.ubuntu.com

Captulo 2: Instalacion

2 Instalaci
on
Luego de conseguir las funtes de vlpd, y antes de proceder con su instalacion es neceR
R
puede
. La instalacion de OpenCV
sario conseguir e instalar las libreras OpenCV
hacerse mediante las fuentes, que pueden descargarse de la pagina web del proyecto en
http://opencv. sourceforge.net, o por medio de los binarios, disponibles como *.deb o
*.rpm.
R
estan disponibles para aquellos que
En Debian y Ubuntu, los binarios de OpenCV
tienen una conexion a internet usando la herramienta apt en los repositorios oficiales. En
este caso para instalar las libreras se ejecutan los siguientes comandos en el bash:
para Ubuntu
#apt-get update
#apt-get install libcvaux-dev libcv-dev libhighgui-dev libglib2.0-dev
para Debian
#apt-get update
#apt-get install libopencv-dev libglib2.0-dev
Hay que recalcar que las libreras OpenCV aun estan en la etapa Beta de desarrollo,
lo que significa que pueden haber diferencias entre versiones, por lo que se recomienda
encarecidamente se use la version 0.9-6 Beta4, la cual esta disponible con Ubuntu 6.06.
Luego de tener instaladas las libreras OpenCV, se puede instalar vlpd. Para eso hay
que seguir los siguientes pasos
1. Conseguir las fuentes de VLPD. Estas estan disponibles en el CD que acompa
na este
manual.
2. Descomprimir las fuentes, esto se consigue ejecutando el siguiente comando:
diego@netstar:~/vlpd$ tar -zxvf vlpd_0.1.tar.gz
3. Ejecutar el script de autoconfiguracion
diego@netstar:~/vlpd$ ./configure
Este verifica que esten disponibles todas las libreras necesarias para compilar el programa, y tambien verifica la version del compilador disponible. Si todo es correcto
construye los Makefiles necesarios para compilar el programa.
4. Compilar el programa
diego@netstar:~/vlpd$ make
5. Instalar el programa
diego@netstar:~/vlpd$ su
Password:
diego@netstar:~/vlpd# make install
Esto instala los ejecutables del programa en la carpeta /usr/bin. Si se desea cambiar la
carpeta de instalacion, se debe ejecutar lo siguiente en el paso 2, (por ejemplo, para instalar
en /home/rats:
diego@netstar:~/vlpd$ ./configure --prefix=/home/rats
Para ver todas las opciones de compilacion e instalacion:

Captulo 2: Instalacion

diego@netstar:~/vlpd$ ./configure --help


Si se desea realizar reconocimiento de caracteres sobre las placas detectadas se debe
instalar el programa gocr, el cual esta disponible tambien mediante los repositorios oficiales.
Para instalar gocr:
root@developOne~#apt-get update
root@developOne~#apt-get install gocr
GOCR solamente acepta imagenes en formato PGM y PBM. Ya que VLPD proporciona
su salida en formato PNG, es necesario usar un programa para la conversion entre formatos.
El programa convert que viene con imagemagick es recomendado.
Para instalar el programa convert:
root@developOne~#apt-get install imagemagick
Unos scripts se proporcionan para la integracion der OCR con el programa vlpd. Estos
se llaman vlpr, training, tester y parse1. Estos se encuentran en la carpeta vlpd-0.1/scripts/
. Para usarlos comodamente copielos a la carpeta /usr/bin, o a cualquier otra ubicacion en
su path. Estos scripts necesitan que vlpd, gocr y convert esten instalados.

Captulo 3: Utilizacion

3 Utilizaci
on
Se deben colocar las fotografas a procesar en una carpeta, por ejemplo ~/fotografias.
Estas fotografas deben estar en formato jpg, y poseer una resolucion de 640x480 pixeles.
Luego ejecutar vlpr ~/fotografias. Se puede tardar algunos minutos en procesar
todas las fotografas. Una vez procesadas, se obtiene un archivo con el nombre de
~/fotografias/resultado.html en la carpeta que se paso como argumento al programa.
Este archivo muestra un enlace a la fotografa, y el resultado del reconocimiento. En
caso de un error en la deteccion o el reconocimiento, se muestra el mensaje ERROR.
vlpd consta en realidad de tres programas. A continuacion se describe el uso y la sintaxis
de cada uno de ellos:

3.1 Programa vlpd


Sintaxis: vlpd [opciones] archivo_entrada archivo_salida: Es el programa principal.
Archivo entrada es la fotografa en formato jpg, de la parte frontal o posterior de un
vehculo. Archivo salida es el prefijo con el que se guardaran los archivos que contienen
las placas (en caso de haber mas de una)detectadas y recortadas por vlpd de la fotografa
pasada como archivo entrada.
Archivo salida es solo el prefijo, y tiene formato png. Los archivos de salida son guardados siempre como prefijo-x.png donde x corresponde a un n
umero que empieza en cero y

aumenta conforme aumenta el n


umero de placas detectadas en la fotografdotlessia.

Vlpd soporta las siguientes opciones de ldotlessinea


de comandos.
-v, la cual muestra la salida de depuracion del programa en stdout.
-u umbral, Por defecto, vlpd efectua el filtrado final usando el metodo de Otsu para
determinar el nivel optimo. El valor especificado con este parametro es un divisor para
este umbral optimo. Permite disminuir el umbral de tal forma que solo las zonas mas
obscuras de la imagen sobresalgan. Puede ser un n
umero cualquiera mayor que cero.
El valor por defecto es 1,6.
-c max_cos. Es un numero entre 0 y 1, especifica el valor maximo del coseno que
puede tener el angulo entre dos lados adyacentes de un rectangulo encontrado en la
imagen, para ser considerado candidato a placa. El valor por defecto es 0,3.
-r min_rel. Es un n
umero mayor que cero y menor que max rel. Representa la
relacion mnima entre el lado mas amplio y el mas angosto de los rectangulos detectados
para ser considerado candidato a placa. El valor por defecto es 1,3.
-R max_rel, Es un n
umero mayor que min rel. Representa el maximo valor de la
relacion entre lados para que el rectangulo detectado sea considerado candidato a placa.
El valor por defecto es 2,7.
-w width Es un numero entero que representa el ancho en pxeles de la imagen resultado. El valor por defecto es 100.
-h height, Es un n
umero entero que representa el alto en de la imagen resultado.
El valor por defecto es 50.
-a min_area, El area mnima que debe poseer un rectangulo encontrado para ser
considerado placa de identificacion. Es un n
umero entero.El valor por defecto es 450.

Captulo 3: Utilizacion

-A max_area, El area maxima que debe poseer un rectangulo encontrado para ser
considerado placa de identificacion. Es un n
umero entero, mayor que min area. El
valor por defecto es 50000.
-D dp_dist_min. El error tolerable para el mecanismo de aproximacion poligonal
usando Douglas-Peuker. Es un n
umero positivo, que es multiplicado por el perimetro
del contorno. El valor por defecto es 0,025.
-s std_dev_min_val. Valor mnimo de la desviacion estandard de l proyeccion vertical sobre el cual esta es considerada perteneciente a un rectangulo que contiene la
placa de identificacion. Su valor por defecto es 0,12
-S std_dev_max_val Valor maximo de la desviacion estandard de l proyeccion vertical
bajo el cual esta es considerada como perteneciente a una placa de identificacion. Su
valor por defecto es 0,22.
-p avg_min_valValor mnimo de la media artmetica de la proyeccion vertical sobre
el cual esta es considerada como perteneciente a una placa de identificacion. Su valor
por defecto es 0,5.
-P avg_max_valValor maximo de la media artmetica de l proyeccion vertical bajo el
cual esta es considerada como perteneciente a una placa de identificacion. Su valor por
defecto es 0,8.
-k pk_min_sepSeparacion mnima en pixeles de los picos en la proyeccion vertical. Es
un n
umero entero. Su valor por defecto es 5.
-K pk_max_sepSeparacion maxima en pixeles de los picos de la proyeccion vertical.
Su valor por defecto es 30. Es un n
umero entero.
-U pk_max_upN
umero de picos que debe presentar la proyeccion vertical para ser
considerada placa. Es un n
umero entero. Su valor por defecto es 4.
-d pk_max_downN
umero de valles que debe presentar la proyeccion vertical para ser
considerada placa. Es un n
umero entero. Su valor por defecto es 4.
-C max_area_comun Es el area que deben compartir dos rectangulos para ser considerados ser uno solo. Por ejemplo si es el treinta por ciento del area, este valor deberia
ser 1,3. Si es el 45%, 1,45, etc.

3.2 Programa training


Sintaxis: training directorio: Es el programa de entrenamiento del ocr. toma como
argumentos un directorio que contiene las fotografas a procesar. En caso de no reconocer
los caracteres en una fotografa, traininig muestra la imagen no reconocida y espera a que
el usuario ingrese el caracter o la cadena de caracteres correspondientes.
Nota: Una cadena de caracteres debe encerrarse entre comillas dobles (" ").
Luego training pregunta si se desea guardar la equivalencia de forma permanente.
Digitese 0 para no guardar, 1 para guardar en la memoria temporal, 2 para guardar permanentemente en la base de datos.
La base de datos del reconocedor de caracteres se encuentra en ~/vlpd/db.

3.3 Programa vlpr


Sintaxis: vlpr directorio: Este programa realiza el reconocimiento de n
umero de matricula. Recibe como argumentos el directorio que contiene las fotografias a procesar. Devuelve

Captulo 3: Utilizacion

como salida un archivo en ~/directorio_analizado/resultado.html que contiene la


lista de los numeros de placa, en formato html, y con un link hacia la ubicacion fisica de
cada una de las fotografias procesadas.

Captulo 4: Limitaciones

4 Limitaciones
Vlpd funcina por el momento con fotografas jpg. Las fotografas deben ser tomadas entre
40cm a tres metros de distancia al vehculo. La resolucion recomendada es de 640x480,
aunque puede usar fotografias de mayor resolucion.
Vlpd usa un algoritmo de deteccion de contornos para la deteccion de la placa, lo que
requiere que esta este en buenas condiciones y presente un claro contraste con respecto al
resto del vehculo.
El programa actualmente presenta una efectividad del 75.8% en la deteccion de placa, y
aproximadamente del 54% en el reconocimiento de los caracteres de placa. Mientras mayor
la resolucion de las fotografas, mayor la probabilidad de deteccion.
Actualmente presenta problemas en la deteccion de placa especialmente cuando no existe
el suficiente contraste entre la placa y el fondo. La probabilidad de deteccion cae hasta casi
el 3% en fotografas con estas caractersticas.
Vlpd funciona con placas que se ajusten a las caractersticas especificadas en la legislacion
de la Rep
ublica de Ecuador. Especficamente aquellas con un solo color de fondo, y seis
caracteres (tres letras y tres n
umeros).
Vlpr asume que las fotografias contienen una u
nica placa detectable

Captulo 5: Licencia

5 Licencia
VLPD se distribuye con la esperanza de que le sea u
til, pero SIN NINGUNA GARANTIA;
sin incluso la garanta implcita de MERCANTIBILIDAD o IDONEIDAD PARA UN

PROPOSITO
PARTICULAR. El autor rechaza toda responsabilidad por da
nos o
perjuicios que se puedan producir por el uso de este programa.

Captulo 5: Indice

Indice
D

Debian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Formatos de Imagen . . . . . . . . . . . . . . . . . . . . . . . . . . 7

OCR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1, 2

G
Garantia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
GCC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

I
Instalaci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

P
Pentium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Kernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Reconocimiento Optico
de Caracteres
.......... 3
Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Resoluci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Licencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Limitaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Ubuntu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Utilizaci
on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

ANEXO C
DIMENSIONES DE LAS PLACAS VEHICULARES

146

ANEXO D
ALGORITMO DE DETECCIN DE CONTORNOS

148

Este documento se ha escrito usando unicamente herramientas libres. Entre otras, se


usaron GIMP, LATEX 2 , TEX, Xg, gnuplot.

Вам также может понравиться