body margin notes...header body footer margin notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2...

184
Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6

Upload: others

Post on 21-Aug-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Header

Body

Footer

MarginNotes

i8� -

i7

?

6

i1� -

�-i3

i10�-

�-i9

6

?

i11

i2

?

6

6

?

i4

6

?

i5

6

?

i6

1 one inch + \hoffset 2 one inch + \voffset

3 \oddsidemargin = 13pt 4 \topmargin = -23pt

5 \headheight = 12pt 6 \headsep = 25pt

7 \textheight = 688pt 8 \textwidth = 441pt

9 \marginparsep = 10pt 10 \marginparwidth = 35pt

11 \footskip = 30pt \marginparpush = 7pt (not shown)

\hoffset = 0pt \voffset = 0pt

\paperwidth = 597pt \paperheight = 845pt

Page 2: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ESCUELA POLITÉCNICA NACIONAL

ESCUELA DE INGENIERÍA

DISEÑO DE UN MÓDULO DE PREPROCESAMIENTO YEXTRACCIÓN DE CARACTERÍSTICAS FÍSICAS DE IMAGEN PARA

UNA APLICACIÓN DE RECONOCIMIENTO AUTOMÁTICO DELNÚMERO DE PLACA DE AUTOMÓVILES

PROYECTO PREVIO A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN

ELECTRÓNICA Y TELECOMUNICACIONES

DIEGO FERNANDO ASANZA MALDONADO

DIRECTOR: MSc. RAMIRO MOREJÓN

Quito, Octubre 2006

Page 3: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

DECLARACIÓN

Yo, Diego Fernando Asanza Maldonado, declaro bajo juramento que el trabajo aquí

descrito es de mi autoría; que no ha sido previamente presentado para ningún grado

o calificación profesional; y, que he consultado las referencias bibliográficas que se

incluyen en este documento.

A través de la presente declaración cedo mis derechos de propiedad intelectual

correspondientes a este trabajo, a la Escuela Politécnica Nacional, según lo esta-

blecido por la Ley de Propiedad Intelectual, por su Reglamento y por la normatividad

institucional vigente.

Diego Fernando Asanza Maldonado

Page 4: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CERTIFICACIÓN

Certifico que el presente trabajo fue desarrollado por Diego Fernando Asanza Maldo-

nado, bajo mi supervisión.

MSc. Ramiro Morejón

DIRECTOR DE PROYECTO

Page 5: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

AGRADECIMIENTOS

Doy las gracias a mis Padres, por haber dedicado tanto tiempo y esfuerzo a mi

educación. Sin ellos, nada de esto habría sido posible. Doy las gracias también a

mis hermanas, sobrinos, y al resto de mi familia, por su apoyo y colaboración.

Agradezco también a mis maestros, por haber tenido la paciencia y generosidad de

compartir con nosotros sus conocimientos, los cuales espero saber usar adecua-

damente. En especial, quisiera agradecer a mi director de proyecto, por su ayuda y

acertadas sugerencias, y por el tiempo dedicado a la revisión y corrección de este

trabajo.

También agradezco a mis amigos y compañeros, con quienes tuve el honor de

compartir estos años de universidad. Gracias por su ayuda y consejos.

Tambien doy las gracias a las personas del departamento de señalizacion de la

Policia Nacional, por su ayuda y la información 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 elaboración de este pro-

yecto. Gracias por su generosidad. Espero que, algún día, todos podamos vivir en

un mundo en el que las ideas circulen libremente, sin que haya personas que les

pongan precio.

Diego F. Asanza

Page 6: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

DEDICATORIA

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

Page 7: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CONTENIDO

RESUMEN XVI

PRESENTACIÓN XVII

1. PRELIMINARES 1

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

1.1.1. DIMENSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1.1.2. COLORES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.3. MATERIAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.4. MONTAJE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2. DEFINICIÓN DEL MÓDULO A DISEÑAR . . . . . . . . . . . . . . . . 4

1.3. RESTRICCIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

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

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

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

1.3.4. TOMA DE LAS FOTOGRAFÍAS . . . . . . . . . . . . . . . . . 6

V

Page 8: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CONTENIDO VI

2. DESCRIPCIÓN DEL MÓDULO 7

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

2.1.1. MÉTODOS BASADOS EN LA PROYECCIÓN LATERAL DE

LA IMAGEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.1.2. MÉTODOS BASADOS EN EL ANÁLISIS DE COMPONEN-

TES CONECTADOS . . . . . . . . . . . . . . . . . . . . . . . . 12

2.1.3. MÉTODOS DE COMPARACIÓN . . . . . . . . . . . . . . . . . 14

2.1.4. DETECCIÓN DE FIGURAS GEOMÉTRICAS . . . . . . . . . . 16

2.2. CONSIDERACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.3. DESCRIPCIÓN DEL SISTEMA A IMPLEMENTAR . . . . . . . . . . . 18

2.3.1. PREPROCESAMIENTO . . . . . . . . . . . . . . . . . . . . . . 19

2.3.2. DETECCIÓN DE RECTÁNGULOS . . . . . . . . . . . . . . . . 25

2.3.3. SELECCIÓN Y FILTRADO . . . . . . . . . . . . . . . . . . . . 31

2.3.4. INTERFAZ DE USUARIO . . . . . . . . . . . . . . . . . . . . . 35

3. IMPLEMENTACIÓN 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. LIBRERÍAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

3.1.5. OPENCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

Page 9: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CONTENIDO VII

3.2. IMPLEMENTACIÓN DEL SISTEMA . . . . . . . . . . . . . . . . . . . 42

3.2.1. ETAPA DE PRE-PROCESAMIENTO DE IMAGEN . . . . . . . 42

3.2.2. ETAPA DE DETECCIÓN DE RECTÁNGULOS . . . . . . . . . 46

3.2.3. ETAPA DE SELECCIÓN Y FILTRADO . . . . . . . . . . . . . . 50

3.3. EVALUACIÓN DE COSTOS . . . . . . . . . . . . . . . . . . . . . . . . 66

4. EVALUACIÓN 70

4.1. MUESTRAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

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

4.2.1. EFECTIVIDAD EN LA DETECCIÓN . . . . . . . . . . . . . . . 74

4.2.2. PREPROCESAMIENTO . . . . . . . . . . . . . . . . . . . . . . 77

4.2.3. DETECCIÓN DE RECTÁNGULOS . . . . . . . . . . . . . . . . 79

4.2.4. SELECCIÓN Y FILTRADO . . . . . . . . . . . . . . . . . . . . 80

4.3. ANÁLISIS DE RESULTADOS . . . . . . . . . . . . . . . . . . . . . . . 80

4.4. RECONOCIMIENTO DE CARACTERES . . . . . . . . . . . . . . . . 83

4.4.1. GOCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

4.4.2. INTEGRACIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

4.4.3. RESULTADOS EXPERIMENTALES . . . . . . . . . . . . . . . 86

5. CONCLUSIONES Y RECOMENDACIONES 88

5.1. CONCLUSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

5.2. RECOMENDACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Page 10: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CONTENIDO VIII

BIBLIOGRAFÍA 97

A. CÓDIGO FUENTE 101

A.1. ENUMERACIÓN 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. DETECCIÓN DE RECTANGULOS, SELECCIÓN 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 DETECCIÓN DE CONTORNOS 148

Page 11: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE FIGURAS

1.1. Placa Ecuatoriana para vehículos particulares . . . . . . . . . . . . . 2

2.1. Ilustración del proceso de proyección. El vector Ph[y] representa la

proyección horizontal. Pv[x] la proyección vertical . . . . . . . . . . . . 8

2.2. Fotografía de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.3. Proyección horizontal de la imagen de la Figura 2.2 . . . . . . . . . . 9

2.4. Aplicación del operador de Sobel para la detección de bordes verticales 10

2.5. Proyección horizontal de la Figura 2.4 . . . . . . . . . . . . . . . . . . 10

2.6. Segmentación de regiones de interés usando los picos de la proyec-

ción horizontal de la Figura 2.5 . . . . . . . . . . . . . . . . . . . . . . 11

2.7. Proyección vertical de una de las regiones de interés de la Figura 2.6

y firma característica de la placa . . . . . . . . . . . . . . . . . . . . . 11

2.8. Ejemplos de vecindad de los píxeles grises respecto al negro [14]. (a)

4-vecindad, (b) 8-vecindad, (c) 6-vecindad . . . . . . . . . . . . . . . 13

2.9. Imagen de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.10.Marcación de elementos conectados . . . . . . . . . . . . . . . . . . . 14

2.11.Agrupación de elementos cercanos . . . . . . . . . . . . . . . . . . . 14

2.12.Imagen Patrón [15] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

IX

Page 12: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE FIGURAS X

2.13.Imagen de prueba para el método de comparación [15] . . . . . . . . 15

2.14.Correlación entre la imagen de las Figuras 2.12 y 2.13. Se ha obs-

curecido intencionalmente las zonas menos brillantes de la imagen

[15] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.15.Sistema para la detección de placa . . . . . . . . . . . . . . . . . . . . 19

2.16.Etapa de preprocesamiento de imagen . . . . . . . . . . . . . . . . . 19

2.17.(a) Imagen original. (b) Binarización sobre el componente de lumi-

nancia. (c) Binarización sobre el componente azul de la imagen. (d)

Binarización sobre el componente rojo de la imagen.(e) Binarización

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 iluminación . . . . . . . . . . . . . . . . . . . . . . . 24

2.21.Binarización a un nivel de 117 determinado por el método de Otsu de

la imagen de la Figura 2.20 . . . . . . . . . . . . . . . . . . . . . . . . 25

2.22.Binarización a un nivel de 64 de la imagen de la Figura 2.20 . . . . . 25

2.23.Etapa de detección de rectángulos . . . . . . . . . . . . . . . . . . . . 26

2.24.Imagen de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2.25.Binarización 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.Aproximación poligonal . . . . . . . . . . . . . . . . . . . . . . . . . . 28

2.28.Rectángulos encontrados en los contornos de la Figura 2.26 . . . . . 29

2.29.Rectángulos duplicados . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.30.Etapa de Selección y Filtrado . . . . . . . . . . . . . . . . . . . . . . . 31

Page 13: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE FIGURAS XI

2.31.Transformación geométrica . . . . . . . . . . . . . . . . . . . . . . . . 31

2.32.Placa recortada luego del proceso de transformación geométrica. . . 33

2.33.Proyección vertical de la Figura 2.32. Nótese la secuencia de picos

que forman la “Firma Característica” . . . . . . . . . . . . . . . . . . . 33

2.34.Efectos de las operaciones morfológicas. (a)dilatación, (b) erosión [27] 34

2.35.Filtrado de la imagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.1. Diagrama de flujo general del método de detección de placa propuesto. 43

3.2. Procedimiento para aplicar una LUT. . . . . . . . . . . . . . . . . . . . 45

3.3. Procedimiento de ecualización . . . . . . . . . . . . . . . . . . . . . . 45

3.4. Variación de el número de placas detectadas de acuerdo al nivel de

umbral usado en las fotografías de prueba. . . . . . . . . . . . . . . . 46

3.5. Diagrama de flujo de la etapa de detección de rectángulos . . . . . . 47

3.6. Ángulo entre lados adyacentes . . . . . . . . . . . . . . . . . . . . . . 48

3.7. Ángulos de los contornos encontrados en las fotografías de prueba . 49

3.8. Relación entre lados de los contornos de prueba . . . . . . . . . . . . 49

3.9. Eliminación de duplicados . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.10.Diagrama de flujo de la etapa de selección y filtrado . . . . . . . . . . 52

3.11.Rectángulo detectado . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

3.12.Rectángulo normalizado. La placa de la Figura 3.11 se ha desplazado

a la parte superior izquierda . . . . . . . . . . . . . . . . . . . . . . . . 54

3.13.Proyección vertical de una placa típica . . . . . . . . . . . . . . . . . . 54

3.14.Procedimiento de análisis de la proyección vertical . . . . . . . . . . . 56

Page 14: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE FIGURAS XII

3.15.Promedio de la proyección vertical en el conjunto de imágenes de

prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.16.Desviación estándar de la proyección vertical en el conjunto de imá-

genes de prueba que contienen la placa de identificación . . . . . . . 58

3.17.Desviación estándar de la proyección vertical en el conjunto de imá-

genes de prueba que no contienen la placa de identificación . . . . . 59

3.18.Número de picos sobre el límite superior en las fotografías de prueba 61

3.19.Número de valles bajo el limite inferior en las fotografías 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 módulo. (a) Detección Correcta y (b) Dis-

torsión 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 binarización (a)correcta (b)incorrecta . . . . . . . . . . . 78

4.6. Fotografía que presento errores en la eliminación de duplicados . . . 80

4.7. Ejemplo de fotografía en la que falló el análisis de la proyección vertical 81

4.8. Proyección vertical para la placa de la Figura 4.7 . . . . . . . . . . . . 81

4.9. Ejemplo de fotografía con poco contraste entre la placa y el vehículo . 82

4.10.Muestra de la base de datos del OCR . . . . . . . . . . . . . . . . . . 86

Page 15: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE FIGURAS XIII

4.11.Ejemplo de imágenes que producen errores en el OCR. Errores de

ambigüedad (a) Similitud entre 6 y G, (b) Similitud entre 0 y O. (c)

Errores en la fotografía a reconocer . . . . . . . . . . . . . . . . . . . 87

5.1. Ejemplo de un marco porta-placa . . . . . . . . . . . . . . . . . . . . . 91

5.2. Ejemplo de fuente usada en placas Alemanas . . . . . . . . . . . . . 92

5.3. Optimización del método de detección de placa . . . . . . . . . . . . . 94

5.4. Método alterno para la detección de placa . . . . . . . . . . . . . . . . 95

5.5. Efecto de la operación morfológica apertura con un elemento estruc-

turante horizontal en el método de la Figura 5.4. Nótese las líneas

paralelas que se forman alrededor de los caracteres de la placa . . . 95

Page 16: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE CUADROS

2.1. Comparación de métodos de detección de placa . . . . . . . . . . . . 17

3.1. Características del hardware usado . . . . . . . . . . . . . . . . . . . 39

3.2. Características del sistema operativo usado . . . . . . . . . . . . . . . 39

3.3. Características del compilador y el depurador . . . . . . . . . . . . . . 40

3.4. Librerías y herramientas de procesamiento de imagen. . . . . . . . . 41

3.5. Puntos para el cálculo de la matriz de transformación . . . . . . . . . 51

3.6. Procedimiento para contar el número de picos . . . . . . . . . . . . . 60

3.7. Procedimiento para contar el número de valles . . . . . . . . . . . . . 62

3.8. Procedimiento para encontrar automáticamente 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 evaluación . . . . . . . . . . . . . . . . . . . . . . . . 75

4.2. Clasificación por contraste . . . . . . . . . . . . . . . . . . . . . . . . . 75

4.3. Resultados de la evaluación del módulo con fotografías que no cum-

plen los requisitos descritos en el Capítulo 1. . . . . . . . . . . . . . . 76

4.4. Tiempos de Ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

XIV

Page 17: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE CUADROS XV

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

4.6. Etapa de preprocesamiento de imagen. Tiempos promedio de ejecución 79

4.7. Tiempos de procesamiento de la etapa de detección de rectángulos . 80

4.8. Tiempos de procesamiento de la etapa de detección de rectángulos . 80

4.9. Clasificación de las etapas según el porcentaje de falsos negativos . . 82

4.10.Resultados de la integración con el OCR . . . . . . . . . . . . . . . . 86

4.11.Categorización de los errores en el reconocimiento de caracteres. . . 87

Page 18: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

RESUMEN

Este trabajo describe un procedimiento que usa la detección de contornos y el aná-

lisis de la proyección vertical, para extraer el segmento de imagen que contiene la

placa de identificación vehicular en fotografías de automóviles.

Ademas, se realiza implementación de dicho procedimiento en lenguaje C. Tam-

bién se exponen las estadísticas de desempeño de esta implementación sobre un

conjunto de imágenes de prueba.

Como parte del proyecto, se prueba el programa desarrollado en conjunto con un

programa de reconocimiento automático de caracteres, con la finalidad de imple-

mentar un sistema de reconocimiento automático de número de matrícula. Se ex-

ponen los resultados de dicha integración.

Finalmente, se exponen las conclusiones y recomendaciones para futuros trabajos

sobre el tema.

XVI

Page 19: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

PRESENTACIÓN

El Reconocimiento Automatico de Número de Matrícula es un método de vigilancia

masiva que usa el reconocimiento óptico de carácteres en imágenes con la finalidad

de leer el número de placa en vehículos1 .

La aplicación de este método se realiza mediante sistemas construidos para este

fin, usando combinaciones de hardware y software. Estos han demostrado ser úti-

les en aplicaciones de monitoreo y control de tráfico, vigilancia de estacionamien-

tos, etc; siendo indispensables cuando es necesario vigilar grandes cantidades de

vehículos.

Estos sistemas se componen generalmente de 4 módulos principales[1]2, estos son:

toma de la imagen, detección de la placa, segmentación de los caracteres y reco-

nocimiento de caracteres. El primer módulo comprende el hardware que realiza la

toma de imagen, pudiendo ser una cámara de vídeo, una cámara fotográfica, u otro

dispositivo similar. También 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 módulo de detección se encarga de encontrar la placa del vehículo en la imagen

capturada y recortarla de la fotografía. Esta imagen recortada es entonces pasada

al módulo de segmentación, el que selecciona y recorta los caracteres para enviar-

los individualmente al módulo de reconocimiento. El resultado de este proceso es

una cadena de caracteres que forman el número de identificación vehicular.

De los cuatro módulos de los que se compone un sistema de reconocimiento auto-

mático de número de matrícula, el encargado de la detección de la placa es consi-

derado uno de los mas importantes [2], ya que su desempeño afecta directamente

a los módulos de segmentación y reconocimiento de caracteres.

1http://en.wikipedia.org/Automatic_number_plate_recognition2Los números entre corchetes[] hacen referencia a un texto en la bibliografía

XVII

Page 20: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ÍNDICE DE CUADROS XVIII

Este documento describe un método para la detección de placa, que utiliza la de-

tección de contornos y el análisis de la proyección vertical para encontrar y recortar

la placa de identificación vehicular de una imagen. Esto es posible debido a que la

placa, por su construcción es una de las zonas mas brillantes de la imagen, y tiene

una forma rectangular característica.

También se realiza la implementación de un módulo de detección de placa basado

en el método descrito. Se presentan además los resultados de la prueba de este

módulo sobre un conjunto de imágenes de prueba. Como parte de estas pruebas,

también se incluye la evaluación de este módulo en conjunto con un sistema de

reconocimiento de caracteres.

No se explica aquí toda la teoría detrás de los procedimientos de procesamiento

de imagen usados. En general se asume que el lector tiene conocimientos sobre

temas como procesamiento digital de imagen, representación digital de la imagen,

almacenamiento, filtrado, etc. Información detallada referente a estos temas puede

encontrarse en los documentos enumerados en la bibliografía. La mayoría de es-

tos documentos se encuentran también en formato electrónico en el CDROM que

acompaña a este trabajo.

El resto de este documento se ha estructurado de la siguiente manera:

En el Capítulo 1 se describe con detenimiento el problema que se pretende resolver.

Se establecen las condiciones generales y los requerimientos de diseño.

En el Capítulo 2 se exponen algunos trabajos realizados anteriormente en esta

área. Luego se describe el diseño del método elegido para la detección de la placa.

En el Capítulo 3 se describe la forma en que se realizó la implementación del mé-

todo de detección de placa. Se realiza un análisis de costos.

En el Capítulo 4 se realiza la evaluación del desempeño de la implementación del

método de detección de placa. Se presenta un ejemplo de uso en conjunto con un

sistema de reconocimiento de caracteres.

El Capítulo 5 contiene conclusiones y recomendaciones para futuros trabajos.

Page 21: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 1

PRELIMINARES

El objetivo de este capítulo es establecer los requerimientos generales así como las

restricciones del sistema a diseñar. Para esto se analizan las características de las

placas y se delimita el ámbito de acción de dicho sistema.

1.1. PLACAS AUTOMOTRICES

Una característica es una parte significativa, local y detectable de una imagen [3].

Cualquier objeto puede ser descrito usando un conjunto mínimo de características.

El reconocimiento de objetos puede definirse como un proceso de búsqueda de las

características de los mismos en la imagen.

Las placas de identificación poseen un conjunto de características 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 mínimo

necesario para identificar las placas vehiculares con el menor margen de error.

Las características de las placas varían de acuerdo a la legislación del país al que

pertenecen. Placas de diferentes países tienen diferentes formas y tamaños. En

Ecuador los artículos 104 a 108 del Reglamento a la Ley de Tránsito y Transporte

Terrestre [4] definen las características para las placas de identificación que deben

poseer aquellos vehículos que circulan por el país.

1

Page 22: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 1. PRELIMINARES 2

1.1.1. DIMENSIONES

El Reglamento a la Ley de Tránsito y Transporte Terrestre no es muy específico

al respecto de las normas de fabricación de las placas. Este reglamento especifi-

ca, en lo referente a las dimensiones, únicamente que tendrán forma rectangular

de 30 cm de ancho y de 15 cm de alto, pero no hay información acerca del alto,

ancho, separación, o fuente tipográfica de las letras que conforman el número de

identificación.

Debido a esta falta de reglamentación, se podría suponer que hay una gran dispa-

ridad en las fuentes y dimensiones de las letras de las placas, pero a causa de que

el Departamento de Señalización de la Policía Nacional es el único habilitado por la

ley para su fabricación, esta disparidad en la práctica no existe.

En el Anexo C se muestra el diagrama de una placa con sus dimensiones típicas.

Este diagrama corresponde a las dimensiones de las placas para vehículos. Ya

que no existe una norma que establezca estas dimensiones, las mismas fueron

tomadas de la matriz para la fabricación que usa el Departamento de Señalización

de la Policía Nacional. Aunque en el reglamento a la ley no se especifica, otras

dimensiones son permitidas para motocicletas.

La Figura 1.1 muestra una placa típica. La letra “D” en la parte superior derecha

indica que se trata de un duplicado.

Figura 1.1: Placa Ecuatoriana para vehículos particulares

Hay que destacar que, aunque la ley dice que las dimensiones de las placas vehi-

culares son 15 cm de alto por 30 cm de ancho, en la práctica 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 fabricación de las placas, traída de Alemania, y que está

actualmente usando el Departamento de Señalización de la Policía Nacional, tiene

esas dimensiones.

Page 23: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 1. PRELIMINARES 3

1.1.2. COLORES

La coloración de las placas varía de acuerdo al tipo de servicio que presta el vehícu-

lo. Los vehículos particulares tienen placas blancas. Los vehículos de alquiler tienen

placas naranjas. Los vehículos pertenecientes a entidades del estado tienen placas

oro o verde. Los vehículos de servicio Diplomático, Consular, Asistencia Técnica y

Organismos Internacionales tienen placas azules. Y los vehículos que se internen

de manera temporal en el territorio ecuatoriano tienen placas rojas. Alrededor de

estas placas hay una línea negra, y las letras y números de identificación son de

color negro.

Hay placas de uso de funcionarios del estado, como presidente o vicepresidente de

la república, que tienen como fondo la bandera del Ecuador.

1.1.3. MATERIAL

Las placas son hechas en lamina metálica de aluminio, y recubiertas con papel

reflectivo grado de ingeniería1, de color acorde al tipo de placa. Las letras están en

relieve de 2 mm y son cubiertas de negro mate.

1.1.4. MONTAJE

El reglamento a la Ley de Tránsito y Transporte Terrestre especifica que las placas

deben ubicarse en la parte frontal y posterior del vehículo, en un lugar claramente

visible. No se prohíbe el uso de marcos o bordes decorativos. Usualmente las placas

son colocadas en lugares previstos para este fin por los fabricantes del vehículo. Las

placas se ubican de tal forma que quedan alineadas con la calzada, en posición

horizontal.1Papel reflectivo grado de ingeniería es una lámina de material reflectivo, cubierto por resina

protectora. La capa reflectiva consiste de particulas de vidrio y pequeñas laminas de metal plateado.Para que esta lámina sea catalogada como grado de ingeniería, debe cumplir ciertas condicionesde reflectancia y durabilidad [5].

Page 24: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 1. PRELIMINARES 4

1.2. DEFINICIÓN DEL MÓDULO A DISEÑAR

Para identificar el número de placa, un sistema de detección automática necesita

extraer de la imagen que está procesando, el rectángulo que encierra la placa del

vehículo. Este procedimiento se llama detección de la placa [6]. Esto simplifica las

tareas posteriores de segmentación y reconocimiento de los caracteres que forman

el número de la placa, pues deben trabajar únicamente sobre una fracción de la

imagen.

El objetivo de este proyecto es precisamente diseñar un método para realizar esta

detección, es decir, construir un módulo de software que recibiendo como entrada

archivos de imagen de la parte frontal o posterior de un automóvil, realice un pro-

cedimiento de reconocimiento de formas con el fin de encontrar en la imagen la

placa del vehículo y obtener como resultado una imagen que contenga únicamente

la placa del vehículo.

Entonces el módulo deberá cumplir con las siguientes tareas.

1. Leer la fotografía de un archivo almacenado en el computador.

2. Seleccionar y extraer de esta fotografía la placa del vehículo.

3. Cambiar el tamaño de la imagen de la placa obtenida en el procedimiento

anterior a un valor de 50 × 100 píxeles.

4. Guardar la imagen obtenida en la tarea anterior como un archivo en el compu-

tador.

1.3. RESTRICCIONES

Aunque sería deseable que el módulo de software a diseñar no tuviera ningún tipo

de limitación, consideraciones de orden práctico hacen necesario que se especifi-

quen algunas restricciones en el mismo.

No es objetivo de este proyecto desarrollar un módulo que funcione en todas las

posibles situaciones, sino uno que funcione de forma razonable con fotografías que

cumplan con un conjunto de propiedades, las cuales se definen a continuación.

Page 25: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 1. PRELIMINARES 5

1.3.1. FORMATO DE LAS PLACAS

En este proyecto no se consideran las placas de motocicletas ni aquellas que ten-

gan otras dimensiones diferentes a 30 cm×15 cm. Tampoco se consideran las placas

especiales de funcionarios del estado ni aquellas que no posean un color sólido de

fondo. Esto es así por que mas de un 98 %2 de los autos en circulación tienen placas

con colores sólidos de fondo.

Además se considera que las placas no están rodeadas de marcos decorativos, ni

envueltas en cubiertas protectoras que pudieran cubrirlas parcialmente, o disminuir

el contraste que presentan con respecto al resto del vehículo.

1.3.2. PROCESAMIENTO DE LA IMAGEN

Si bien en este proyecto se realiza una preparación previa de la imagen con el fin de

mejorar la calidad de la misma, en general se considera que las fotografías fueron

tomadas bajo buenas condiciones de iluminación y con poco ruido3. No se hace

investigación alguna para detectar la placa en fotografías ruidosas, con deficiente

brillo y/o contraste, con poca o con variaciones bruscas en la iluminación. El forma-

to de compresión de imagen tampoco es tratado, y se supone que la imagen fue

almacenada con una compresión JPG de 5:1 o menor.

1.3.3. FORMATO DE ENTRADA/SALIDA

El formato de las imágenes de entrada será el JPG. Si bien es posible incorporar

al módulo rutinas que permitan trabajar con otros formatos de imagen, se usa el

JPG por que es un formato estándar en una gran cantidad de cámaras digitales. El

formato de salida será el PNG, debido a que es un formato con licencia de dominio

público, fácil de procesar, y que es aceptado por los sistemas de reconocimiento

óptico de caracteres que se probaron en este proyecto.

El tamaño de las imágenes de entrada será de 640x480 píxeles. Este es un tama-

ño de imagen estándar, soportado en una amplia variedad de cámaras. Formatos

2Datos no oficiales, proporcionados por el Departamento de Señalización de la Policía Nacional.3Se refiere a los tipos de ruido mas comunes en fotografía digital, Ruido Fotónico (Photon

Noise), Ruido electrónico On-Chip, Ruido KTC, Ruido Térmico, Ruido de Amplificación, Ruido deCuantización[7]. Además, tambien se refiere a imágenes desenfocadas, o borrosas.

Page 26: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 1. PRELIMINARES 6

de imagen mas grandes permitirían imágenes de mas resolución4, pero también

aumentarían los recursos necesarios para su procesamiento5. Formatos mas pe-

queños no tendrían la resolución necesaria.

1.3.4. TOMA DE LAS FOTOGRAFÍAS

El mecanismo con el cual las fotografías son tomadas y transportadas al compu-

tador para su procesamiento no es tratado en este proyecto. Tampoco se considera

la ubicación del dispositivo de toma de imágenes, ni su implementación. Se supone

que el mecanismo de toma de imagen está a una distancia de entre 40 cm y 2 m

del vehículo, que se encuentra paralelo al camino, que apunta al vehículo 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 imágenes se colocará paralelo a la

calzada, y además se colocará de tal manera que se eviten o disminuyan las distor-

siones de perspectiva y esfericidad6. Se deben evitar las condiciones extremas de

iluminación, esto es, sin altas luces ni sombras pronunciadas. En general se consi-

dera iluminación natural, entre las 7H00 y 17H00. Estas condiciones hacen a este

módulo especialmente apto para entradas a estacionamientos, garitas de peajes,

intersecciones de baja velocidad.

4Resolución Espacial describe el grado de detalle presente en la imagen. Usualmente la resolu-ción se mide como el numero de pares de lineas discernibles por unidad de distancia, por ejemplo100 pares de lineas por milímetro[8].

5Se refiere a recursos computacionales, memoria, tiempo de procesamiento, etc.6La distorsión esférica es una alteración 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. Secaracteriza por que las imágenes aparecen “abombadas”, o con forma esférica. La distorsión deperspectiva se produce en la toma de vistas, y ocurre cuando la cámara se inclina de manera quesu distancia varíe respecto a la escena. Se caracteriza por que una parte de la escena apareceanormalmente grande respecto al resto[9].

Page 27: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2

DESCRIPCIÓN DEL MÓDULO

Muchos y variados son los métodos que existen para la detección de placas de iden-

tificación en vehículos. La primera sección de este capítulo se encarga de resumir

brevemente estos trabajos.

La segunda sección se encarga de exponer las consideraciones de diseño que se

tomaron en cuenta. Estas consideraciones se basan en las características de las

placas expuestas en el Capítulo 1 por lo que se recomienda leerlo.

En la tercera sección se describe un método para la detección de placa basado en

la extracción de contornos y el análisis de la proyección vertical.

2.1. TRABAJOS ANTERIORES

En la bibliografía consultada, cuatro mecanismos para la detección 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 descripción detallada de los mismos, sino ser

una referencia hacia material que permita profundizar sobre el tema. Finalmente se

presenta un cuadro con las características mas notables de cada uno.

Estos métodos constituyen la base del funcionamiento de un sistema de detección

de placa. Un sistema completo puede utilizar varios de estos métodos trabajando

conjuntamente, además de secciones encargadas de procesar la imagen con el

objeto de eliminar el posible ruido y acondicionarla para detección.

7

Page 28: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 8

2.1.1. MÉTODOS BASADOS EN LA PROYECCIÓN LATERAL DE LA IMAGEN

Una proyección se define como la suma de los valores de los píxeles de la imagen

en una sola dirección. De esta manera, para una imagen f [x, y] con n píxeles de

ancho y m píxeles de alto, la proyección de la imagen en dirección horizontal se

define como:

Ph[y] =n

i=1

f [i, y] y = 1, 2, 3, ...m (2.1)

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

las filas. La Figura 2.1 ilustra mejor este proceso. De igual manera, una proyección

vertical contendrá la suma de los valores de píxel a lo largo de las columnas que

componen la imagen, la ecuación 2.2 define esta proyección.

Pv[x] =m

i=1

f [x, i] x = 1, 2, 3, ...n (2.2)

La Figura 2.3 muestra el resultado de aplicar la proyección horizontal a la imagen

de la Figura 2.2. En este gráfico, el eje x representa al número de la fila, correspon-

diendo el número 0 a la fila superior de la imagen. El eje y, en cambio, corresponde

a la suma de los valores de píxel de todos los elementos de la fila referida por el eje

x.

f[x,y] Ph[y]

Pv[x]

2 3 5 7 0 23 2

4 2 6 7 21 4 9

3 4 6 2 9 3 7

8 5 7 8 9 2 3

3 3 2 6 4 5 1

20 17 26 30 43 37 22

42

53

34

42

24

Figura 2.1: Ilustración del proceso de proyección. El vector Ph[y] representa la proyec-ción horizontal. Pv[x] la proyección vertical

Como puede apreciarse en la Figura 2.3, se forman picos en la zonas de la fotogra-

fía que reflejan más luz, pues en estas se alcanzan los mayores valores de píxel.

Page 29: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 9

Figura 2.2: Fotografía de prueba

Estos picos pueden usarse para segmentar la fotografía en regiones con mas pro-

babilidad de contener la placa del vehículo. Las placas, por su construcción, reflejan

mucha luz, y esto permite ubicarlas dentro de uno de los picos de la proyección ho-

rizontal.

Figura 2.3: Proyección horizontal de la imagen de la Figura 2.2

Una solución ligeramente diferente consiste en resaltar las discontinuidades en el

brillo que ocurren en el interior de las placas de identificación, debido a los caracte-

res que forman el número de la placa. Esto se consigue usando algún procedimiento

para la detección de bordes, (por ejemplo Sobel o Canny [10]). La Figura 2.4 mues-

tra el resultado de aplicar el operador de Sobel para detectar los bordes verticales

de la fotografía de la Figura 2.2. Al realizar la proyección horizontal de esta imagen

se obtiene el gráfico de la Figura 2.5.

Page 30: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 10

Figura 2.4: Aplicación del operador de Sobel para la detección de bordes verticales

5000

10000

15000

20000

25000

30000

35000

0 50 100 150 200 250 300 350 400 450

muestra 1

Figura 2.5: Proyección horizontal de la Figura 2.4

Page 31: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 11

Este método de proyección que usa la detección de bordes aventaja al método 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 número de

picos a analizar.

Figura 2.6: Segmentación de regiones de interés usando los picos de la proyecciónhorizontal de la Figura 2.5

Luego se recortan las porciones de imagen que producen los picos en la proyección

horizontal y se analizan por separado (ver Figura 2.6). Este proceso de análisis con-

siste en realizar una proyección vertical y revisar el gráfico resultante en busca de

una “firma característica[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: Proyección vertical de una de las regiones de interés de la Figura 2.6 yfirma característica de la placa

De los documentos consultados, este método es el que mas se utiliza, y es uno

Page 32: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 12

de los que presenta mejores resultados. No obstante, la implementación de este

método de detección de placa presenta problemas. El principal es definir un pro-

cedimiento que analice las proyecciones y encuentre los máximos locales. Este

procedimiento debe encargarse de encontrar un pico y definir una zona alrededor

de éste que contenga a la placa de identificación. Esto se complica un poco mas

si se considera que esta zona no tiene un tamaño constante, pues depende de la

distancia a la que se tomó la fotografía.

Aplicaciones de este método a la detección de placa se describen en [12] [2], [13].

2.1.2. MÉTODOS BASADOS EN EL ANÁLISIS DE COMPONENTES CONECTA-

DOS

Este método[13] busca las zonas de la imagen que tienen mas probabilidad de

contener la placa, agrupando elementos de la misma que se encuentren conecta-

dos de alguna manera. En una imagen, dos píxeles están conectados si cumplen

determinadas condiciones de valor y cercanía1.

Primero, las condiciones de valor están dadas por un conjunto de valores que los

píxeles conectados deben compartir. En imágenes en escala de grises, esto sig-

nifica un rango de valores, mientras en imágenes binarias2 esto significa un único

valor.

Las condiciones de cercanía determinan que tan juntos deben encontrarse dos pí-

xeles que cumplan con las condiciones de valor para que sean considerados como

conectados. Usualmente se definen criterios como píxeles adyacentes 4-vecinos,

8-vecinos ó 6-vecinos [14] (ver Figura 2.8), aunque de una manera mas amplia, no

es necesario que los píxeles se encuentren adyacentes. Bastaría en este caso que

su separación esté dentro de una distancia mínima [11].

La Figura 2.10 muestra el proceso de marcación de componentes conectados en

la imagen de la Figura 2.9. Luego de marcarse los componentes, son agrupados

1http://homepages.inf.ed.ac.uk/rbf/HIPR2/label.htm2Una imagen binaria es aquella en la que sus píxeles únicamente pueden tomar uno de dos

valores posibles

Page 33: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 13

(a) (b)

(c)

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

Figura 2.9: Imagen de prueba

Page 34: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 14

aquellos que se encuentren mas cercanos como muestra la Figura 2.11. Estas zo-

nas son extraídas de la imagen original como zonas con mas probabilidad de con-

tener la placa. Luego pasan por otros procesos con la finalidad de discriminar entre

estos resultados, aquellos que efectivamente tienen la placa del vehículo.

Figura 2.10: Marcación de elementos conectados

Procedimientos para la detección de placa basados en este método se describen

en [13], [11].

Figura 2.11: Agrupación de elementos cercanos

2.1.3. MÉTODOS DE COMPARACIÓN

La idea de este método[15] es comparar la imagen a reconocer con un patrón. En

la Figura 2.12 se puede ver un ejemplo de imagen patrón, ésta se ha calculado

usando la siguiente fórmula[15]:

Page 35: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 15

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

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

un promedio (avg()) de los valores de píxeles, y t(i, j) es el patrón obtenido.

Figura 2.12: Imagen Patrón [15]

La Figura 2.14 muestra el resultado de comparar este patrón con la imagen de la

Figura 2.13. Esta comparación se realiza usando la función de correlación dada

por[15]:

corr(x, y) =n−1∑

i=0

m−1∑

j=0

[t(i, j) − I(x + i, y + j)]2 (2.4)

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

se desea extraer la placa, de orden M × N . Esta comparación se realiza moviendo

la imagen patrón sobre la imagen del vehículo, hasta recorrerla toda.

Figura 2.13: Imagen de prueba para el método de comparación [15]

En la imagen de la Figura 2.14, las zonas brillantes aparecen como las que tienen

mayor probabilidad de contener la placa del vehículo. Sistemas de detección de

placa basados en este método se describen en [16], [15].

Page 36: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 16

Figura 2.14: Correlación entre la imagen de las Figuras 2.12 y 2.13. Se ha obscurecidointencionalmente las zonas menos brillantes de la imagen [15]

2.1.4. DETECCIÓN DE FIGURAS GEOMÉTRICAS

Las placas de vehículos son figuras geométricas simples, rectángulos específica-

mente. Los descriptores3 asociados a ellas pueden ser tan simples como los ángu-

los entre sus lados, o la longitud de sus lados. Se pueden encontrar estas figuras

simples usando métodos como la transformada de Hough4 [17] para encontrar li-

neas paralelas en la imagen que pueden encerrar la placa del vehículo.

El procedimiento descrito en [17] es un ejemplo de utilización de la transformada de

Houg en la detección de placa.

El Cuadro 2.1 muestra una comparación de los métodos de detección de placa des-

critos en estas secciones. Para esta comparación se han tomado en consideración

los siguientes puntos:

Independencia del punto de observación. Indica si el método es independiente

de la posición relativa de la cámara respecto a la escena.

Independencia de la inclinación. Indica si el método trabaja aun si la placa se

encuentra inclinada con relación a la cámara.3Descriptores de un objeto es un conjunto de valores numéricos resultado de la extracción de

características del mismo [18].4La transformada de Hough es un procedimiento para encontrar lineas en una imagen. Existe

una transformada de Hough generalizada que permite encontrar figuras geométricas simples.

Page 37: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 17

Independencia del color. Indica si el método es capaz de detectar placas de dife-

rentes colores.

Independencia del borde de la placa. Indica si el método funciona sin necesitar

que la placa esté rodeada de un borde que la destaque.

Método de de-tección

Proyección La-teral

ComponentesConectados

Comparación Detección defiguras geo-métricas

Característicasen las que sebasa el método

Cambios brus-cos en el brillo

Agrupaciónde elemen-tos similares

Comparacióncon un pa-trón

Forma de laplaca

Independenciadel punto deobservación

SI SI NO SI

Independenciadel color

SI SI NO SI

Independenciade la inclinación

SI SI NO SI

Independenciadel borde de laplaca

SI SI SI NO

Cuadro 2.1: Comparación de métodos de detección de placa

2.2. CONSIDERACIONES

Las características de las placas vehiculares se explicaron con detalle en el primer

capítulo. Con el objeto de simplificar el diseño, se hicieron las siguientes considera-

ciones respecto a la naturaleza de las placas y la toma de imagen.

1. Las placas tienen un área rectangular, fácilmente discernible en la carrocería

del vehículo.

2. Las letras que conforman el número de placa son claramente visibles.

3. La relación 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 fotografía.

Page 38: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 18

6. La fotografía no presenta distorsiones de perspectiva o esfericidad5.

La primera y segunda condiciones están relacionadas con las características de

las placas, tal y como se expresa en la Sección 1.1. La tercera y cuarta define los

formatos de placas con los que se trabajará, de acuerdo a las restricciones de la

Sección 1.3.

Las últimas dos consideraciones están relacionadas a la toma de imagen. La alinea-

ción de la placa a los ejes de la fotografía se deduce de la ubicación de la cámara y

la placa, ambas se ubican paralelas al camino.

La distorsión de perspectiva y la distorsión esférica se evitan con una cuidadosa

ubicación de la cámara, evitando los ángulos excesivos con respecto al vehículo y

evitando extremos en las distancias al vehículo.

Hay que considerar en este punto la posibilidad de que existan en los alrededores

del dispositivo de toma de imágenes, placas como las de los nombres de las calles,

que podrían confundirse con las placas de los vehículos con facilidad. Esto se evita

con una cuidadosa colocación del dispositivo de toma de imágenes.

2.3. DESCRIPCIÓN DEL SISTEMA A IMPLEMENTAR

En este trabajo se elige un enfoque para la detección de placa que se basa prin-

cipalmente en el supuesto que ésta es un rectángulo fácilmente 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 fotografía. 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, po-

drían confundirse con placas de identificación si solamente se consideran estos

atributos.

El criterio adicional es la variación regular en el brillo que se observa en el interior de

las placas, debido a los caracteres impresos en las mismas. Esta variación del brillo

permite diferenciar entre elementos de la imagen que son placas de identificación,

y los que no lo son.

5Ver Sección 1.3.4

Page 39: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 19

La Figura 2.15 muestra un diagrama general del método a implementar para la

detección de las placas. En las secciones siguientes se explica cada uno de estos

bloques.

Figura 2.15: Sistema para la detección de placa

2.3.1. PREPROCESAMIENTO

El bloque de pre-procesamiento se encarga de adecuar la imagen a los requeri-

mientos de los bloques siguientes. Para esto, éste bloque debe cumplir las siguien-

tes funciones:

1. Separación de la imagen en sus componentes RGB.

2. Ecualización de cada uno de los componentes RGB de la imagen.

3. Binarización6.

Figura 2.16: Etapa de preprocesamiento de imagen

6El proceso de binarización se explica mas adelante, en este capítulo.

Page 40: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 20

Separación de la imagen en sus componentes RGB

Una forma común de representar imágenes 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 básicos rojo, verde y

azul7. De esta forma cada píxel 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 imágenes 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 píxel en la imagen en color, como el valor

de pixel de las nuevas imágenes en escala de gris. Por ejemplo, el componente rojo

de los pixeles de la imagen en color, se transforma en los valores de píxeles en la

nueva imagen en escala de gris.

La separación 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

capítulo, como la ecualización, se definen de una forma mas simple sobre imágenes

en escala de grises. Mediante la descomposición de la imagen en color, se puede

fácilmente extender los procesos definidos en escala de gris a imágenes en color.

Ya que el proceso de detección 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,

parecería que la información de color que pueda aportar la fotografía es irrelevante.

Sin embargo, pruebas realizadas muestran que la binarización8 no produce buenos

resultados con imágenes 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 binarización sobre una fotografía que contiene

placas color naranja. Los mejores resultados se obtienen sobre el canal rojo.

7Red, Green, Blue, de ahí el nombre del modelo RGB.8El proceso de binarización se describe mas adelante en este capítulo.9Otro modelo de color comunmente usado se conoce como modelo YCrCb. Este modelo supone

que cada píxel en la imagen tiene componentes de luminancia (Y) y crominancia (Cb, Cr), es decirque mantiene separados los valores de brillo de pixel, de los de color.

Page 41: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 21

Figura 2.17: (a) Imagen original. (b) Binarización sobre el componente de luminancia.(c) Binarización sobre el componente azul de la imagen. (d) Binarizaciónsobre el componente rojo de la imagen.(e) Binarización sobre el compo-nente verde

Page 42: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 22

Ecualización

Las imágenes en escala de gris, obtenidas de la separacion de los componentes

RGB, son ecualizadas para minimizar los efectos de las condiciones externas cam-

biantes 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 separación

RGB, el histograma representa la distribución de los valores de píxel en la imagen,

es decir, el eje x representa todos los posibles valores de píxel permitidos, y el eje

y representa la cantidad de píxeles del valor dado por el eje x, presentes en la

imagen.

La ecualización del histograma10, o simplemente ecualización, busca balancear la

distribución de los valores de píxel de una imagen, consiguiendo un histograma dis-

tribuido uniformemente en la totalidad de la escala. Esta operación consigue mos-

trar detalles de la imagen que están ocultos en las luces o sombras de la fotografía

[19].

Sea N(u) el número de píxeles en la imagen con un valor de intensidad de u, (es

decir el histograma de la imagen). Para N(u) la distribución acumulada de probabi-

lidad normalizada se define como[20],[21]:

C(u) =2b − 1

n

u∑

i=0

N(i) (2.5)

donde n es el número total de píxeles en la imagen, y b es el número de bits usa-

dos para representar el valor de cada píxel individual. La ecualización se construye

usando esta función C(u) para reemplazar los valores de cada píxel. Así, por ejem-

plo, un píxel que en la imagen original tiene un valor de píxel de 128, en la imagen

ecualizada tiene un valor de C(128).

La Figura 2.19 muestra el efecto de la ecualización sobre la imagen de la Figura

2.18. Bajo cada una de estas imágenes se muestra el histograma correspondiente.

10En el contexto de procesamiento digital de imagen, usualmente el término histograma de laimagen hace referencia al histograma de distribución de los valores de píxel de la misma, y es elsignificado con el que debe leerse en este trabajo.

Page 43: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 23

Figura 2.18: Imagen e histograma correspondiente

Figura 2.19: Imagen ecualizada e histograma correspondiente

Page 44: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 24

Binarización

Antes de proceder con el proceso de detección de la placa es necesario segmentar

la imagen en regiones de interés. Una de las formas de producir esta segmentación

es aprovechar que, debido a las propiedades reflectivas de la placa (ver Sección

1.1), la zona de la placa en la fotografía 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 binarización[22]. Por binarización se entiende encontrar una

imagen f(x, y) tal que se cumpla la siguiente condición:

f(x, y) =

{

1 si g(x, y) ≥ T

0 si 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 binarización es encontrar el valor adecuado de umbral T que

separe la placa del resto de la imagen. Hay métodos automáticos para la determi-

nación de este umbral, pero no funcionan bien para todos los casos. La Figura 2.21

muestra un ejemplo en que la binarización usando determinación automática del

nivel de umbral falla. En este ejemplo el nivel se calculó usando el método descrito

en Otsu [23].

Figura 2.20: Imagen con poca iluminación

Por esta razón, la determinación automática del nivel de umbral no se usa en esta

etapa. En su lugar se eligió un conjunto de nueve valores de umbral, determinados

Page 45: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 25

Figura 2.21: Binarización a un nivel de 117 determinado por el método de Otsu de laimagen de la Figura 2.20

experimentalmente. Los niveles elegidos, así como el proceso para su elección se

explican en el capítulo siguiente.

Figura 2.22: Binarización 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

imágenes binarias para cada uno de las imagenes en escala de gris obtenidas

luego de la separación de los componentes RGB de la imagen.

2.3.2. DETECCIÓN DE RECTÁNGULOS

El proceso de detección de rectángulos se encarga de buscar y etiquetar estos

elementos en las imágenes binarias obtenidas en el paso anterior. El diagrama de

Page 46: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 26

bloques de la Figura 2.23 ilustra este proceso. A continuación se describen cada

una de las etapas constitutivas.

Figura 2.23: Etapa de detección de rectángulos

Detección de contornos

En imágenes 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

píxeles conectados 11 4-vecinos u 8-vecinos que rodean al objeto. El proceso de

detección de contornos busca estas fronteras en la imagen.

Algoritmos para la detección de contornos existen, por lo que no es necesario de-

sarrollar uno para esta aplicación. 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

11Ver Sección 2.1.2

Page 47: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 27

Figura 2.25: Binarización sobre el componente verde de la imagen de la Figura 2.24

Figura 2.26: Contornos detectados en la Figura 2.25

Page 48: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 28

Aproximación Poligonal

El objeto de la aproximación poligonal es capturar la esencia de la forma contenida

en los contornos obtenidos en el proceso anterior, con el menor número de puntos

posibles. En esta etapa, cada uno de los contornos extraídos por el proceso anterior

es aproximado a un polígono.

d

Curva OriginalPrimera Aproximacion

Segunda Aproximacion

Tercera Aproximacion

P1

P2P3

P4

Figura 2.27: Aproximación poligonal

Uno de los métodos de aproximación 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 línea, la cual sería la

primera aproximación a la curva. La exactitud con que esta línea se aproxima a la

curva es determinada calculando la distancia d entre todos los puntos de la curva

y la línea. Si todas estas distancias son menores que una tolerancia ǫ entonces la

aproximación es buena, y el proceso concluye. Si no, el punto que se encuentre mas

alejado de la línea es escogido como nuevo vértice, dividiendo a la línea anterior

en dos segmentos. El proceso se repite, hasta que la aproximación es menor que

la tolerancia.

Selección de candidatos

Los polígonos deben ser revisados para separar los rectángulos, que serán los

candidatos a placa a considerar en las etapas posteriores. En esta revisión se usan

cuatro criterios:

1. El área del polígono está comprendida entre 450 y 50000 pixeles[15].

2. El ángulo entre lados adyacentes es de 90◦.

3. El polígono tiene 4 lados.

4. La relación entre el lado mas largo y el mas corto es de 2 a 1.

Page 49: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 29

El primer criterio resulta de considerar que las fotografías serán tomadas en un

rango de distancias tal, que los tamaños aparentes de las placas en las imágenes

estén comprendidos entre los limites de 450 y 50000 pixeles 12. De cualquier manera

una placa con un área mas pequeña que 450 en la imagen, contendría caracteres

difícilmente reconocibles.

El segundo criterio de discriminación es el que define a un rectángulo. Si en un

polígono, todos sus ángulos internos miden 90◦, entonces se trata de un rectángulo

o un cuadrado. Sin embargo, imperfecciones en la toma de la imagen, producen

Figura 2.28: Rectángulos encontrados en los contornos de la Figura 2.26

fotografías en las que los ángulos de las placas no son exactamente de 90◦, prin-

cipalmente debidos a la perspectiva. Sin embargo es razonable suponer que estos

valores se ubican en las cercanías de 90◦.

El tercer criterio asegura que sean seleccionados únicamente rectángulos o cua-

drados.

El cuarto criterio es la relación entre lados de la placa, la cual, para placas de

la República del Ecuador es de 2 : 1. Aquí también, al igual que con el segundo

criterio, las imperfecciones en la imagen hacen que la relación aparente de los lados

se ubiquen en las cercanías de este valor.

12Si se considera que el área total de la imagen es de 640×480 = 307200pixeles los límites de 450y 50000pixeles corresponden aproximadamente a 1/500 y 1/6 de la imagen original, respectivamente

Page 50: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 30

Eliminación de duplicados

El proceso anterior de detección de rectángulos se realiza sobre veinte y siete imá-

genes 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 información. Por esta razón, al final de la etapa anterior se obtiene mu-

chos rectángulos que encierran la misma área, en consecuencia se hace necesario

eliminar los rectángulos duplicados.

(x1,y1)

(x2,y2)

(x3,y3)

(x4,y4)

(x2’,y2’) (x4’,y4’)

(x1’,y1’) (x3’,y3’)

∆y

x

Figura 2.29: Rectángulos duplicados

Para esto, los rectángulos obtenidos en el paso anterior son comparados entre ellos.

Si dos rectángulos 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 rectángulos se intersecan es sencillo si se conocen sus coordena-

das. Como consta en la Figura 2.29, dos rectángulos se intersecan si se cumple la

siguiente condición:

∆x < lx ∧ ∆y < ly (2.7)

Donde:

lx =

{

|x3 − x1| si |x3 − x1| ≥ |x3′ − x1′|

|x3′ − x1′| si |x3 − x1| < |x3′ − x1′|(2.8)

y

ly =

{

|y2 − y1| si |y2 − y1| ≥ |y2′ − y1′|

|y2′ − y1′| si |y2 − y1| < |y2′ − y1′|(2.9)

Page 51: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 31

2.3.3. SELECCIÓN Y FILTRADO

En esta etapa, las porciones de la fotografía encerradas en los rectángulos encon-

trados por los procesos anteriores, se recortan. Estas partes de la imagen original

son analizadas para determinar si son una placa de identificación.

Pero antes de proceder a este análisis, estas porciones de la fotografía pasan por

una transformación geométrica con la finalidad de eliminar la inclinación y los de-

fectos en la perspectiva que pudiera tener.

Finalmente, las secciones de la fotografía identificadas como placas, pasan por un

proceso de filtrado con el objetivo de obtener una imagen lo mas limpia posible para

el reconocimiento de carácteres.

El diagrama de bloques correspondiente a esta etapa se muestra en la Figura 2.30.

Figura 2.30: Etapa de Selección y Filtrado

Transformación Geométrica

Esta etapa recorta de la fotografía las zonas rodeadas por los rectángulos obtenidos

en pasos anteriores. Estas partes de la fotografía son transformadas en otras con

unas dimensiones de 100 píxeles de ancho por 50 píxeles de alto.

100px

50px

P1P2

P3 P4

P1’ P2’

P3’ P4’

Figura 2.31: Transformación geométrica

Como se muestra en la Figura 2.31, esta etapa mapea los puntos de la imagen

delimitada por P1,P2,P3 y P4 (la imagen recortada por el paso anterior) a un nuevo

espacio delimitado por P1′,P2′,P3′yP4′.

Page 52: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 32

Las coordenadas x′, y′ de la nueva imagen pueden calcularse en función de las

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

x′ = c1x + c2y + c3xy + c4 (2.10)

y

y′ = c5y + c6y + c7xy + 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 P1,. . . P4 y P1′,. . . ,P4′ respectivamente, en el

siguiente sistema de ecuaciones:

x′1

y′1

x′2

y′2

x′3

y′3

x′4

y′4

=

x1 y1 x1y1 1 0 0 0 0

0 0 0 0 x1 y1 x1y1 1

x2 y2 x2y2 1 0 0 0 0

0 0 0 0 x2 y2 x2y2 1

x3 y3 x3y3 1 0 0 0 0

0 0 0 0 x3 y3 x3y3 1

x4 y4 x4y4 1 0 0 0 0

0 0 0 0 x4 y4 x4y4 1

c1

c2

c3

c4

c5

c6

c7

c8

(2.12)

Este sistema sirve también para calcular los valores x′, y′ para todos los puntos de

la imagen, usando los valores de c1. . . c8 calculados anteriormente.

Selección de placa

La selección de placa se encarga de seleccionar entre los rectángulos obtenidos

anteriormente, únicamente aquellos que tienen características propias de las placas

de vehículos.

Page 53: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 33

Figura 2.32: Placa recortada luego del proceso de transformación geométrica.

Para la selección de la placa se busca en las imagenes obtenidas en el paso anterior

la “firma característica”13, esto es una secuencia de picos espaciados regularmente

en la proyección vertical14 (ver Figura 2.33).

1000

2000

3000

4000

5000

6000

7000

8000

9000

0 20 40 60 80 100

’pdr90.txt’

Figura 2.33: Proyección vertical de la Figura 2.32. Nótese la secuencia de picos queforman la “Firma Característica”

Filtrado

Los segmentos de imagen que aprueben el análisis de proyección vertical de la

sección 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 propósito se han usado filtros morfológicos, como los descritos en [25].

La morfología matemática 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 erosión y la dila-

tación.13Ver Sección 2.1.114El problema de encontrar la firma caracteristica se tratara con mas detalle en el capítulo siguiente

Page 54: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 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)

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

centro del elemento estructurante. Bx, es la traslación 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 dilatación del conjunto X por

el elemento estructurante B, como el conjunto de puntos x ⊂ R2 tal que la traslación

de B por x (Bx) tiene una intersección no vacía con el conjunto X [27]:

δB(X) = {x ∈ R2|X ∩ Bx 6= ∅} (2.15)

La erosión de X por el elemento estructurante B es el conjunto de puntos x ∈ R tal

que la traslación de B por X está incluida en X [27]:

εB(X) = {x ∈ R|Bx ⊆ X} (2.16)

Figura 2.34: Efectos de las operaciones morfológicas. (a)dilatación, (b) erosión [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

Page 55: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 35

como la erosión encoje el borde del objeto, mientras la dilatación lo expande. Con-

siderando esto, se uso una combinación de erosión-dilatación. La erosión elimina

los elementos de la imagen mas pequeños que el elemento estructurante, lo que

afecta poco a los caracteres que conforman el número de placa, pues estos son

mayores que el elemento estructurante usado. La dilatación refuerza los elementos

de la imagen que no fueron eliminados por la erosión. 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 número de identificación, y vestigios de los tornillos que aseguran la placa

al vehículo.

Figura 2.35: Filtrado de la imagen

Luego de esto, las imágenes de las placas obtenidas son guardadas en un archivo.

2.3.4. INTERFAZ DE USUARIO

Para este proyecto se eligió una interfaz de línea de comandos. Dadas las caracte-

rísticas de la aplicación, la cual realizará una única tarea, no es necesario compli-

carse con una interfaz gráfica.

Es necesario observar los resultados intermedios, por lo que la interfaz de linea de

comandos debe presentar una opción que los muestre en pantalla.

También, para permitir la experimentación, se necesita que mediante la línea de

comandos se puedan ajustar algunos parámetros que necesita el módulo para fun-

cionar. El detalle de todas los parámetros que acepta el módulo se encuentra en el

manual de usuario, en el Anexo B.

Page 56: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 36

Adicionalmente, la CLI15 presenta la ventaja de permitir la ejecución de la aplicación

desde scripts de shell16. Esto permite una interfaz simple con otras aplicaciones, y

en este caso, con aplicaciones de reconocimiento de caracteres.

15Command Line Interface, Interfaz de linea de comandos.16La plataforma de ejecución considerada es del tipo UNIX.

Page 57: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3

IMPLEMENTACIÓN

El objetivo de esta implementación es disponer de un banco de pruebas para medir

el desempeño del método para la detección de placa descrito en el Capítulo anterior,

y determinar los valores de los parámetros que necesita.

La implementación práctica del método se realizó escogiendo la sencillez antes que

la eficiencia, con la finalidad de obtener un código fácil de leer y depurar.

Para mantener la modularidad, y facilitar la depuración, el código se separó en

8 archivos y 22 funciones, manteniendo separadas la definición de las funciones

de la implementación de las mismas. La descripción de cada función así como la

explicación de los argumentos que esperan de entrada, y los valores devueltos se

encuentra en el código fuente, en el Anexo A.

En esta sección se explican las características de la implementación del método

para la detección de placa. Se exponen los diagramas de flujo de cada etapa con la

finalidad de facilitar la lectura del código fuente.

También se explican aquí los valores de los parámetros que se necesitan. Estos

parámetros son constantes numéricas, como los valores de umbral usados en la

etapa de binarización, que fueron establecidas experimentalmente.

Durante la implementación, fue necesario contar con un conjunto de imágenes vehi-

culares con la finalidad de hacer la depuración de cada etapa, y además determinar

los valores de las constantes antes mencionadas. Para estos fines, se recolectó un

37

Page 58: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 38

conjunto de 100 imágenes1, bajo las mejores condiciones posibles2, poniendo espe-

cial cuidado en que en estas imágenes el detector de contornos siempre encuentre

un contorno alrededor de la placa. Este es el conjunto de fotografías al que se hace

referencia mas adelante, en este capítulo.

3.1. PLATAFORMA DE DESARROLLO

En este proyecto, plataforma de desarrollo se denomina al conjunto de los siguien-

tes elementos:

Plataforma de hardware

Sistema Operativo

Librerías

Compilador y Depurador

Las siguientes secciones enumeran las características de la plataforma de desa-

rrollo usada en este proyecto. Información detallada respecto a la configuración de

una plataforma de desarrollo como la usada aquí, se encuentra disponible en el

libro The Linux Development Platform [28], listado en la bibliografía.

3.1.1. PLATAFORMA DE HARDWARE

Esta es la parte tangible del sistema de desarrollo. Comprende la elección de har-

dware. Para este proyecto se eligió la plataforma PC, debido a consideraciones de

tipo económico, además de familiaridad con esta plataforma de hardware. Las ca-

racterísticas mas relevantes se enumeran en el Cuadro 3.1.1Este conjunto de imágenes se encuentra en el CD que se entrega con este trabajo.2Para una definición mas precisa de lo que se entiende como las mejores condiciones posibles

véase el Capítulo siguiente.

Page 59: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 39

Procesador: Intel Pentium 3, 900MHzMemoria RAM: 384MBTarjeta Gráfica: ATI Mach 64 RAGE Mobility AGP

Cuadro 3.1: Características del hardware usado

3.1.2. SISTEMA OPERATIVO

El sistema operativo elegido es Linux, concretamente la distribución 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 económico adicional.

El Cuadro 3.2 resume las características del sistema operativo usado.

Sistema Operativo: Ubuntu 6.06.1 LTSVersión del Kernel: 2.6.15-26-386

Cuadro 3.2: Características 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 código fuente a su forma ejecutable. Existe una amplia variedad

de compiladores disponibles para Linux, sin embargo uno de los mas conocidos es

GCC.

La colección de compiladores GNU, comúnmente conocida como GCC, es un con-

junto de compiladores para una amplia variedad de lenguajes entre los que se in-

cluyen los siguientes:

C

C++

Java

Fortran

Page 60: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 40

El propósito del depurador es permitir al programador ver que es lo que esta suce-

diendo “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 común en Linux.

El Cuadro 3.3 enumera las características del compilador y del depurador usados

en este proyecto.

Compilador: GNU Compiler CollectionVersión del compilador: 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

Depurador: GNU DebuggerVersión del depurador: GNU gdb 6.3-debian

Cuadro 3.3: Características del compilador y el depurador

3.1.4. LIBRERÍAS

Existen en la actualidad muchas librerías para el análisis de imagen por compu-

tadora. El Cuadro 3.4 presenta un resumen de las que fueron consideradas. Para

la evaluación de estas librerías se tomó en cuenta la disponibilidad de las técni-

cas de proceso de imagen necesarias para implementar este proyecto. También se

consideraron otros factores como la disponibilidad de documentación 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, además de

que algunas de las librerías amparadas por esta licencia no se proporcionan con el

código fuente. El tipo de licencia libre, en cambio no exige el pago por el uso de la

librería, además de poner a disposición el código fuente de la misma, y permitir al

usuario distribuir libremente los trabajos que realice usando la librería.

3.1.5. OPENCV

OpenCV[14] es un conjunto de librerías para el procesamiento de imagen y visión

por computadora desarrollado por Intel para los procesadores de la arquitectura IA-

32. Liberada bajo licencia libre en el año 2000, desde entonces se ha mantenido en

constante desarrollo.

Page 61: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 41

Características Intel IPL OpenCV Gandalf Matlab OctaveDetección deContornos

Si Si No Si No

AproximaciónPoligonal

Si Si No Si Si

Binarización Si Si Si Si SiMorfología Si Si No Si SiTransformaciónGeométrica

Si Si Si Si Si

Licencia Comercial Libre Libre Comercial LibreDocumentacióny Usabilidad

Amplia, Ok Amplia, Ok Amplia, Ok Amplia,Ok Amplia, Ok

Cuadro 3.4: Librerías y herramientas de procesamiento de imagen.

Actualmente OpenCV es una de las más completas librerías de procesamiento de

imagen y visión por computadora que existen. Esta escrita en C, y funciona en

plataformas Windows y Linux, además de estar optimizada para usar la familia de

procesadores IA-32 de Intel.

En el campo que interesa, OpenCV ofrece manejo de diferentes formatos reconoci-

dos de imagen. Algoritmos de detección de bordes, extracción de contornos, aproxi-

mación poligonal, álgebra lineal, convoluciones, operaciones morfológicas, cálculo

de histograma, etc.

En realidad OpenCV es un compendio de librerías que contiene:

CV: Algoritmos de visión artificial.

CVAUX: Funciones auxiliares.

CXCORE: Álgebra lineal, representación digital de imagen, tipos básicos.

HighGUI: Interfaz de usuario, soporte para imagen y vídeo.

Existe documentación extensa en la página Web del proyecto en:

http://www.sourceforge.net/projects/opencvlibrary

Además de foros de discusión en:

Page 62: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 42

http://groups.yahoo.com/group/OpenCV/

Con excepción 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 código fuente, pertenecen a la librería OpenCV.

3.2. IMPLEMENTACIÓN DEL SISTEMA

Debido a la naturaleza secuencial del método expuesto en el capítulo anterior, ade-

más de que las librerías elegidas están escritas en C, se hace natural la elección

de este lenguaje para la programación.

El diagrama de la Figura 3.1 muestra la implementación total del método. Como

puede verse, la etapa de preprocesamiento de imagen se ha expandido en dos

lazos anidados, esto permite que la etapa de detección de rectángulos 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 mayoría de los algoritmos de procesamiento de imagen,

por lo que no es necesario profundizar en ellos. Sin embargo, hay procedimien-

tos que no están implementados en OpenCV, los cuales son explicados con mas

detenimiento en las secciones siguientes.

Se recomienda mirar el código fuente correspondiente a cada etapa. Ahí se definen

las funciones usadas así como los parámetros 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: separación

RGB, Ecualización y Binarización. De acuerdo a la Figura 3.1, estas secciones es-

tán distribuidas en dos lazos.

Por las características de la etapa planteadas en el capítulo anterior, esta debe pro-

ducir nueve imágenes binarias por canal de color, dando un total de 27 imágenes,

3Ver código fuente en el anexo A

Page 63: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 43

Figura 3.1: Diagrama de flujo general del método de detección de placa propuesto.

Page 64: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 44

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

para su almacenamiento4. La distribución 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. Además esto también facilita el

trabajo de las secciones siguientes al tener que procesar imágenes individuales, en

lugar de las 27 previstas.

Separación en los componentes RGB

Funciones definidas en OpenCV se encargan de leer la imagen del disco y almace-

narla en la memoria. Una vez ahí, la imagen en color es representada usando tres

bytes por píxel, siendo un byte para el componente rojo, uno para el verde, y uno

para el azul.

La separación 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 píxel es representado

usando un byte, lo que permite 256 niveles de gris.

Ecualización

El procedimiento usual para implementar la ecualización es a través de una tabla de

sustitución o LUT5. Una LUT es un procedimiento usual en la manipulación digital

de imágenes que consiste en reemplazar el valor de un píxel por su valor corres-

pondiente en una tabla [21]. Por ejemplo, como se ve en la Figura 3.2, un píxel con

el valor de 2, es reemplazado por el contenido de la ubicación 2 de la LUT, un pí-

xel con el valor de 4 es reemplazado por el ubicado en la posición 4, y así hasta

terminar con todos los píxeles de la imagen.

OpenCV proporciona medios para representar y aplicar la LUT en la imagen. Esto

simplifica el procedimiento de implementar la ecualización al reducirlo a un proble-

ma de llenar una LUT.4Cada píxel de la imagen binaria es representado por 1 byte. Las imágenes para este proyecto

constan de 640 × 480 píxeles, lo que significa que debe haber al menos 307200 bytes por imagen,como son 27 imágenes esto representa un total de 8294400 bytes, sin considerar los encabezadosque usa OpenCV para representar la imagen

5LUT: Look Up Table

Page 65: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 45

7 7 5 4 2

7 6 4 3 0

7 6 4 3 1

6 6 4 2 0

5 5 3 1 0

0

0

1

1

2

3

4

5

5 5 3 2 1

0

1

2

3

4

5

6

7

Figura 3.2: Procedimiento para aplicar una LUT.

Figura 3.3: Procedimiento de ecualización

La LUT es llenada usando la distribución de probabilidad acumulada descrita en la

Sección 2.3.1.La Figura 3.3 ilustra todo este procedimiento.

Binarización

Para determinar los niveles de umbral necesarios para la binarización, se usó el

conjunto de cien fotografías de prueba6 definidas al principio de este capítulo. Es-

tas fueron binarizadas a todos los niveles de umbral posibles. Debido a la repre-

sentación de las imágenes en escala de gris usada, la cual usa ocho bits por píxel,

existen únicamente 256 niveles de umbral. Una imagen se consideró binarizada

correctamente si el detector de rectángulos de la etapa siguiente encontraba un

rectángulo que rodeara la placa del vehículo. La Figura 3.4 muestra los resultados.

Puede verse que la mayoría de fotografías produjeron rectángulos que encerraban

la placa al ser binarizadas con valores de umbral cercanos a 150. Sin embargo,

fotografías con escasa iluminación se binarizan mejor con niveles de umbral bajos,

mientras que fotografías luminosas se binarizan mejor con niveles de umbral altos,

esto a pesar de que la ecualización mejora considerablemente estas imágenes.

Con el propósito de permitir al módulo trabajar mejor con fotografías tomadas en

diversas condiciones de iluminación, se eligieron nueve niveles de umbral. Estos

6Las fotografías de prueba usadas aquí se encuentran en el CD que acompaña a este trabajo.

Page 66: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 46

0

10

20

30

40

50

60

0 50 100 150 200 250 300

Númerode

Fotografías

Nivel de umbral

umbral

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆

⋆⋆⋆⋆⋆⋆

Figura 3.4: Variación de el número de placas detectadas de acuerdo al nivel de umbralusado en las fotografías 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

máximos locales, en la Figura 3.4.

3.2.2. ETAPA DE DETECCIÓN DE RECTÁNGULOS

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

la librería (OpenCV) se encargan de la detección de contornos y la aproximación

poligonal. Para la selección de candidatos, cada polígono obtenido es revisado in-

dividualmente, en busca de aquellos que cumplan las condiciones establecidas de

número de lados, área, relación entre lados adyacentes y ángulo. El orden en el que

se realizan estas comprobaciones se eligió buscando minimizar el tiempo de ejecu-

ción. Es por esto que las comprobaciones mas simples7 son realizadas primero.

Para la aproximación poligonal es necesario determinar el valor de la tolerancia de

la aproximación, esto es el valor de ǫ. Se usó el valor recomendado en la librería

de 0,025× perimetro del contorno, obteniéndose buenos resultados. Cada polígono

obtenido es representado como un vector de puntos, que contiene las coordenadas

rectangulares de los vértices de dicho polígono.

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

Page 67: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 47

Figura 3.5: Diagrama de flujo de la etapa de detección de rectángulos

Page 68: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 48

Selección de candidatos

El ángulo entre dos lados adyacentes se obtiene utilizando la siguiente fórmula:

c2 = a2 + b2 − 2ab cos(Φ) (3.1)

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

ac

b

Φ

Figura 3.6: Ángulo entre lados adyacentes

Debido a imperfecciones en la imagen, los ángulos del rectángulo 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 límites de este intervalo, el programa se ejecutó con las fo-

tografías de prueba. Luego, de entre los contornos detectados se escogieron ma-

nualmente aquellos que después de la aproximación poligonal se transformaran en

polígonos que fueran cuadriláteros similares a la placa de un vehículo. Se midió el

ángulo de estos cuadriláteros. El resultado de esta medición se muestra en la Figu-

ra 3.7. Como se observa en la gráfica, la mayoría de estos cuadriláteros similares

al de una placa de identificación 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 límites entre 72,5◦ y 107,5◦ (0 ≤ | cos(Φ)| ≤ 0,3).

Con respecto a la relación entre lados ocurre algo similar. La Figura 3.8 muestra la

relación entre el lado mas ancho y el mas angosto en los cuadriláteros que se des-

cribieron en el párrafo anterior. Aunque la mayoría de estos cuadriláteros presentan

una relación 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 imágenes con defectos de perspectiva sean

reconocidas.

Page 69: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 49

0

0.05

0.1

0.15

0.2

0.25

0.3

0.35

0 500 1000 1500 2000 2500

|cos(Φ)|

Nombre de la muestra

coseno del ángulo

Figura 3.7: Ángulos de los contornos encontrados en las fotografías de prueba

1

1.2

1.4

1.6

1.8

2

2.2

2.4

2.6

2.8

3

0 500 1000 1500 2000 2500

Relaciónentrelados

Nombre de la muestra

Relación

Figura 3.8: Relación entre lados de los contornos de prueba

Page 70: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 50

Eliminación de duplicados

Los rectángulos duplicados se encuentran comparando todas las combinaciones de

rectángulos detectados posibles. Para este propósito, los rectángulos detectados

son colocados en una pila. El procedimiento consiste en tomar el primer rectángulo

de la pila y compararlo con el segundo. Si los rectángulos se intersecan, el segundo

rectángulo es eliminado, si no, el segundo rectángulo es colocado al final de la pila.

Luego se compara el tercero con el primero y así sucesivamente hasta que todos

los rectángulos restantes en la pila han sido evaluados. Esto se ilustra mejor en el

diagrama de la Figura 3.9.

3.2.3. ETAPA DE SELECCIÓN Y FILTRADO

El diagrama de la Figura 3.10 muestra el flujo general de la etapa. En esta se re-

cortan los segmentos de la imagen encerrados por los rectángulos que quedan

luego de la eliminación de duplicados. Un lazo se encarga de tomar los rectángulos

individualmente. Estos son analizados en busca de la secuencia de picos en la pro-

yección vertical que es característica de la placa de identificación. Finalmente los

segmentos de imagen que aprueben este análisis pasan por un proceso de filtrado,

para luego guardarse en un archivo.

Transformación Geométrica

Cada rectángulo está representado por un arreglo de cuatro puntos que corres-

ponden a sus vértices. Estos deben ordenarse de forma que el primer elemento

del arreglo sea el vértice ubicado en la esquina inferior izquierda del rectángulo

(pt0), el segundo elemento del arreglo debe ser el ubicado en la esquina superior

izquierda (pt1), el tercer elemento debe ser el vértice 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 cálculo de la matriz de perspectiva.

Los puntos de destino para el cálculo de la matriz de perspectiva se encuentran

mediante una correspondencia simple, como se indica en el Cuadro 3.5. Esta re-

presenta el punto de origen y el punto de destino correspondiente. Hay que recordar

que en la pantalla el píxel ubicado arriba a la izquierda es el (0,0).

Page 71: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 51

Figura 3.9: Eliminación de duplicados

Puntos de origen Puntos de destinoEsquina superior izquierda (0,0)

Esquina inferior izquierda (0,50)Esquina superior derecha (100,0)

Esquina inferior derecha (100,50)

Cuadro 3.5: Puntos para el cálculo de la matriz de transformación

Page 72: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 52

Figura 3.10: Diagrama de flujo de la etapa de selección y filtrado

Page 73: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 53

Funciones definidas en la librería se encargan del cálculo de la matriz de transfor-

mación, usando un procedimiento similar al descrito en la Sección 2.3.3. Esta matriz

sirve para realizar una transformación geométrica sobre la imagen original.El efec-

to de esta transformación puede verse en la Figura 3.12. Nótese que la placa del

vehículo se ha desplazado hacia el rectángulo de vértices: (0,0), (0,50), (100,0),

(100,50). Esta zona es recortada de la fotografía.

Figura 3.11: Rectángulo detectado

Hay que destacar que la transformación geométrica trabaja sobre una copia de la

imagen original, y no sobre las imágenes binarias obtenidas en la etapa de pre-

procesamiento. Esto se debe a que las imágenes binarias obtenidas durante el

preprocesamiento no siempre preservan los caracteres que forman el número de

placa. Para garantizar que los caracteres que forman el número de placa están en

las mejores condiciones, la transformación geométrica recorta la placa de la ima-

gen original, en color. Esto hace necesario una transformación a escala de gris, y

ecualización sobre este segmento recortado de la fotografía original.

El método de transformación a escala de gris usado aquí consiste en producir una

nueva imagen, en donde sus píxeles corresponden al componente de luminancia

de la imagen original. Este componente se obtiene mediante la suma ponderada de

los componentes de color de los píxeles originales, según la siguiente fórmula[14]:

Y = 0,212671R + 0,715160G + 0,072169B (3.2)

Page 74: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 54

donde Y es el valor del nuevo píxel en escala de gris, y R, G, B son los valores de

los componentes del píxel de la imagen en color.

Figura 3.12: Rectángulo normalizado. La placa de la Figura 3.11 se ha desplazado ala parte superior izquierda

Selección de Placa

Esta sección realiza la proyección vertical de el trozo de fotografía seleccionado por

la sección anterior y realiza un análisis en busca de una “firma característica”, esto

es una secuencia de picos en la proyección vertical.

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

0 10 20 30 40 50 60 70 80 90 100

Proyeccion Verticalpromedio

Limite SuperiorLimite Inferior

Figura 3.13: Proyección vertical de una placa típica

Page 75: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 55

Esta secuencia de picos se distingue por una serie de parámetros como el número

de picos, la separación entre estos, etc. El problema a resolver aquí consiste en

encontrar los parámetros que definen esta firma, y usarlos para la discriminación

de entre las imágenes que contienen la placa de identificación y las que no.

En el procedimiento implementado, los siguientes parámetros son usados para

identificar la firma característica en las placas de vehículos:

Desviación Estándar Debido a que la proyección vertical de la placa de identifica-

ción presenta características como las de la Figura 3.13, en donde gran parte

de los valores se apartan del valor medio, es razonable esperar valores de

desviación estándar grandes.

Valor promedio El balance mas o menos equilibrado de zonas obscuras y zonas

claras presentes en las placas de identificación permiten suponer que los va-

lores medios de la proyección serán similares en todas las placas.

Número de picos El número de picos en la proyección vertical esta relacionado

con los espacios entre caracteres. Estos picos tienen una amplitud que de-

pende del ancho mínimo y máximo de los espacios entre caracteres.

Número de valles El número de valles en la proyección vertical esta relacionado

con los caracteres que forman el número de placa. Estos valles tienen una

amplitud que esta relacionada con el ancho mínimo y máximo de los caracte-

res.

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

el análisis de proyección horizontal usado aquí. Este usa los parámetros definidos

arriba. Para justificar la elección de los valores que se han usado para estos pa-

rámetros, se utilizó el conjunto de las 100 fotografías de prueba descritas al inicio

de este capítulo. A continuación se explica mas detalladamente cada uno de estos

parámetros.

Page 76: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 56

Figura 3.14: Procedimiento de análisis de la proyección vertical

Page 77: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 57

Valor Promedio

El valor promedio de la proyección vertical se define como:

x =1

N

N∑

i=1

xi (3.3)

donde N es el número de elementos de la proyección y xi es el valor de cada

elemento.

Para medir el valor promedio que debe esperarse en una placa de identificación se

recolectó un conjunto de muestras de la siguiente manera:

1. El programa desarrollado se ejecutó usando las 100 fotografías de prueba

descritas al inicio de este capítulo.

2. Se clasificaron manualmente los resultados a la salida de la transformación

geométrica. Mediante esta clasificación se encontraron 100 rectángulos que

contenían la placa de identificación, y 30 rectángulos que contenían 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 rectángulos que contenían una placa de identificación. El rango elegido

en consecuencia es el de 0,5 ≤ x ≤ 0,8

Desviación Estándar

La desviación estándar de la proyección se define como:

σ =

1

N

N∑

i=1

(xi − x)2 (3.4)

Donde N representa el número de elementos de la proyección vertical, xi es el

elemento i de la proyección y x es el valor promedio de la misma.

Page 78: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 58

0.56

0.58

0.6

0.62

0.64

0.66

0.68

0.7

0.72

0.74

10 20 30 40 50 60 70 80 90 100

Promedio

Nombre de la Muestra

Promedio

Figura 3.15: Promedio de la proyección vertical en el conjunto de imágenes de prueba

La desviación estándar puede interpretarse como una medida de lo alejados que

se encuentran los elementos de la proyección vertical de su valor promedio.

La Figura 3.16 muestra las de desviaciones estándar de la proyección en el conjunto

de 100 rectángulos que contenían la placa del vehículo. Puede verse que los valores

caen dentro del rango comprendido entre 0,13 ≤ σ ≤ 0,21. Sin embargo, en la

implementación se fijo el rango en 0,12 ≤ σ ≤ 0,22, para dejar cierto margen a

placas que presenten defectos como corrosión o suciedad.

0.13

0.14

0.15

0.16

0.17

0.18

0.19

0.2

0.21

10 20 30 40 50 60 70 80 90 100

DesviacionStandard

Nombre de la Muestra

Desviacion Estándard

Figura 3.16: Desviación estándar de la proyección vertical en el conjunto de imágenesde prueba que contienen la placa de identificación

Page 79: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 59

En contraste la Figura 3.17 muestra los valores de desviación estándar de los rec-

tángulos que no contenían la placa del vehículo. Puede verse claramente por que la

desviación estándar es una condición necesaria, pero no suficiente para clasificar

a un rectángulo como placa de identificación.

0.04

0.06

0.08

0.1

0.12

0.14

0.16

0.18

0.2

0.22

5 10 15 20 25 30

DesviaciónEstándard

Nombre de la Muestra

Desviacion Estándard

Figura 3.17: Desviación estándar de la proyección vertical en el conjunto de imágenesde prueba que no contienen la placa de identificación

Número de picos

Un pico en la proyección vertical se define como un máximo 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 están

separados una distancia comprendida entre distancia_minima y distancia_maxima

del pico anterior, y ademas están precedidos por un valle.

Los valores de distancia_minima y distancia_maxima corresponden aproximada-

mente 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 gráfico de la Figura 3.13. Este se

elige dinámicamente para adaptarse a las variaciones de cada proyección. Este

límite se calcula usando la siguiente fórmula:

Page 80: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 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 número de picos

Page 81: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 61

limite_superior = x +σ

2(3.5)

Esto permite que el límite superior se ajuste de forma automática. Así, para proyec-

ciones que presentan picos bastante mayores que el valor medio, el límite superior

es mayor que en proyecciones que presentan mas picos cercanos al valor medio de

la proyección. El divisor 2 para σ fue elegido experimentalmente.

La Figura 3.18 muestra el número de picos sobre este límite contados en las pla-

cas de prueba descritas en secciones anteriores. Por esta razón se eligió 4 como

el número de picos que debe poseer la proyección vertical para ser considerada

perteneciente a una placa de identificación vehicular.

4

5

6

7

8

9

10

11

10 20 30 40 50 60 70 80 90 100

Númerode

Picos

Nombre de la Muestra

Número de picos

Figura 3.18: Número de picos sobre el límite superior en las fotografías de prueba

Número de valles

El procedimiento para contar valles en la proyección 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 sección

anterior. El valor de limite_inferior se ha elegido en:

limite_inferior = x −σ

2(3.6)

Page 82: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 62

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

simetría 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 número de valles

La Figura 3.19 muestra el número de picos bajo limite_inferior en las placas de

prueba antes descritas. Nótese que es de 4. Por esto se ha escogido este número

como el mínimo de valles que requiere la proyección vertical para ser considerada

como perteneciente a una placa de identificación 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 números

que forman el identificador de la placa.

Page 83: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 63

4

5

6

7

8

9

10

10 20 30 40 50 60 70 80 90 100

Númerode

Picos

Nombre de la Muestra

Número de picos

Figura 3.19: Número de valles bajo el limite inferior en las fotografías de prueba

Figura 3.20: Procedimiento de filtrado

Page 84: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 64

Las imágenes que llegan a esta sección son las que fueron recortadas y normali-

zadas por la transformación geométrica y además aprobaron el análisis de la pro-

yección vertical descrito anteriormente. Esto significa imágenes en escala de gris

ecualizadas, que fueron recortadas de la imagen original y que contienen la placa

del vehículo.

Debido a que estas imágenes están compuestas únicamente por dos zonas de bri-

llo definido, las zonas claras, que corresponden al fondo de la placa, y las zonas

obscuras que corresponden a los caracteres que conforman el número de identi-

ficación, el histograma que les corresponde es similar al de la Figura 3.21. Este

histograma representa la distribución de valores de píxel. Como puede verse, existe

una aglomeración de valores en dos zonas claramente definidas.

Figura 3.21: Imagen e histograma correspondiente

Esta distribución particular de valores de histograma facilita la determinación auto-

mática 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 determinación del umbral. La implementación usada aquí es una variación del

código expuesto por Ryan Dibble8, para imágenes 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 aglomeración 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 pseudocódigo de este

procedimiento. Este considera una imagen en escala de gris con una representación

de 8 bits por píxel, lo que permite 256 niveles de gris.

Para resaltar las zonas mas obscuras de la imagen, el umbral obtenido anteriormen-

te es dividido para 1, 6 antes de aplicar la binarización. Esto consigue que se elimine

[email protected]

Page 85: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 65

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 automáticamente el nivel de umbral

Page 86: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 66

la mayor cantidad de elementos grises, quedando los mas obscuros los cuales son

los caracteres de la placa.

El filtro morfológico es aplicado por funciones de librería. El elemento estructurante

usado es un elemento rectangular de tres píxeles de ancho y tres píxeles de alto, el

cual durante las pruebas realizadas mostró buen desempeño en eliminar elementos

diferentes a los caracteres que conforman el número de placa.

Finalmente la imagen es guardada en un archivo. Debido a que pueden existir mas

de una placa en la fotografía, las imágenes son guardadas anexándoles la extensión

-x.png donde “x” es un número que empieza en cero, y va aumentando conforme

se encuentran y guardan mas placas de identificación. Antes del guión va un prefijo

que se pasa como argumento al programa.

3.3. EVALUACIÓN DE COSTOS

La correcta evaluación de costos de desarrollo de un proyecto de software es aún

un problema sin resolver. Muchas variables deben tomarse en cuenta para esta

evaluación, algunas tan subjetivas como el estado de ánimo del programador.

Existen variadas estrategias para ayudar en la determinación de costos. Estas van

desde la comparación con proyectos similares, hasta modelos matemáticos detalla-

dos que tratan de considerar todas las variables que entran en juego. La aplicación

correcta de estos últimos puede añadir un costo apreciable al software desarrollado.

En este proyecto, para la evaluación de costos se usa un modelo matemático lla-

mado COCOMO básico. COCOMO es un modelo para la evaluación de costos de

software propuesto por Barry Bohem [29].

COCOMO (Constructive Cost Model) consiste en realidad de una jerarquía de tres

modelos[29]:

COCOMO básico, que es un modelo que calcula el esfuerzo de desarrollo de

software como una función del tamaño del programa expresado en el número

de lineas de código escritas.

Page 87: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 67

COCOMO intermedio el cual calcula el esfuerzo de desarrollo como una fun-

ción del tamaño del programa y un conjunto de costos adicionales (costdri-

vers) que incluyen la evaluación subjetiva del producto, hardware, personal, y

atributos del proyecto.

COCOMO Detallado. incorpora todas las características de la versión interme-

dia mas una evaluación de los costos en cada paso (análisis, diseño, etc.) del

proceso de desarrollo de software.

El modelo básico COCOMO, a su vez puede aplicarse a los siguientes tipos de

proyectos de software[29]:

Proyectos Orgánicos: Son relativamente pequeños y simples proyectos de sof-

tware, en que equipos pequeños trabajan para cumplir un conjunto relajado

de requerimientos.

Proyectos Semi-Desconectados: Son proyectos intermedios, en tamaño y com-

plejidad 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 número de lineas de código entregadas, expresado en

Page 88: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 68

Proyecto de software ab bb cb db

orgánico 2.4 1.05 2.5 0.38semi-desconectado 3.0 1.12 2.5 0.35embebido 3.6 1.20 2.5 0.32

Cuadro 3.9: Coeficientes para el modelo COCOMO[29]

miles, P es el número de personas requeridas. Los coeficientes ab, bb, ,cb y db están

dados en el Cuadro 3.9.

El modelo COCOMO básico es bueno para la rápida y temprana estimación de

los costos de software, pero su precisión está limitada por no considerar calidad

del personal y experiencia, el uso de herramientas y técnicas modernas y otros

atributos conocidos por tener una influencia significativa en el costo de software.

Debido al tamaño de este proyecto, (no mas de unos cientos de lineas de código

fuente), y por haber sido desarrollado por una persona el modelo COCOMO bá-

sico para proyectos orgánicos es suficiente. Este es aplicado al proyecto usando

la herramienta sloccount. Sloccount cuenta las líneas físicas de código residentes

en un directorio y en base a ellas calcula el esfuerzo necesario. El resultado es la

estimación en esfuerzo humano y monetario para producir el software.

Sloccount es una aplicación de software libre desarrollada por David A. Wheeler.

Esta herramienta ha sido aplicada con éxito en la evaluación de proyectos de sof-

tware libre, como Debian [30]. Amplia información acerca del uso de esta aplicación

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 estimación se ha

considerado un salario promedio de 10138,92 dólares por año que es el promedio

para programadores en Ecuador9.

El costo total de desarrollo de esta aplicación está en 3078 dólares, los cuales

incluyen documentación, y costos adicionales de investigación y prueba.

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

Page 89: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 3. IMPLEMENTACIÓN 69

Cuadro 3.10: Resultados de SLOCCOUNT

SLOC Directory SLOC-by-Language (Sorted)

1022 src ansic=1022

466 scripts 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'."

Page 90: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4

EVALUACIÓN

Este capítulo muestra el resultado de la evaluación realizada sobre la implemen-

tación del algoritmo para la detección de placa expuesto. Una correcta evaluación

debe permitir no solamente establecer criterios para la ponderación, sino también

encontrar posibles errores u omisiones, o sugerir maneras de mejorar el desem-

peño. Está claro que es difícil establecer un conjunto adecuado de pruebas que

permitan realizar estas tareas. Para facilitar esto, se han planteado los siguientes

objetivos a cumplir en esta evaluación:

1. Determinar el índice de efectividad del programa construido.

2. Determinar las secciones del programa que presentan fallos en la detección.

3. Determinar las causas de los fallos en la detección.

4. Conocer el tiempo promedio de ejecución que necesita la implementación del

método, para la detección de la placa en la fotografía.

5. Encontrar las secciones del programa que consumen mas tiempo de procesa-

miento.

Para llevarlos a cabo se ha diseñado un conjunto de pruebas. Para la realización

de las mismas se han recolectado muestras1 de fotografías de vehículos, bajo unas

condiciones que se explican mas adelante. El orden de realización de las pruebas

tiene relación con la naturaleza secuencial del algoritmo propuesto, y es el siguiente:

1Las fotografías usadas en el capítulo anterior se eligieron de forma que el módulo siempreencuentre un rectángulo que rodee la placa. Para evitar que este hecho altere los resultados, lasmuestras usadas en este capítulo corresponden a un conjunto diferente del usado en el capítulo deimplementación.

70

Page 91: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 71

1. Prueba del módulo con la totalidad de las muestras recolectadas. De esta

prueba se obtiene un conjunto de fotografías en las que el módulo tuvo éxito

en la detección de placa, y un conjunto de fotografías en las que no tuvo éxito.

2. Prueba de la etapa de preprocesamiento con las fotografías en las que el

módulo no tuvo éxito en la detección, durante la prueba uno. Una vez más

se obtiene un conjunto de fotografías en las que la etapa funcionó como se

esperaba, y un conjunto en las que la etapa fracasó.

3. Prueba de la etapa de detección de rectángulos con las fotografías que tu-

vieron éxito en la prueba anterior. También aquí se obtienen un conjunto de

fotografías en las que la etapa funcionó como se esperaba y uno en el que no.

4. Prueba de la etapa de selección y filtrado con las fotografías que tuvieron éxito

en la etapa anterior. Durante esta etapa se espera únicamente un conjunto de

fotografías 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 detección.

En las secciones siguientes se explican las condiciones bajo las que se tomaron las

fotografías usadas durante las pruebas del módulo. También se explica con algún

detalle cada una de las pruebas realizadas, exponiendo los resultados.

Finalmente, se realiza la integración del módulo diseñado con una aplicación de

reconocimiento de caracteres. Se analiza el desempeño de esta integración y se

muestran los resultados de las pruebas realizadas sobre esta integración.

4.1. MUESTRAS

Las condiciones en las que se obtienen las muestras son casi ideales, esto es, fo-

tografías tomadas a distancias del vehículo que varían entre 0,4 y 2 m, vehículos

estáticos y condiciones de iluminación óptimas (iluminación natural entre las 7H00 y

17H00, sin iluminación exterior adicional).En contraste, en circunstancias reales los

vehículos se encontrarían en movimiento, existirían obstáculos ocasionales (peato-

nes, sombras producidas por otros vehículos, etc.).

Page 92: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 72

El uso del flash debe tener un tratamiento muy particular, debido a que este dis-

positivo en cámaras convencionales produce un efecto de deslumbramiento, como

puede apreciarse en la Figura 4.1, por lo que la utilización de luz artificial en condi-

ciones diurnas y nocturnas debería 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 lumi-

nosidad, estos deben considerarse dentro de unos márgenes dados por las restric-

ciones expuestas en la Sección 1.3.

En estas condiciones se procedió a recoger un conjunto imágenes, cuidando que

únicamente contengan una placa por fotografía. Como se dijo antes, se evitaron las

condiciones extremas en la iluminación, –sin altas luces ni sombras pronunciadas–.

Las placas también fueron seleccionadas por su estado de conservación, evitando

aquellas que presentan decoloraciones, óxido, o abolladuras.

En el conjunto de fotografías obtenido no se incluyeron placas deterioradas, con

fondos de colores no sólidos2, placas con bordes decorativos ni cubiertas protec-

toras, sin embargo, se recopiló un segundo conjunto de fotografías con estos de-

fectos para determinar la respuesta del algoritmo a placas de estas características.

Sin embargo, estas fotografías son probadas por separado y no se cuentan en la

determinación de la efectividad del módulo, por no cumplir con las restricciones de

diseño expuestas en la Sección 1.3.

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

Page 93: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 73

El dispositivo de toma de imágenes es una cámara Concord Eye-Q 4363Z, con sen-

sor de 4.1 mega píxeles CCD. Las matrices que representan la imagen en el compu-

tador, a esta resolución presentan inconvenientes de tiempo de procesamiento, vo-

lumen de cálculos, proceso de depuración. Por esto, se probaron resoluciones mas

bajas durante el proceso de desarrollo de la aplicación. Se escogió la resolución de

640x480 por las siguientes razones:

1. El tiempo de procesamiento aumenta de manera exponencial en relación al

incremento de la resolución de la imagen.

2. El tamaño de la matriz de imagen a una resolución de 640x480 es un estándar

dentro de los dispositivos de imagen.

3. Las mejoras que se obtendrían a resoluciones mayores no serían significati-

vas, aunque permitirían tomar fotografías a mayor distancia.

4. El costo de sensores de imagen con una resolución de 640x480 píxeles es

bastante económico, aspecto a tener en cuenta en futuras aplicaciones comer-

ciales.

Es lógico suponer, que al basarse el módulo de detección en atributos como el brillo

de la placa, los errores en la detección se darán cuando el brillo de las porciones

de la imagen inmediatamente adyacentes a la placa sea similar al brillo de la placa.

Esta situación se presenta cuando el vehículo, o al menos las porciones del vehículo

sobre las que está montada la placa, tienen un color similar a la placa; por ejemplo,

autos de color blanco o gris claro.

Los vehículos con estas características son bastante comunes, pero no son pre-

dominantes, y se estima3 que su proporción es de aproximadamente el 30 %. Las

muestras, por consiguiente reflejan esta proporción y cuentan con un 29 % de imá-

genes de esas características.

En resumen, dos conjuntos de fotografías se han tomado para esta evaluación:

Un conjunto de 215 fotografías que cumple con las restricciones impuestas,

llamado conjunto primario.

3Ni la Jefatura Provincial de Tránsito y Transporte Terrestre ni la Policía Nacional poseen estadís-ticas al respecto. Esta estimación se realizó de forma empírica, contando el número de vehículos decolores claros en los estacionamientos en donde se tomaron las muestras.

Page 94: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 74

Un conjunto de 40 fotografías que no cumplen con las restricciones impuestas,

llamado conjunto de control.

Estos conjuntos de fotografías fueron tomados al azar, y son completamente dife-

rentes del conjunto usado durante la implementación del método.

4.2. RESULTADOS EXPERIMENTALES

4.2.1. EFECTIVIDAD EN LA DETECCIÓN

El criterio para la evaluación del éxito del módulo es simple. Si el módulo detecta y

recorta la placa correctamente se considera que ha tenido éxito. Si no, se cataloga

como error. La detección es correcta si el módulo encuentra un rectángulo que

encierre completamente el número de placa del vehículo. Es necesario aclarar que

el resultado puede llevar o no a un reconocimiento de caracteres exitoso4.

Figura 4.2: Ejemplo de resultados del módulo. (a) Detección Correcta y (b) Distorsiónen el resultado

Se define como efectividad en la detección de placa al porcentaje de fotografías

en las que el módulo detectó la placa correctamente. Ésta se calcula mediante la

fórmula:

efectividad =Numero de fotograf ias detectadas correctamente

Total de fotograf ias evaluadas× 100[ %] (4.1)

El Cuadro 4.1 muestra los resultados de la evaluación del módulo con el conjunto

primario de 215 fotografías de prueba. Para el análisis posterior los resultados se

clasifican en:4La integración de el programa desarrollado con un sistema de reconocimiento de caracteres se

tratará mas adelante.

Page 95: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 75

Detección Correcta: Son aquellas fotografías en la que la placa fue detectada y

recortada correctamente.

Falsos Positivos: Son aquellas fotografías en que se recortó un rectángulo que no

contenía la placa del vehículo.

Falsos Negativos Son aquellas fotografías en las que no se detectó la placa, a

pesar de estar presente en la fotografía.

Clasificación Número de Fotografías PorcentajeDetección Correcta 163 75.8 %Falsos Positivos 3 1.4 %Falsos Negativos 49 22.8 %Total 215 100 %

Cuadro 4.1: Resultados de la evaluación

Este cuadro permite calcular la efectividad del módulo aplicando la fórmula 4.1:

efectividad =163

215× 100 = 75,814 % (4.2)

Estos resultados permiten suponer que la efectividad del módulo de detección de

placa oscila alrededor del 75 %. Al ejecutar el módulo de detección de placa varias

veces sobre un mismo conjunto de fotografías de prueba, se obtuvieron siempre los

mismos resultados, lo que demuestra que el módulo construido carece de memoria,

y por lo tanto no necesita entrenamiento.

Es importante resaltar que el método de detección 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 detección se presenten especialmente en aquellas

fotografías 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 clasificación de

los resultados de acuerdo a esta consideración.

Color PlacasAnalizadas

FalsosNegativos

FalsosPositivos

DetecciónCorrecta

Placas sobre fondo claro 65 33 1 31Placas sobre fondo obscuro 150 16 2 132Total 215 49 3 163

Cuadro 4.2: Clasificación por contraste

Page 96: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 76

El Cuadro 4.3 muestra el resultado de la evaluación del módulo con el conjunto de

control. Debido a que las fotografías de este conjunto no cumplen con los requisi-

tos expuestos en la Sección 1.3, no se realiza un análisis posterior con el fin de

determinar las causas a las que se deben los fallos en estas fotografías.

Total de fotografías Éxito Fracaso40 0 40

Cuadro 4.3: Resultados de la evaluación del módulo con fotografías que no cumplenlos requisitos descritos en el Capítulo 1.

Por último, el Cuadro 4.4 muestra los tiempos de ejecución del programa. Estos

tiempos se obtuvieron sobre una computadora ACER travelmate 529 ATX, con pro-

cesador Intel Pentium III 900MHz con 384 MB de memoria RAM.

Máximo [ms] Mínimo [ms] Promedio [ms]4500 600 1200

Cuadro 4.4: Tiempos de Ejecución

La Figura 4.3 muestra a la imagen en donde se consiguió el mayor tiempo de proce-

samiento, la Figura 4.4 muestra a la imagen en donde se consiguió el menor tiempo

de procesamiento. En general se observa que las imágenes 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 aritmética de los tiempos de procesamiento de las

215 fotografías.

Page 97: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 77

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

En las secciones siguientes se evalúa cada etapa con las 49 fotografías que produ-

jeron falsos negativos, con el fin de encontrar las secciones en donde se producen

estos fallos. No es necesario realizar este análisis con las 3 fotografías que produ-

jeron los falsos positivos, ya que estos se pueden atribuir directamente a la etapa

de selección y filtrado. Los falsos positivos se producen cuando el número de picos

producidos por la proyección vertical de la región de interés está dentro del rango

definido en la Sección 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 ecualización está funcionando como se espera, se

compara la salida de esta sección con una imagen ecualizada mediante otros me-

dios (puede ser a mano, o con un programa de manipulación de imágenes5). Si

ambas imágenes concuerdan para un conjunto grande de imágenes de prueba, se

asume que la ecualización funciona correctamente. De la misma manera se proce-

de para la descomposición en componentes RGB y para la binarización. Esta forma

de proceder tiene valor para determinar el correcto funcionamiento de cada una

5El autor de este documento utilizó Gimp, un programa de manipulación de imagenes, para com-parar los resultados obtenidos en las diferentes etapas.

Page 98: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 78

de las secciones que conforman la etapa, y se usó mucho durante la implementa-

ción de las diferentes etapas del método 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 detección de rec-

tángulos. Como se expresó en la Sección 2.3.2, para que la detección encuentre

un rectángulo que contenga la placa, el preprocesamiento le debe entregar imáge-

nes binarias como la de la Figura 4.5(a). Nótese que se forma un rectángulo claro

alrededor de la placa. En contraste la Figura 4.5(b) muestra un ejemplo de una

fotografía que no cumple con estos requisitos.

Figura 4.5: Ejemplos de binarización (a)correcta (b)incorrecta

La evaluación de la etapa de preprocesamiento de acuerdo al segundo criterio,

permite determinar hasta que punto es correcta la suposición –que las placas de

identificación son rectángulos fácilmente distinguibles– en la que se basa el método

de detección implementado. Para esta evaluación se consideran únicamente las

fotografías del conjunto primario en las que el módulo falló en detectar la placa.

Esto se realiza de esta manera para determinar cual porcentaje de las fallas en la

detección pueden atribuirse a esta etapa.

El Cuadro 4.5 muestra el resultado de la evaluación de la etapa de preprocesamien-

to, de acuerdo al segundo criterio expuesto en esta sección. Se ha realizado una

clasificación de acuerdo al color del área que rodea a la placa de identificación 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 fotografías en las que el módulo falló en la

detección, 49 se deben a que el preprocesamiento falló en obtener una fotografía

Page 99: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 79

Color del vehículo Éxito FracasoAutos color claro 0 31Autos de color obscuro 3 15

Cuadro 4.5: Resultados de la etapa de preprocesamiento

binaria que cumpla con los requerimientos expuestos anteriormente. Si se conside-

ra que las 49 fotografías corresponden al 100 % de los casos de error, entonces 46

fotografías corresponden al 93,88 %, y este valor también 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

fotografías.

Máximo[ms] Mínimo[ms] Promedio[ms]29 22 25

Cuadro 4.6: Etapa de preprocesamiento de imagen. Tiempos promedio de ejecución

4.2.3. DETECCIÓN DE RECTÁNGULOS

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

selección y filtrado. Esto significa que una fotografía pasa con éxito esta etapa si a

la salida de la misma hay disponible un rectángulo que contiene la placa. Los datos

usados para esta prueba son las tres fotografías que pasaron con éxito la etapa

anterior, del conjunto de imágenes en las que el módulo falló en identificar la placa.

La Figura 4.6 muestra la única fotografía que falló en esta sección. Como puede

verse, se detectó correctamente un rectángulo que contiene la placa. Puede obser-

varse que existe otro rectángulo que lo encierra, lo que causa que la eliminación

de duplicados deseche uno de los rectángulos. Desafortunadamente, el rectángulo

desechado es el menor, el cual es el que rodea la placa de identificación.

El Cuadro 4.7 muestra los tiempos de procesamiento de la etapa de detección de

rectángulos. Estos tiempos están tomados del procesamiento de las 215 fotografías

de prueba.

Page 100: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 80

Figura 4.6: Fotografía que presento errores en la eliminación de duplicados

Máximo [ms] Mínimo [ms] Promedio [ms]4430 540 1130

Cuadro 4.7: Tiempos de procesamiento de la etapa de detección de rectángulos

4.2.4. SELECCIÓN Y FILTRADO

Las últimas dos fotografías que presentaron errores en la detección se deben a

problemas en la etapa de selección y filtrado.

Dos fotografías son desechadas por errores en esta etapa. Ambas no aprueban

el análisis de proyección vertical. Esto se debe a que el número de picos en su

proyección no está dentro del rango definido en la Sección 2.3.3

El Cuadro 4.8 muestra los tiempos de procesamiento para esta etapa.

Máximo [ms] Mínimo [ms] Promedio [ms]23 20 21

Cuadro 4.8: Tiempos de procesamiento de la etapa de detección de rectángulos

4.3. ANÁLISIS DE RESULTADOS

El Cuadro 4.9 muestra los porcentajes de error en la detección debidos a cada

etapa. El principal inconveniente para una detección 100 % exitosa está en el pro-

Page 101: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 81

Figura 4.7: Ejemplo de fotografía en la que falló el análisis de la proyección vertical

Figura 4.8: Proyección vertical para la placa de la Figura 4.7

cedimiento de binarización dentro de la etapa de preprocesamiento de imagen.

Si para cada fotografía analizada, se pudiera encontrar un nivel de umbral T tal que

se produjera una binarización como la descrita en la Sección 4.2.2, la efectividad

del módulo aumentaría considerablemente. Sin embargo, existen fotografías como

la de la Figura 4.9, en las que no existe un nivel de umbral capaz de producir tal

binarización 6.6En la implementación del capítulo anterior se utiliza una representación de 8 bits por píxel, esto

permite hasta 28 niveles de umbral.

Page 102: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 82

Etapa Porcentaje de falsos negativosPreprocesamiento 93,88 %

Detección de Rectángulos 2,17 %Selección y filtrado 3,95 %

Cuadro 4.9: Clasificación de las etapas según el porcentaje de falsos negativos

Figura 4.9: Ejemplo de fotografía con poco contraste entre la placa y el vehículo

Hay varias formas de mejorar el desempeño de esta etapa. Una sería usar mas

bits para representar el brillo del píxel. Con 8 bits únicamente existen 256 niveles

de umbral, con 16 bits existen 65536. Sin embargo, al aumentar los bits por pixel,

también aumenta el tiempo de procesamiento. Una forma mas fácil sería colocar

alrededor de la placa una franja de color negro, o montar la placa en una superficie

opaca.

Dentro de la etapa de detección de rectángulos, el procedimiento que muestra un

comportamiento no deseado, al menos con los conjuntos de fotografías de prueba,

es el de eliminación de duplicados. El problema se presenta cuando el detector de

rectángulos encuentra rectángulos anidados. En esta situación, al tener mas del

30 % del área en común, todos los rectángulos anidados menos 1 son eliminados.

Sin embargo, no hay nada en el método de eliminación de duplicados que garantice

se eliminen los rectángulos que no delimitan la placa. Esto significa que el elimina-

dor de duplicados puede –como sucede en la imagen de la Figura 4.6– eliminar el

rectángulo que delimita la placa y quedarse con el rectángulo mas externo, o mas

interno.

Para evitar este error, en el caso de existir rectángulos anidados, el método de eli-

minación de duplicados debería marcar todos los rectángulos anidados como rec-

Page 103: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 83

tángulos válidos y enviarlos a la etapa siguiente. Existe otra manera de corregir este

error, que requiere una implementación ligeramente diferente del método expuesto,

pero que eliminaría la necesidad de una sección para la eliminación de rectángulos

duplicados. Esta solución se expone en el capítulo siguiente, en las recomendacio-

nes para trabajos futuros.

La última de las causas de errores se encuentra en la etapa de selección y filtrado,

en el procedimiento de proyección vertical, que se usa para discriminar los rectán-

gulos que no contienen la placa, de los que si los contienen. Este procedimiento

únicamente considera el número de picos7. Existen imágenes que sin ser placa

contienen un número de picos dentro del rango necesario, o puede ser que placas

reales no presenten el número de picos necesarios en la proyección vertical.

Hay que notar que las correcciones propuestas para las etapas de detección de rec-

tángulos y de selección y filtrado son irrelevantes, esto si se considera que apenas

el 6.12 % de los errores en la detección se presentan en estas secciones. Cualquier

mejora en el método de detección de rectángulos debería empezar corrigiendo la

etapa de preprocesamiento de imagen.

Con respecto al tiempo de procesamiento del módulo, la etapa de detección de

rectángulos es la que mas tiempo consume; dentro de esta etapa, el mecanismo de

detección de contornos. Debe tenerse cuidado en la interpretación de estos tiempos

de proceso, ya que es necesario considerar que factores como memoria disponible,

CPU disponible, procesos ejecutándose simultáneamente, pueden variar, a menudo

de forma considerable, los tiempos descritos.

4.4. RECONOCIMIENTO DE CARACTERES

Como parte de este proyecto se implementó la integración de el módulo desarro-

llado con un OCR 8. El desarrollo separado de un módulo de detección de placa

permite la integración con tecnologías de reconocimiento de caracteres existentes,

evitando la necesidad de desarrollar esta tecnología 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 reconoci-

miento. Esta labor se vuelve mas complicada si se considera que, por estar las7Para una mejor comprensión de el procedimiento de proyección vertical, ver la Sección 3.2.38OCR: Optical Character Recognition Reconocedor Óptico de Caracteres

Page 104: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 84

placas expuestas a las inclemencias del ambiente, éstas presentan la mayoría de

las veces suciedad o deterioro en los caracteres.

El algoritmo de filtrado explicado en la Sección 2.3.3, se encarga de eliminar estas

impurezas y producir imágenes mas limpias para el reconocimiento. Sin embargo,

aunque la reducción en las impurezas en la imagen final es considerable, es ne-

cesario que el sistema de reconocimiento de caracteres a usar disponga de algún

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 parámetros de funcionamiento. En contraste Clara y Ocrad no

presentaban las opciones de GOCR.

4.4.1. GOCR

GOCR (GNU Optical Character Recognition) es una aplicación para el reconoci-

miento de caracteres desarrollado por Jörg 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 reconoci-

miento de imágenes. GOCR presenta múltiples opciones para ajustar los paráme-

tros del reconocimiento de caracteres. De estas opciones las mas importantes para

ésta aplicación particular son:

-f Formato de salida. ASCII, HTML, XML, UTF8. En esta aplicación se elige

ASCII. La opción completa seria -fASCII.

Page 105: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 85

-m Modo de operación. GOCR presenta un modo de operación 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 opción completa es -m2. Con la opción -m130 se

puede entrenar el motor de reconocimiento.

-p[path] Donde path es la ubicación 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

características del problema estos caracteres son: ABCDEFGHIJKLMNOPQRS-

TUVWXYZ9876543210. Esto es así por que las placas solo usan estos carac-

teres.

-d Tamaño 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. INTEGRACIÓN

Con el propósito de automatizar el proceso de reconocimiento se desarrolló un

script tipo bash. Este script, llamado vlpr (ver Anexo A.4), es el encargado de lla-

mar al programa de detección de placa. Luego envía los resultados al OCR para el

reconocimiento. Esto hace posible ejecutar los dos procesos –detección de placa y

reconocimiento de caracteres– con una sola orden.

También 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 integración del sis-

tema de detección de placa desarrollado en este proyecto de titulación, y el sistema

de reconocimiento de caracteres elegido.

Para facilitar la lectura de los resultados, éstos son presentados en una página web,

escrita en html. Un tercer script escrito en awk fue desarrollado para construir esta

página; é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.

Page 106: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 86

Figura 4.10: Muestra de la base de datos del OCR

4.4.3. RESULTADOS EXPERIMENTALES

Para la evaluación de la integración del módulo desarrollado con el OCR se usaron

las 163 fotografías que proporcionaron resultados correctos. Como el OCR admite

entrenamiento, se usaron 63 de las 163 fotografías para este propósito. La Figura

4.10 presenta una muestra de la base de datos construida en el entrenamiento.

Luego se evaluó el desempeño del OCR con los 100 resultados de la detección que

no se usaron para el entrenamiento. Los resultados se muestran en el Cuadro 4.10.

Número de Fotografías %Éxito 54 54 %Fracaso 46 46 %Total 100 100 %

Cuadro 4.10: Resultados de la integración con el OCR

Los casos de error se han clasificado en el Cuadro 4.11. Estos se deben principal-

mente a dos causas:

Ambigüedad: el OCR se confunde con caracteres que son similares. Esto ocu-

rre con caracteres como O (letra o), 0 (número 0), D (letra d).

Page 107: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 4. EVALUACIÓN 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 bina-

rización.

Número de fotografías %Ambigüedad en los caracteres 20 35.7 %Otros 36 64.3 %

Cuadro 4.11: Categorización de los errores en el reconocimiento de caracteres.

Fallas en el reconocimiento de caracteres, como las que ocurren en fotografías

como la Figura 4.11 (c) únicamente pueden corregirse mejorando la calidad de la

fotografía. En cambio, las fallas de ambigüedad, como las de la Figura 4.11 (a) y (b)

pueden corregirse en parte, entrenando el OCR con mas fotografías.

Figura 4.11: Ejemplo de imágenes que producen errores en el OCR. Errores de ambi-güedad (a) Similitud entre 6 y G, (b) Similitud entre 0 y O. (c) Errores en lafotografía a reconocer

Page 108: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5

CONCLUSIONES Y RECOMENDACIONES

5.1. CONCLUSIONES

El propósito de este proyecto ha sido construir una aplicación que extraiga el rec-

tángulo que contiene la placa de identificación en fotografías de vehículos. Para

alcanzarlo, se empezó por enumerar las características de las placas vehiculares.

Esto sirvió para establecer un conjunto de requisitos que debería cumplir la aplica-

ción, requisitos que se escogieron para que no sean demasiado estrictos, y facilitar

en lo posible el desarrollo de la misma.

Luego se describieron los métodos que se han desarrollado para resolver este pro-

blema anteriormente. Se expusieron tres de los métodos mas comunes para la de-

tección de la placa en una fotografía. Aunque entre estos, el que usa la proyección

de la imagen a lo largo de las ejes vertical u horizontal de la fotografía (ver Sección

2.1.1) es la elección usual en la bibliografía consultada; para este proyecto se eligió

un método diferente.

El método elegido se expone en la Sección 2.3. Este método usa la forma de la

placa y su brillo para encontrarla y separarla de la fotografía. Este se eligió debido a

que resulta relativamente fácil de entender e implementar, y además no consta en

la bibliografía consultada.

Este método es planeado como un procedimiento de tres pasos. El primero en-

cargado 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 rectángulos son analizados usando el

88

Page 109: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 89

método de proyección con la finalidad de encontrar el número de picos caracterís-

ticos de una placa. Para realizar cada uno de estos pasos, se usan técnicas de

procesamiento de imágenes ampliamente conocidas.

La aplicación se implemento en C, debido a experiencia previa con ese lenguaje

de programación, y a la naturaleza secuencial del método propuesto. Se ha puesto

especial interés en el uso de librerías de código para el procesamiento de imáge-

nes. Esto tiene la ventaja de reducir el tiempo de desarrollo y los costos asociados,

además de permitir el uso de código existente que implementa las técnicas de pro-

cesamiento de imágenes a usar. Un conjunto limitado de librerías fue evaluado,

pero finalmente se eligió OpenCV por implementar la mayoría de las técnicas de

procesamiento de imágenes necesarias, y además poseer licencia libre. Aunque es

posible el uso combinado de librerías, esta opción se desecho por que requería el

trabajo adicional de adaptar las diferentes formas para representar la imagen que

usa cada librería.

Para la evaluación de los costos se usa el modelo COCOMO. Este modelo relacio-

na el costo de desarrollo de un programa, como función del número de líneas de

código que lo conforman. Se usó el programa SLOCCOUNT para contar las líneas

de código de la aplicación desarrollada, y aplicar el modelo. Si bien COCOMO no

proporciona resultados exactos, y sus críticos afirman que es un mal modelo pues

no considera factores como experiencia del programador, afinidad del grupo de tra-

bajo, motivación, etc, para una aplicación desarrollada por una sola persona, como

la expuesta en este proyecto, es suficiente. El costo fue calculado en 2986 dólares,

tomando como referencia un salario anual para un programador de 7200 dólares.

También se evaluó el método con un conjunto de fotografías de prueba. Estas fo-

tografías fueron tomadas respetando los requisitos impuestos en el Capítulo 1. De

esta evaluación, el resultado de efectividad del módulo es del 75 %.

Aunque ese porcentaje de éxito no permite el uso del programa escrito en la mayo-

ría de aplicaciones prácticas que se le puedan dar, es lo suficientemente alto como

para considerar que el objetivo inicial de este proyecto se ha cumplido. El análisis

de los resultados obtenidos, indica que la mayoría de las causas de error se deben

al proceso de binarización llevado a cabo en la etapa de preprocesamiento de ima-

gen. Esto se debe a que no siempre es posible encontrar un nivel de umbral que

separe la placa del resto de la fotografía. Este problema se presenta con preferencia

en autos que tienen el mismo color que la placa de identificación. Al menos existen

dos maneras de corregir este problema. La primera consiste en un cambio en la

Page 110: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 90

reglamentación que obligue a los dueños de vehículos a montar la placa sobre una

superficie opaca, o que aumente el tamaño del borde negro que rodea la placa. La

segunda implica modificar la aplicación para que trabaje con fotografías de mayor

resolución. Entre estas dos soluciones, la primera permitiría aumentar el porcentaje

de éxito en el reconocimiento sin necesidad de aumentar el tiempo que necesita la

aplicación para procesar la imagen.

Como parte de este proyecto, se integró la aplicación desarrollada con un programa

de reconocimiento óptico de caracteres. La finalidad de esta integración es producir

una aplicación que pueda obtener el número de la placa de identificación partiendo

de la fotografía de un vehículo. Se evaluaron tres programas de reconocimiento.

Se eligió GOCR por ser el que mejores resultados presentó con un conjunto de

imágenes de prueba.

Las pruebas realizadas sobre esta integración dan como resultado que es capaz

de encontrar correctamente el número de placa en un 54 % de las fotografías. Las

causas de error en el reconocimiento se presentan debido a ambigüedad en ca-

racteres como la letra “O” y el número “0”, o a defectos como suciedad y deterioro

en los caracteres que forman el número de placa. En esta parte, un cambio de

reglamentación se hace necesario para evitar la ambigüedad.

En este proyecto se ha demostrado que un sistema de reconocimiento automático

de número de placa de vehículos puede construirse con la tecnología disponible.

También se ha demostrado que los costos y la dificultad para la construcción de

dicho sistema pueden reducirse si se usan librerías de código existentes. Además

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 exclu-

sivamente para esta aplicación.

En resumen, las siguientes conclusiones pueden extraerse de este proyecto:

La debilidad del procedimiento para la detección de placa presentado en este

proyecto es la binarización. Si para cada imagen se pudiera encontrar un nivel

de umbral tal que segmente la placa del resto de la imagen claramente, el

método desarrollado alcanzaría una efectividad del 97,2 %1. Como se explicó

en la Sección 4.3, existen fotografías para las que no se puede especificar

1Si se corrigen los fallos en la binarización, 46 fotografías se sumarían al numero de éxitos. Estosignifica que el número de fotografías exitosas aumenta a 163 + 46 = 209 dando un porcentaje deéxito de 209

215× 100 = 97,2 %

Page 111: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 91

un nivel de umbral que separe la placa del resto de la fotografía. Esto cons-

tituye una limitación en el método propuesto. Aunque esta limitación puede

superarse por distintos medios, existen otros métodos de detección de placa

que podrían resultar mas económicos en recursos, los cuales deben explorar-

se.

El borde negro que rodea a la placa, ayudaría a superar esta limitación. Des-

graciadamente este borde es muy angosto, y tiende a deteriorarse con faci-

lidad. Marcos como el de la Figura 5.1 son bastante comunes. Desgraciada-

mente la mayoría de ellos se montan de tal manera que bloquean parte de

la placa e impiden al mecanismo de binarización segmentar la la fotografía

correctamente. No obstante, si estos marcos se montaran de tal forma que ro-

dearan la placa sin tapar sus caracteres permitirían al proceso para detección

propuesto funcionar mejor.

Figura 5.1: Ejemplo de un marco porta-placa

La implementación efectiva de un sistema para el reconocimiento automático

del número de placa de vehículos, debe ir acompañada de un cambio en la

reglamentación orientado a facilitar la tarea de dicho sistema. Este cambio

de reglamentación debe considerar los problemas que se presentan debido a

ambigüedad en los caracteres, placas en mal estado, ubicación de la placa en

el vehículo, iluminación, etc.

El problema con la ambigüedad de los caracteres se presenta con cualquier

sistema de reconocimiento automático. Si bien, problemas de ambigüedad

entre los campos de letras y números de la placa son triviales, y pueden so-

lucionarse fácilmente con mecanismos que verifiquen la sintaxis2de la placa,

2Una posible implementación de un verificador de sintaxis, consideraría que los tres primeroscaracteres de la placa son letras y los segundos tres caracteres son números. De acuerdo a esto, siel reconocimiento de caracteres produce un número en el campo de letras, el verificador de sintaxiscorregiría transformando este número en la letra con la que tenga mayor similitud de forma. De lamisma manera procedería si se encuentran letras en el campo de los números. Por ejemplo, si elreconocedor de caracteres produce un el número de placa 1T6-B4G, el reconocedor de sintaxis

Page 112: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 92

la ambigüedad entre elementos de un mismo campo es mas complicada de

resolver, y puede confundir incluso a seres humanos. Este problema es muy

difícil de resolver en el reconocimiento automático de caracteres, y seria mas

económico un cambio en la reglamentación que añada características que

quiten la ambigüedad a los caracteres que conforman el número de placa. La

Figura5.2es una muestra de tipos de fuente especialmente preparados para

evitar ambigüedad, y que son usados en las placas de la República de Alema-

nia3, para facilitar el trabajo de los sistemas de reconocimiento automático de

caracteres.

Figura 5.2: Ejemplo de fuente usada en placas Alemanas

Con respecto a este proyecto, un cambio de reglamentación que incremente

unos centímetros al borde negro que rodea la placa aumentaría considera-

blemente el porcentaje de éxito en la detección. Sin embargo, existen otras

formas de aumentar el porcentaje de éxito, las cuales deben explorarse antes

de realizar tal modificación. En las recomendaciones de la sección siguiente

se presenta un método alternativo al propuesto en este trabajo, que no nece-

sita que la placa presente un contraste apreciable con el medio que la rodea.

Existen formas mas agresivas de disminuir los errores en la detección. Por

ejemplo, en el cinturón de acero implementado en Londres para lidiar con

amenazas terroristas, existen sistemas de reconocimiento automático de nú-

mero de placa de vehículos. En este caso, se eliminan los problemas relacio-

nados con la iluminación, la ubicación de la placa en el vehículo y la velocidad

del vehículo, con la construcción de obstáculos especiales frente a las cáma-

ras por los que los autos deben circular. Estos obstáculos están construidos

de tal manera que, cuando el vehículo los pasa, debe reducir la velocidad, y

el frente del vehículo apunta directamente hacia la cámara[31].

Correcciones al reglamento de la ley de tránsito de esta naturaleza deben ser

estudiadas cuidadosamente. Antes de cualquier corrección es necesario estu-

diar con mas detenimiento los beneficios y los perjuicios que traerían sistemas

de detección automática de número de placa de vehículos.

produciría la siguiente salida: ITG-846. Nótese que se han reemplazado los números del primercampo por las letras con las que tienen mayor similitud física, y se han reemplazado las letras delsegundo campo por los números que mas se les parecen.

3Tomado de: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition

Page 113: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 93

Es mi opinión que los sistemas de vigilancia automática no son recomenda-

bles. Una solución mas efectiva, aunque requiere mas recursos es la educa-

ción. Orwell en el ya clásico libro 1984 describió una sociedad controlada, que

es a donde nos dirigimos si seguimos buscando formas de vigilar a las perso-

nas. Es indudable que un sistema de vigilancia automática es una herramienta

valiosa en las manos adecuadas. La pregunta entonces es ¿Cuáles son las

manos adecuadas?. La historia nos ha enseñado que cualquier persona en

una situación de poder tiende a abusar de dicha situación. Irónicamente esta

desconfianza en la naturaleza humana nos lleva a confiar en las personas y

eliminar la vigilancia.

Para tareas como el control de tráfico otras soluciones pueden resultar mejo-

res que el reconocimiento automático de placa. Drachten4 , por ejemplo, es

una ciudad de Holanda que trata de solucionar sus problemas de tráfico vehi-

cular de una manera no ortodoxa y que al parecer les está dando buenos

resultados. Esta iniciativa consiste en eliminar líneas de seguridad, señales,

semáforos y otros métodos tradicionales de seguridad vial, forzando a los con-

ductores a dejar de mirar las señales y empezar a mirar a las personas.

5.2. RECOMENDACIONES

Aun queda mucho trabajo por realizar para obtener un sistema de detección 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 continuación se exponen algunas recomendaciones para futuros

trabajos sobre el tema.

El método propuesto en este trabajo puede optimizarse para disminuir los

tiempos necesarios para la detección de la placa. La Figura 5.3 muestra la im-

plementación actual del método junto a una implementación alterna que per-

mitiría obtener una disminución en el tiempo de procesamiento. Como puede

observarse, en la implementación actual, primero se obtiene un conjunto de

imágenes binarias para cada nivel de umbral y canal de color. Luego este

conjunto de imágenes es analizado para encontrar rectángulos. Si se consi-

dera que dos imágenes binarias a niveles de umbral próximos se diferencian

4Mas información acerca de Drachten y el peculiar experimento de control de tráfico se encuentraen la siguiente dirección web: http://en.wikipedia.org/wiki/Drachten#Traffic_experiment

Page 114: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 94

muy poco, es probable que éstas produzcan los mismos rectángulos. Por esta

razón es necesaria la eliminación de rectángulos duplicados.

Figura 5.3: Optimización del método de detección de placa

En la misma figura puede verse una implementación que no produce infor-

mación duplicada. Aquí las imágenes obtenidas luego de la binarización son

analizadas individualmente en busca de la placa. De esta manera se reducen

también 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 vehículo. En el peor, el programa necesita

analizar las imágenes binarias para todos los umbrales en los tres canales de

color.

El tiempo promedio de procesamiento puede reducirse aun mas si el análisis

anterior se realiza empezando por los umbrales en los que es mas probable

se encuentre la placa del vehículo.

Un método alterno para la detección de placa que no requiere la binarización

y solo necesita que exista un claro contraste entre el fondo de la placa y los

Page 115: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 95

caracteres que contiene puede verse en la Figura 5.4. Este método usa el

operador morfológico apertura con un elemento estructurante horizontal con la

finalidad de producir líneas paralelas al rededor del número de placa como se

muestra en la Figura 5.5. Estas líneas pueden encontrarse usando un método

como la transformada de Hough, o incluso usando la proyección a lo largo del

eje vertical de la imagen.

Figura 5.4: Método alterno para la detección de placa

Figura 5.5: Efecto de la operación morfológica apertura con un elemento estructurantehorizontal en el método de la Figura 5.4. Nótese las líneas paralelas que seforman alrededor de los caracteres de la placa

Últimamente se ha planteado, como medida para mejorar el tránsito vehicu-

lar en Quito, un esquema de control de tráfico que impone restricciones a la

circulación de vehículos de acuerdo al número de placa. Esto requiere que

personal de la policía o el municipio se encargue de verificar los números de

placa de los vehículos circulando.

Futuros trabajos en el tema de reconocimiento de matrículas podrían referirse

a la implementación de sistemas completos, que incluirían los elementos para

Page 116: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

CAPÍTULO 5. CONCLUSIONES Y RECOMENDACIONES 96

la toma de imágenes, y la posible implementación en esquemas de control de

tráfico como el descrito.

Debido a la naturaleza no crítica de mecanismos de control de tráfico como

el expuesto –con el calificativo de no crítica, me refiero a que no hay vidas

en juego si el sistema no reconoce correctamente el número de placa de un

vehículo– hasta un sistema con un modesto índice de reconocimiento sería

aceptable.

Deberían también realizarse estudios de costo de implementación y mante-

nimiento de sistemas como estos, así también como el impacto social que

representan los sistemas de vigilancia automática.

El porcentaje de exitos del reconocedor de caracteres puede aumentarse si se

usa algún procedimiento para extraer y enviar los caracteres individualmente

al reconocimiento.

Esta segmentación de caracteres podría conseguirse, por ejemplo, usando

la proyección vertical, como lo hacen en [32], o, de una manera mas sim-

ple,aprovechando que luego de la transformación geométrica los caracteres

estan separados por distancias fijas y conocidas.

Page 117: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Bibliografía

[1] Jun-Wei Hsieh, Shih-Hao Yu , and Yung-Sheng Chen. Morphology-based Li-

cense Plate Detection from Complex Scenes. Proceedings of the 16 th Inter-

national Conference on Pattern Recognition (ICPR’02).

[2] Bai Hongliang and Liu Changping. A hybrid License Plate Extraction Method

Based On Edge Statistics and Morphology. Proceedings of the 17th Internatio-

nal Conference on Pattern Recognition (ICPR’04).

[3] Sebastián Thrun, Gary Bradski, Daniel Russakoff. Stanford course cs223b on

computer vision. http://robots.stanford.edu/cs223b

[4] Reglamento a la Ley de Tránsito 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 Re-

flective Sheeting, series 320, Product Bulletin 3260. September 1996.

[6] Ching-Tang Hsieh, Yu-Shan Juan, Kuo-Ming Hung, Multiple License Plate De-

tection for Complex Background. Proceedings of the 19th International Confe-

rence on Advanced Information Networking and Applications (AINA’05).

[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-España.

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

Page 118: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

BIBLIOGRAFÍA 98

[11] Halina Kwasnicka and Bartosz Wawrzyniak. License plate localization and re-

cognition in camera pictures. Conference In Artificial Intelligence Methods. AI-

METH 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 (AutoID’05).

[13] Sunghoon Kim, Daechul Kim, Younbok Ryu, and Gyeonghwan Kim. A Robust

Licence-Plate Extraction Method under Complex Image Conditions. Procee-

dings of the 16 th International Conference on Pattern Recognition (ICPR’02).

IEEE Computer Society.

[14] Intel Corporation. Open Source Computer Vision Library Reference Manual.

Intel Corporation. 2001.

[15] Arturo Legarda Sáenz, Mario I. Chacón M. Alejandro Zimmerman Solís. Lo-

calización De Placas En Vehículos Automotores. Instituto Tecnológico de

Chihuahua.

[16] Mi-Ae Ko, Young-Mo Kim. License Plate Surveillance System Using Weighted

Template Matching. Proceedings of the 32nd Applied Imagery Pattern Recog-

nition Workshop (AIPR’03).

[17] Tran Duc Duan, Tran Le Hong Du, Tran Vinh Phuoc, Nguyen Viet Hoang. Buil-

ding an Automatic Vehicle License-Plate Recognition System. Intl. Conf. in

Computer Science RIVF’05. February 2005, Can Tho, Vietnam.

[18] Martínez Gonzalo. Estudio de diferentes métodos de extracción de caracterís-

ticas físicas de imagen y su aplicación al reconocimiento de patrones. Tesis.

Escuela Politécnica Nacional. 1999.

[19] Yusuf A Syed, Sarfraz M. Color Edge Enhancement based Fuzzy Segmenta-

tion of License Plates. Proceedings of the Ninth International Conference on

Information Visualisation (IV’05).

[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

Page 119: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

BIBLIOGRAFÍA 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. Pág. 3246.

[25] Gustavo Germán Aguilar Carrera. Procesamiento Digital de Imágenes Utilizan-

do Filtros Morfológicos. Tesis, Escuela Politécnica Nacional, 1995.

[26] Pesoa Lúcio, 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. Pren-

tice 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 CA-

LIBRE Program, University Rey Juan Carlos and Spanish CICyT. 2005.

[31] Mullins Justin. Ring of Steell 2 IEEE Spectrum Magazine, July 2006. Interna-

tional Edition. Pg6-7.

[32] Yungang Zhang, Changshui Zhang. A New Algorithm for Character Segmenta-

tion 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 Internatio-

nal Conference on Pattern Recognition (ICPR’04).

[34] Ley de Tránsito 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.

Page 120: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

BIBLIOGRAFÍA 100

[36] Jefferson Vega Aguirre. Simulación de un sistema de seguimiento antirrobo

basado en el procesamiento digital de imagen y reconocimiento de patrones.

Tesis. Escuela Politécnica Nacional. 1997.

[37] Bernardo Barraza Sotomayor, Clesio Luis Tossi. Segmentación de imagen para

visión por Computadores. XX Jornadas de Ingeniería Eléctrica, Escuela Poli-

técnica 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 implementa-

tion 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 Al-

gorithm 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 Recogni-

tion of License Plates of Motorcycles and Vehicles on Highways. Proceedings

of the 17th International Conference on Pattern Recognition (ICPR’04).

[42] Khairel A. MohamedAbstracting Digital Ink Traces with the Douglas-Peucker

Algorithm. Multimedia Research Group. Institute of computer science, Albert-

Ludwigs-Universitat Freiburg.

[43] Wenjing Jia, Huaifeng Zhang and Xiangjian He. Mean Shift for Accurate Num-

ber Plate Detection. Proceedings of the Third International Conference on In-

formation Technology and Applications (ICITA’05).

[44] D.G. Bailey, D. Irecki, B.K. Lim and L. Yang. Test Bed For Number Plate Re-

cognition Aplications. Proceedings of the First IEEE International Workshop on

Electronic Design, Test and Applications (DELTA’02).

Page 121: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ANEXO A

CÓDIGO FUENTE

101

Page 122: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 102

A.1. ENUMERACIÓN DE LAS FUNCIONES IMPLEMENTADAS

A.1.1. Archivo imgproc.c, imgproc.h

cvEqualizeHist: Realiza la ecualización del histograma. Adaptada de la versión

0.9.9RC1 de OpenCV.

cvOtsu: Calcula el umbral óptimo usando el método de Otsu. Código adaptado

de la versión 0.3 de gocr.

cvVertProy: Calcula la proyección vertical de una imagen.

make_message: Construye una cadena de caracteres combinando sus argu-

mentos. 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 rectángulos en la imagen. Partes del código fueron

tomadas de un programa de ejemplo que viene con la librería OpenCV. El

programa se llama squares, y se encuentra en la carpeta examples que se

distribuye junto con el código fuente de OpenCV.

findPlate: Encuentra la placa de identificación en una imagen.

drawSquares: Dibuja los rectangulos encontrados sobre la imagen. Partes del

código fueron tomadas de un programa de ejemplo que viene con la librería

OpenCV. El programa se llama squares, y se encuentra en la carpeta exam-

ples que se distribuye junto con el código 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 rectángulos se intersecan.

Page 123: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 103

pop_element: Toma los rectángulos de la parte de arriba de la pila.

push_element_end: Pone los rectángulos al final de la pila.

push _element: Pone los rectángulos al inicio de la pila.

angle: Calcula el ángulo entre dos vectores que tienen un punto común.

proporcion: Calcula la proporción entre dos lados adyacentes.

duplicados: Esta función elimina los rectángulos duplicados.

ordenar_vertices: Ordena los vértices del rectángulo.

analisis_proyeccion: Implementa el análisis de la proyección vertical.

picos_sobre_avg: Encuentra el número de picos en la proyección vertical.

picos_bajo_minsdv: Encuentra el número de valles en la proyección vertical.

A.1.4. Archivo parseargs.h

parse_opt: Realiza el procesamiento de los argumentos pasados en la línea

de comandos a la aplicación.

A.1.5. Archivo main.c

main: Programa Principal.

Page 124: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 104

A.2. PROGRAMA PRINCIPAL

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

2 * Identificacion en fotografias de vehiculos.

3 *4 * VLPD Programa principal

5 * Programa para la deteccion de la placa de vehiculos\n

6 * (c) Escuela Politecnica Nacional, Diego F. Asanza. 2006.\n

7 * El codigo fuente aqui descrito se distribuye con la esperanza de que

8 * sea util, pero sin ninguna garantia,

9 * ni siquiera la garantia implicita de mercantibilidad o adecuacion para

10 * un proposito particular. \n

11 * @param: vlpd [opciones] imagen_entrada imagen_salida.\n

12 * Los argumentos que pueden pasarse se explican en parseargs.h

13 */

1415 #include <s td i o . h>16 #include <highgu i . h>17 #include " par s ea rg s . h"18 #include "auxfunc . h"19 #include " imgproc . h"20 #include "vlpdgeom . h"2122 int

23 main (int argc , char **argv )24 {25 // declaracion de variables

26 // Imagenes

27 IplImage *img0 ;28 IplImage * r e s u l t ;29 IplImage *gray ;30 IplImage *canalx ;31 IplImage *temp ;32 // secuencias

33 CvSeq * contornos ;34 CvSeq * r e c t angu l o s ;3536 // memoria

37 CvMemStorage *almacen ;38 CvMemStorage *almacen2 ;39 int cs , t s ;4041 // umbrales

42 double umbral [ ] = {68 , 75 , 110 , 135 , 143 , 157 , 175 , 190 , 209} ;43 // proceso de argumentos de entrada

44 struct arguments argumentos ;45 argumentos . verbose = 0 ;46 argumentos . otsu_div = OTSU_DIV;47 argumentos . max_area = MAX_AREA;48 argumentos . min_area = MIN_AREA;49 argumentos .max_area_comun = MAX_AREA_COMUN;50 argumentos . max_cos = COS_MAX;51 argumentos . max_rel = REL_MAX;52 argumentos . min_rel = REL_MIN;53 argumentos . res_ht = RESULT_HT;54 argumentos . res_wt = RESULT_WT;55 argumentos . dp_dist_min = DP_DIST_MIN;56 argumentos . std_dev_max_val = STD_DEV_MAX_VAL;57 argumentos . std_dev_min_val = STD_DEV_MIN_VAL;58 argumentos . avg_max_val = AVG_MAX_VAL;59 argumentos . avg_min_val = AVG_MIN_VAL;60 argumentos . pk_min_sep = PK_MIN_SEP;61 argumentos . pk_max_down = PK_MAX_DOWN;62 argumentos . pk_max_sep = PK_MAX_SEP;63 argumentos . pk_max_up = PK_MAX_UP;64 argp_parse (&argp , argc , argv , 0 , 0 , &argumentos ) ;6566 // carga de la imagen del disco a la memoria

67 if ( argumentos . verbose )68 p r i n t f ( "Cargando l a imagen : %s \n" , argumentos . a rgs [ 0 ] ) ;69 img0 = cvLoadImage ( argumentos . a rgs [ 0 ] , 1 ) ;

Page 125: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 105

70 if ( ! img0 )71 {72 p r i n t f ( "No se puede ab r i r %s \n" , argumentos . a rgs [ 0 ] ) ;73 return 1 ;74 }75 // inicializo imagenes temporales

76 if ( argumentos . verbose )77 p r i n t f ( " I n i c i a l i z a n d o Imagenes Temporales . . . \ n" ) ;78 canalx = cvCreateImage ( cvGetSize ( img0 ) , IPL_DEPTH_8U, 1 ) ;79 gray = cvCreateImage ( cvGetSize ( img0 ) , IPL_DEPTH_8U, 1 ) ;80 temp = cvCreateImage ( cvGetSize ( img0 ) , IPL_DEPTH_8U, 1 ) ;81 r e s u l t = cvCloneImage ( img0 ) ;82 // memoria de almacenamiento dinamico

83 if ( argumentos . verbose )84 p r i n t f ( " I n i c i a l i z a n d o memoria de a l o ca c i on Dinamica . . . \ n" ) ;85 almacen = cvCreateMemStorage ( 0 ) ;86 almacen2 = cvCreateMemStorage ( 0 ) ;87 r e c t angu l o s = cvCreateSeq (0 , sizeof (CvSeq ) , sizeof ( CvPoint ) , almacen2 ) ;8889 // Lazo principal.

90 if ( argumentos . verbose )91 p r i n t f ( " In i c i ando ru t ina p r i n c i p a l . . . \n" ) ;92 for ( c s = 1 ; cs <= 3 ; cs++)93 {94 // separacion de los canales RGB.

95 if ( argumentos . verbose )96 p r i n t f ( "Separando e l cana l %d\n" , cs ) ;97 cvSetImageCOI ( img0 , cs ) ;98 cvCopy ( img0 , gray , 0 ) ;99

100 for ( t s = 0 ; t s < 9 ; t s++)101 {102 // ecualizacion

103 if ( argumentos . verbose )104 p r i n t f ( "Ecual izando imagen . . . \ n" ) ;105 cvEqua l i z eH i s t ( gray , canalx ) ;106 if ( argumentos . verbose && ts == 4)107 {108 cvNamedWindow ( " Ecua l i z a c i on " , 1 ) ;109 cvShowImage ( " Ecua l i z a c i on " , canalx ) ;110 cvWaitKey ( 0 ) ;111 cvDestroyWindow ( " Ecua l i z a c i on " ) ;112 }113 // binarizacion, umbral[ts] contiene el nivel de umbral.

114 if ( argumentos . verbose )115 p r i n t f ( "Binar izando imagen , n i v e l de umbral %f \n" , umbral [ t s ] ) ;116 cvThreshold ( canalx , canalx , umbral [ t s ] , 255 , CV_THRESH_BINARY) ;117 if ( argumentos . verbose && ts == 4)118 {119 cvNamedWindow ( " B ina r i z a c i on " , 1 ) ;120 cvShowImage ( " B ina r i z a c i on " , canalx ) ;121 cvWaitKey ( 0 ) ;122 cvDestroyWindow ( " B ina r i z a c i on " ) ;123 }124 if ( argumentos . verbose )125 p r i n t f ( "Encontrando Contornos . . . \ n" ) ;126 // encuentra contornos en la imagen

127 cvFindContours ( canalx , almacen , &contornos ,128 sizeof (CvContour ) , CV_RETR_LIST,129 CV_LINK_RUNS, cvPoint (0 , 0 ) ) ;130 if ( argumentos . verbose && ts == 4)131 {132 // dibuja los contornos en la imagen original

133 // usado para depuracion

134 p r i n t f ( "Encontrados %d contornos \n" , contornos−>to t a l ) ;135 IplImage *img1 = cvCloneImage ( img0 ) ;136 cvSetImageCOI ( img1 , 0 ) ;137 cvDrawContours ( img1 , contornos ,138 cvSca la r (1 , 255 , 1 , 1 ) ,139 cvSca la r (1 , 255 , 1 , 1 ) , 1 , 2 , 8 ) ;140 cvNamedWindow ( "Contornos" , 1 ) ;141 cvShowImage ( "Contornos" , img1 ) ;

Page 126: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 106

142 cvWaitKey ( 0 ) ;143 cvDestroyWindow ( "Contornos" ) ;144 cvReleaseImage (&img1 ) ;145 }146 // seleccion de precandidatos.(aproximacion poligonal +

147 // seleccion de candidatos

148 if ( argumentos . verbose )149 p r i n t f ( "Entrando a l proceso de de t e c c i on de r e c t angu l o s . . . \ n" ) ;150 f i ndRec tang l e s ( contornos , r ec tangu lo s , argumentos . min_area ,151 argumentos . max_area , argumentos . max_cos ,152 argumentos . min_rel , argumentos . max_rel , 0 , argumentos . dp_dist_min ) ;153 if ( argumentos . verbose && ts == 4)154 {155 IplImage *img1 = cvCloneImage ( img0 ) ;156 cvSetImageCOI ( img1 , 0 ) ;157 img1 = drawSquares ( img1 , r e c t angu l o s ) ;158 cvNamedWindow ( "Rectangulos " , 1 ) ;159 cvShowImage ( "Rectangulos " , img1 ) ;160 cvWaitKey ( 0 ) ;161 cvDestroyWindow ( "Rectangulos " ) ;162 cvReleaseImage (&img1 ) ;163 }164 if ( argumentos . verbose )165 p r i n t f ( "Encontrados %d re c tangu l o s \n\n" , r ec tangu lo s−>to t a l / 4 ) ;166 }167168 }169 if ( argumentos . verbose )170 p r i n t f ( "Encontrados %d re c tangu l o s \n" , r ec tangu lo s−>to t a l / 4 ) ;171 // eliminacion de areas duplicadas

172 dup l i cados ( r ec tangu lo s , argumentos .max_area_comun , argumentos . verbose ) ;173 if ( argumentos . verbose )174 {175 p r i n t f ( "Total %d candidatos a p laca \n" , r ec tangu lo s−>to t a l / 4 ) ;176 p r i n t f ( " In i c i ando l a d i s c r im ina c i on f i n a l . . . \ n" ) ;177 }178 // La imagen original es necesaria para recortar la placa de la

179 // fotografia.

180 cvSetImageCOI ( img0 , 0 ) ;181182 // seleccion y filtrado

183 //transformacion Geometrica

184185 f i ndP l a t e ( r ec tangu lo s , img0 , argumentos . res_wt , argumentos . res_ht ,186 argumentos . std_dev_min_val , argumentos . std_dev_max_val ,187 argumentos . avg_min_val , argumentos . avg_max_val ,188 argumentos . pk_min_sep , argumentos . pk_max_sep ,189 argumentos . pk_max_up, argumentos . pk_max_down,190 argumentos . otsu_div , argumentos . verbose , argumentos . args [ 1 ] ) ;191192 if ( argumentos . verbose )193 p r i n t f ( "Se ha encontrado %d p laca s v eh i c u l a r e s \n" ,194 r ec tangu lo s−>to t a l / 4 ) ;195 // liberacion de recursos

196 cvReleaseImage (&img0 ) ;197 cvReleaseImage (& r e s u l t ) ;198 cvReleaseImage (&gray ) ;199 cvReleaseImage (&canalx ) ;200 cvReleaseImage (&temp ) ;201 // memoria

202 cvReleaseMemStorage (&almacen ) ;203 cvReleaseMemStorage (&almacen2 ) ;204205 if ( r ec tangu lo s−>to t a l == 0)206 {207 p r i n t f ( "No se ha encontrado l a p laca de l v eh i cu l o \n\n" ) ;208 return (−1);209 }210211 return ( 0 ) ;212 }

Page 127: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 107

A.3. FUNCIONES AUXILIARES

A.3.1. MANEJO DE ARGUMENTOS DE ENTRADA

1 /*2 * Parseargs.h

3 * Funciones para el procesamiento de argumentos de entrada

4 *5 * (c) 2006 Diego F. Asanza

6 *7 */

89 #ifndef _PARSEARGS_H

10 #define _PARSEARGS_H1112 #ifdef __cplusplus13 extern "C"14 {15 #endif

1617 #include <argp . h>18 #include <g l i b . h>19 const char *argp_program_version = "vlpd 0 .2 " ;20 const char *argp_program_bug_address = "<diego_asanza@ieee . org>" ;2122 struct arguments23 {24 char *args [ 2 ] ; ///< Archivo de entrada, archivo de salida

25 double otsu_div ; ///< Divisor para el metodo de otsu

26 double max_cos ; ///< Maximo coseno entre angulos de lados adyacentes

27 double max_rel ; ///< Maxima relacion entre lados

28 double min_rel ; ///< Minima relacion entre lados

29 int res_wt ; ///< Ancho de la imagen resultante

30 int res_ht ; ///< Alto de la imagen resultante

31 int min_area ; ///< Area minima

32 int max_area ; ///< Area maxima

33 double dp_dist_min ; ///< distancia minima para el algoritmo de D−P34 double std_dev_min_val ;///<Minimo valor de la desviacion standard

35 double std_dev_max_val ;///<max val de la desv standard

36 double avg_min_val ;///<min val del promedio

37 double avg_max_val ;///<max val del promedio

38 int pk_min_sep ;///<minima separacion entre picos

39 int pk_max_sep ;///<max separacion entre picos

40 int pk_max_up ;///<mumero de picos sobre limite_superior

41 int pk_max_down ;///<Numero de picos bajo limite_inferrior

42 double max_area_comun ;///<area comun para considerar duplicados

43 int verbose ; ///< Switch de depuracion

44 } ;4546 static struct argp_option opt ions [ ] = {47 {" verbose " , ' v ' , 0 , 0 , " Sa l i da de depurac ion " } ,48 {"otsu_div" , 'u ' , " D iv i s o r para Otsu" , 0 , " D iv i s o r para Otsu" } ,49 {"max_cos" , ' c ' , "Coseno ent r e angulos adyacentes " , 0 ,50 "Coseno ent r e angulos adyacentes " } ,51 {"max_rel" , 'R ' , "Maxima Relac ion ent r e l ados " , 0 ,52 "Maxima r e l a c i o n ent r e l ados " } ,53 {"min_rel" , ' r ' , "Minima r e l a c i o n ent r e l ados " , 0 ,54 "Minima r e l a c i o n ent r e l ados " } ,55 {"res_wt" , 'w ' , "Ancho de l a imagen r e s u l t a n t e " , 0 ,56 "Ancho de l a imagen r e s u l t a n t e " } ,57 {" res_ht" , 'h ' , "Alto de l a imagen r e s u l t a n t e " , 0 ,58 "Alto de l a imagen r e s u l t a n t e " } ,59 {"min_area" , ' a ' , "Area minima de l r e c tangu lo " , 0 ,60 "Area minima de l r e c tangu lo " } ,61 {"max_area" , 'A ' , "Area maxima de l r e c tangu lo " , 0 ,62 "Area maxima de l r e c tangu lo " } ,63 {"dp_dist_min" , 'D ' , " D i s tanc ia minima para douglas−peuker " , 0 ,64 "Di s tanc ia minima para douglas−peuker " } ,65 {"std_dev_min_val" , ' s ' , "Desv iac ion Minima" , 0 , "Desv iac ion Minima" } ,

Page 128: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 108

66 {"std_dev_max_val" , 'S ' , "Desv iac ion Maxima" , 0 , "Desv iac ion Maxima" } ,67 {"avg_min_val" , 'p ' , "Promedio minimo" , 0 , "Promedio Minimo" } ,68 {"avg_max_val" , 'P ' , "Promedio Maximo" , 0 , "Promedio Maximo" } ,69 {"pk_min_sep" , ' k ' , " Separac ion minima ent re p i c o s " , 0 ,70 " Separac ion Minima ent re p i c o s " } ,71 {"pk_max_sep" , 'K ' , " Separac ion Maxima ent re p i c o s " , 0 ,72 " Separac ion Maxima ent r e p i c o s " } ,73 {"pk_max_up" , 'U ' , "Numero maximo de p i c o s sobre e l l im i t e " , 0 ,74 "Numero maximo de p i co s sobre e l l im i t e " } ,75 {"pk_max_down" , 'd ' , "Numero maximo de p i co s bajo e l l im i t e " , 0 ,76 "Numero maximo de p i co s bajo e l l im i t e " } ,77 {"max_area_comun" , 'C ' , "Area Comun maxima" , 0 , "Area comun maxima" } ,78 {0}79 } ;8081 static error_t parse_opt (int key , char *arg , struct argp_state * s t a t e )82 {83 struct arguments *arguments = state−>input ;84 switch ( key )85 {86 case ' v ' :87 arguments−>verbose = 1 ;88 break ;89 case ' u ' :90 arguments−>otsu_div = g_asc i i_st r tod ( arg , NULL) ;91 break ;92 case ' c ' :93 arguments−>max_cos = g_asc i i_st r tod ( arg ,NULL) ;94 break ;95 case ' r ' :96 arguments−>min_rel = g_asc i i_st r tod ( arg , NULL) ;97 break ;98 case 'R ' :99 arguments−>max_rel = g_asc i i_st r tod ( arg , NULL) ;

100 break ;101 case 'w ' :102 arguments−>res_wt = (int ) g_asc i i_st r tod ( arg , NULL) ;103 break ;104 case ' h ' :105 arguments−>res_ht = (int ) g_asc i i_st r tod ( arg , NULL) ;106 break ;107 case ' a ' :108 arguments−>min_area = (int ) g_asc i i_st r tod ( arg , NULL) ;109 break ;110 case 'A ' :111 arguments−>max_area = (int ) g_asc i i_st r tod ( arg , NULL) ;112 break ;113 case 'D ' :114 arguments−>dp_dist_min = g_asc i i_str tod ( arg , NULL) ;115 break ;116 case ' s ' :117 arguments−>std_dev_min_val = g_asc i i_st r tod ( arg , NULL) ;118 break ;119 case ' S ' :120 arguments−>std_dev_max_val = g_asc i i_str tod ( arg , NULL) ;121 break ;122 case ' p ' :123 arguments−>avg_min_val = g_asc i i_st r tod ( arg , NULL) ;124 break ;125 case 'P ' :126 arguments−>avg_max_val = g_asc i i_str tod ( arg , NULL) ;127 break ;128 case ' k ' :129 arguments−>pk_min_sep = (int ) g_asc i i_st r tod ( arg , NULL) ;130 break ;131 case 'K ' :132 arguments−>pk_max_sep = (int ) g_asc i i_st r tod ( arg , NULL) ;133 break ;134 case 'U ' :135 arguments−>pk_max_up = (int ) g_asc i i_st r tod ( arg , NULL) ;136 break ;137 case ' d ' :

Page 129: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 109

138 arguments−>pk_max_down = (int ) g_asc i i_st r tod ( arg , NULL) ;139 break ;140 case 'C ' :141 arguments−>max_area_comun = g_asc i i_st r tod ( arg , NULL) ;142 break ;143 case ARGP_KEY_ARG:144 if ( s ta te−>arg_num >= 2)145 {146 argp_usage ( s t a t e ) ;147 }148 arguments−>args [ s ta te−>arg_num ] = arg ;149 break ;150 case ARGP_KEY_END:151 if ( s ta te−>arg_num < 2)152 {153 argp_usage ( s t a t e ) ;154 }155 break ;156 default :157 return ARGP_ERR_UNKNOWN;158 }159 return 0 ;160 }161162 static char args_doc [ ] = " i n f i l e , o u t f i l e " ;163164 static char doc [ ] = "vlpd −− Este programa toma como entrada una \165 f o t o g r a f i a de l a parte f r o n t a l o p o s t e r i o r de un veh icu lo , \166 y produce como s a l i d a una f o t o g r a f i a que cont i ene l a p laca de dicho \167 veh i cu l o . \ v . Para mas in formac ion con su l t e e l manual . " ;168169 static struct argp argp = { opt ions , parse_opt , args_doc , doc } ;170171172 #ifdef __cplusplus173 }174 #endif

175176 #endif /* _PARSEARGS_H */

A.3.2. DETECCIÓN DE RECTANGULOS, SELECCIÓN Y FILTRADO

1 /***************************************************************************2 * auxfunc.h

3 *4 * Sun Aug 27 15:36:39 2006

5 * Copyright 2006 Diego F. Asanza

6 * [email protected]

7 ****************************************************************************/

89 /*

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

11 * it under the terms of the GNU General Public License as published by

12 * the Free Software Foundation; either version 2 of the License, or

13 * (at your option) any later version.

14 *15 * This program is distributed in the hope that it will be useful,

16 * but WITHOUT ANY WARRANTY; without even the implied warranty of

17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

18 * GNU General Public License for more details.

19 *20 * You should have received a copy of the GNU General Public License

21 * along with this program; if not, write to the Free Software

22 * Foundation, Inc., 59 Temple Place − Suite 330, Boston, MA 02111−1307, USA.

23 */

2425 /* Definicion de funciones

26 * Las funciones aqui definidas se implementan en auxfunc.c

27 */

Page 130: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 110

28 #ifndef _AUXFUNC_H29 #define _AUXFUNC_H3031 #ifdef __cplusplus32 extern "C"33 {34 #endif

3536 #include <cv . h>37 #include <cxcore . h>3839 /**\brief El area minima que debe tener un contorno para ser candidato

40 * a placa

41 */

42 #define MIN_AREA 45043 /**\brief El area maxima que debe tener un contorno para ser candidato

44 * a placa

45 */

46 #define MAX_AREA 500004748 /**\brief Multiplicador para el error minimo en el metodo de Douglas−Peuker49 */

50 #define DP_DIST_MIN 0.02551 /**\brief El valor del coseno de angulos adyacentes.

52 */

53 #define COS_MAX 0.354 /**\brief La maxima relacion entre lados del rectangulo */

55 #define REL_MAX 2.756 /**\brief La minima relacion entre lados del rectangulo*/

57 #define REL_MIN 1 .358 /**\brief El ancho de la imagen resultado */

59 #define RESULT_WT 10060 /**\brief El alto de la imagen resultado*/

61 #define RESULT_HT 5062 /**\brief Divisor para el metodo de otsu*/

63 #define OTSU_DIV 1 .664 /**\brief Encuentra rectangulos en un conjunto de contornos, que cumplan

65 *con ciertas condiciones.

66 *@param contornos Un puntero a la ubicacion de los contornos a analizar

67 *@param rectangulos Puntero al almacenamiento para los rectangulos

68 * encontrados.

69 *@param area_min El area minima que necesita el contorno para ser

70 * considerado un rectangulo valido

71 *@param area_max El area maxima que necesita el contorno para ser

72 * considerado un rectangulo valido.

73 *@param cos_max El \f$|\cos(\Phi)|\f$ maximo del angulo \f$\Phi\f$ entre

74 * lados consecutivos que el contorno necesita para ser

75 * considerado rectangulo valido.

76 *@param rel_min Relacion minima entre el lado mas amplio y el mas angosto,

77 * para que el rectangulo sea considerado valido.

78 *@param rel_max Relacion maxima entre el lado mas amplio y mas angosto para

79 * que el contorno sea considerado un rectangulo valido.

80 *@param verbose Si es diferente de cero, muestra informacion util para la

81 * depuracion.

82 */

83 void f i ndRec tang l e s (CvSeq * contornos , CvSeq * r ec tangu lo s , int area_min ,84 int area_max , double cos_max , double rel_min ,85 double rel_max , int verbose , double dp_dist_min ) ;8687 /**\brief Encuentra los rectangulos en la imagen que contienen la placa del

88 * del vehiculo.

89 *90 *@param rectangulos Los rectangulos que se desean analizar.

91 *@param imagen La imagen sobre la que se buscara la placa del vehiculo

92 *@param width El ancho de la imagen resultado

93 *@param height El alto de la imagen resultado

94 *@param minsdev El valor minimo de la desviacion standard que debe cumplir

95 * el rectangulo analizado para ser considerado placa.

96 *@param maxsdev El valor maximo de la desviacion standard que debe cumplir

97 * el rectangulo analizado para ser considerado placa.

98 *@param minavg El valor promedio minimo que debe cumplir el rectangulo

99 * analizado para ser considerado placa.

Page 131: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 111

100 *@param maxavg El valor promedio maximo que debe cumplir el rectangulo

101 * analizado para ser considerado placa.

102 *@param pkmin El limite bajo el cual se cuentan los picos en la

103 * Proyeccion vertical.

104 *@param pkmax El limite sobre el cual se cuentan los picos en la

105 * proyeccion vertical

106 *@param pkup Numero de picos sobre el limite pkmax que debe tener el

107 * rectangulo de imagen analizado para ser considerado placa.

108 *@param pkdown Numero de picos bajo el limite pkmin que debe tener el

109 * Rectangulo analizado para ser considerado placa.

110 *@param otsu_div Divisor para el metodo de otsu

111 *@param verbose Si es diferente de cero muestra la salida de

112 * Depuracion.

113 *@param archivo_salida El nombre del archivo con el que se guardara el

114 * resultado

115 */

116 void f i ndP l a t e (CvSeq * r ec tangu lo s , IplImage * imagen , int width ,117 int height , double minsdev , double maxsdev , double minavg ,118 double maxavg , int pkmin , int pkmax , int pkup , int pkdown ,119 double otsu_div , int verbose , char *arch ivo_sa l ida ) ;120121 /**\brief Dibuja los rectangulos sobre la imagen.

122 *123 * @param img Imagen sobre la que se dibujaran los rectangulos

124 * @param squares Rectangulos que se dibujaran sobre la imagen

125 * img.

126 */

127 IplImage *drawSquares ( IplImage * img , CvSeq * squares ) ;128129 /**\brief Encuentra la distancia entre los puntos p0 y p1.

130 *131 * @param p0,p1 puntos entre los que se calculara la distancia.

132 */

133 float d i s t anc e ( CvPoint * p0 , CvPoint * p1 ) ;134135 /**\brief Filtra la imagen para el uso del OCR

136 *137 * @param imagen Imagen a filtrar

138 * @param verbose si es diferente de cero muestra informacion de depuracion*/

139 void ocrprepare ( IplImage * imagen , int verbose ) ;140141 #ifdef __cplusplus142 }143 #endif

144145 #endif /* _AUXFUNC_H */

1 /* auxfunc.c

2 * implementacion de las funciones auxiliares

3 *4 * (c) Diego F. Asanza 2006

5 */

67 #include <s td i o . h>8 #include <highgu i . h>9 #include "auxfunc . h"

10 #include " imgproc . h"11 #include "vlpdgeom . h"1213 /* Funcion findRectangles

14 * @args: Secuencia contornos, secuencia rectangulos, int verbose flag

15 * Analiza los elementos de una secuencia de contornos, los aproxima

16 * a poligonos, y devuelve aquellos que mas se aproximen a rectangulos

17 * con una relacion de ancho a alto de 2.

18 */

1920 void

21 f i ndRec tang l e s (CvSeq * contornos , CvSeq * r ec tangu lo s , int area_min ,22 int area_max , double cos_max , double rel_min , double rel_max ,23 int verbose , double dp_dist_min )24 {25 CvSeq * r e s u l t ;

Page 132: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 112

26 CvMemStorage * s to rage2 ;27 float s , r , t , p ;28 int i ;29 s to rage2 = cvCreateMemStorage ( 0 ) ;30 while ( contornos )31 {32 /*Se aproxima el contorno a un poligono */

33 if ( verbose )34 p r i n t f ( "Aproximando a po l i gono . . . \ n" ) ;35 r e s u l t = cvApproxPoly ( contornos , sizeof (CvContour ) ,36 s torage2 , CV_POLY_APPROX_DP,37 cvContourPerimeter ( contornos ) * dp_dist_min , 0 ) ;38 /* Los contornos de los rectangulos deben tener 4 vertices,

39 * tener un area adecuada, ni muy grande ni muy pequena y de

40 * ben ser convexos.

41 */

42 if ( verbose )43 p r i n t f ( "Revisando angulos y r e l a c i o n . . . \ n" ) ;44 if ( r e su l t−>to t a l == 4 &&45 f abs ( cvContourArea ( r e su l t , CV_WHOLE_SEQ) ) > area_min &&46 f abs ( cvContourArea ( r e su l t , CV_WHOLE_SEQ) ) < area_max &&47 cvCheckContourConvexity ( r e s u l t ) )48 {49 s = 0 ;50 r = 0 ;51 for ( i = 0 ; i < 5 ; i++)52 {53 // encuentra el angulo entre lados adyacentes

54 //encuentra la proporcion entre lados adyacentes

55 if ( i >= 2)56 {57 t = fabs ( ang le58 ( ( CvPoint *)59 cvGetSeqElem ( r e su l t , i ) ,60 ( CvPoint *)61 cvGetSeqElem ( r e su l t ,62 i − 2) ,63 ( CvPoint *) cvGetSeqElem ( r e su l t , i − 1 ) ) ) ;6465 p = fabs ( proporc ion66 ( ( CvPoint *)67 cvGetSeqElem ( r e su l t , i ) ,68 ( CvPoint *)69 cvGetSeqElem ( r e su l t ,70 i − 2) ,71 ( CvPoint *) cvGetSeqElem ( r e su l t , i − 1 ) ) ) ;7273 s = s > t ? s : t ;74 r = r > p ? r : p ;75 }76 }7778 /* Si los cosenos de los angulos son pequenos, y se

79 * cumple la relacion, entonces escribir los rectangulos

80 * en la secuencia.

81 */

8283 if ( s < cos_max && r > rel_min && r < rel_max )84 {85 for ( i = 0 ; i < 4 ; i++)86 {87 cvSeqPush ( rec tangu lo s ,88 ( CvPoint *) cvGetSeqElem ( r e su l t , i ) ) ;89 }90 }91 }92 contornos = contornos−>h_next ;93 }94 cvReleaseMemStorage (&sto rage2 ) ;95 }9697 /* imagen drawSquares

Page 133: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 113

98 * @args: Imagen img, Secuencia Rectangulos

99 * Dibuja los rectangulos definidos en la secuencia sobre la imagene

100 * img. Se usa para mostrar los rectangulos detectados sobre la imagen

101 * original.

102 */

103 IplImage *

104 drawSquares ( IplImage * img , CvSeq * squares )105 {106 CvSeqReader reader ;107 IplImage *cpy = cvCloneImage ( img ) ;108 int i ;109 CvPoint pt [ 4 ] ;110 // inicializa el lector de secuencias

111 cvStartReadSeq ( squares , &reader , 0 ) ;112113 // lee los cuatro elementos de la secuencia a un tiempo

114 for ( i = 0 ; i < squares−>to t a l ; i += 4)115 {116 CvPoint * r e c t = pt ;117 int count = 4 ;118119 // lee los cuatro vertices del rectangulo

120 memcpy ( pt , r eader . ptr , squares−>elem_size ) ;121 CV_NEXT_SEQ_ELEM ( squares−>elem_size , r eader ) ;122 memcpy ( pt + 1 , reader . ptr , squares−>elem_size ) ;123 CV_NEXT_SEQ_ELEM ( squares−>elem_size , r eader ) ;124 memcpy ( pt + 2 , reader . ptr , squares−>elem_size ) ;125 CV_NEXT_SEQ_ELEM ( squares−>elem_size , r eader ) ;126 memcpy ( pt + 3 , reader . ptr , squares−>elem_size ) ;127 CV_NEXT_SEQ_ELEM ( squares−>elem_size , r eader ) ;128129 // dibuja los rectangulos como una linea cerrada

130 cvPolyLine ( cpy , &rect , &count , 1 , 1 , CV_RGB (0 , 255 , 0 ) , 3 , 8 , 0 ) ;131 }132133 // retorna la imagen resultante

134 return cpy ;135 }136137 /* FindPlate

138 * @args: secuencia rectangulos, imagen imagen, int verb. flag,

139 * char nombre_archivo

140 * Encuentra las placas en la secuencia de rectangulos, las recorta de la imagen

141 * y las almacena en nombre_archivo.

142 */

143 void

144 f i ndP l a t e (CvSeq * r ec tangu lo s , IplImage * imagen , int width , int height ,145 double minsdev , double maxsdev , double minavg , double maxavg ,146 int pkmin , int pkmax , int pkup , int pkdown , double otsu_div ,147 int verbose , char *arch ivo_sa l ida )148 {149 if ( verbose )150 {151 p r i n t f ( "Entrando en l a etapa de s e l e c c i o n y f i l t r a d o \n" ) ;152 }153154 //puntos para los ajustes de perspectiva

155 CvPoint tpt [ 4 ] ;156 CvPoint2D32f s r c [ 4 ] ;157 CvPoint2D32f dst [ 4 ] ;158159 //ancho y alto del resultado

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

163 dst [ 0 ] = cvPoint2D32f (0 , he ight ) ;164 dst [ 1 ] = cvPoint2D32f (0 , 0 ) ;165 dst [ 2 ] = cvPoint2D32f ( width , he ight ) ;166 dst [ 3 ] = cvPoint2D32f ( width , 0 ) ;167168 //contadores varios.

169 int i , j , arcv = 0 ;

Page 134: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 114

170 CvMat *map_matrix ; //matriz para la transformacion perspectiva

171 IplImage * r e su l t ado ; //resultado

172 IplImage *temp ; //imagen temporal

173 IplImage * f i n a l , * r e s ;174 double th ; //umbral otsu

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

177 //los coeficientes de la transformacion de perspectiva

178 map_matrix = cvCreateMat (3 , 3 , CV_32FC1) ;179 //inicializo las imagenes

180 r e su l t ado = cvCreateImage ( cvGetSize ( imagen ) , 8 , 3 ) ;181 temp = cvCreateImage ( cvS i z e ( width , he ight ) , 8 , 3 ) ;182 f i n a l = cvCreateImage ( cvS i z e ( width , he ight ) , 8 , 1 ) ;183 r e s = cvCreateImage ( cvS i z e ( width , he ight ) , 8 , 1 ) ;184 //tomo los rectangulos de uno en uno.

185 r e c t = rec tangu lo s−>to t a l / 4 ;186 for ( j = 0 ; j < r e c t ; j++)187 {188 if ( verbose )189 p r i n t f ( "\n\n**** Analizando e l r e c tangu lo %d ********\n" , j ) ;190 pop_element ( rec tangu lo s , tpt ) ; //al retirar un rectangulo de la pila

191 //rectangulos−>total varia.

192 //ordena los vertices de tpt1 en src

193 ordenar_ver t i c e s ( tpt , s r c ) ;194 if ( verbose )195 {196 p r i n t f ( "Puntos para l a t rans fo rmac ion : \n" ) ;197 for ( i = 0 ; i < 4 ; i++)198 {199 p r i n t f ( " s r c[%d ] = (%.3 f , %.3 f ) => dst[%d ] = (%.3 f , %.3 f )\n" , i ,200 s r c [ i ] . x , s r c [ i ] . y , i , dst [ i ] . x , dst [ i ] . y ) ;201202 }203 }204 //calculo de la matriz para la transformacion de perspectiva.

205 if ( verbose )206 p r i n t f ( "Calculando matr iz para l a t rans fo rmac ion . . . \n" ) ;207 cvWarpPerspectiveQMatrix ( src , dst , map_matrix ) ;208 //Aplica la transformacion de perspectiva

209 if ( verbose )210 p r i n t f ( "Transformando imagen . . . \n" ) ;211 cvWarpPerspective ( imagen , r e su l tado , map_matrix ,212 CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS,213 cvSca l a rA l l ( 0 ) ) ;214 if ( verbose )215 {216 cvNamedWindow ( " trans form " , 1 ) ;217 cvShowImage ( " trans form " , r e su l t ado ) ;218 cvWaitKey ( 0 ) ;219 cvDestroyWindow ( " trans form " ) ;220 }221 //Selecciona el roi en la imagen. Este es el rectangulo dentro

222 //de la imagen que contiene la placa de identificacion.

223 if ( verbose )224 p r i n t f ( "Recortando Imagen . . . \n" ) ;225 cvSetImageROI ( re su l tado , cvRect (0 , 0 , width , he ight ) ) ;226 //copia el rectangulo que contiene la placa a una

227 //nueva imagen

228 cvCopy ( re su l tado , temp , 0 ) ;229 cvResetImageROI ( r e su l t ado ) ;230 //La nueva imagen esta en color, las siguientes lineas la transforman

231 //a una imagen en escala de gris.

232 cvCvtColor ( temp , f i n a l , CV_RGB2GRAY) ;233 cvCopy ( f i n a l , res , 0 ) ;234 if ( verbose )235 {236 cvNamedWindow ( " Candidato " , 1 ) ;237 cvShowImage ( " Candidato " , f i n a l ) ;238 cvWaitKey ( 0 ) ;239 cvDestroyWindow ( " Candidato " ) ;240 }241 //ecualiza la imagen recortada

Page 135: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 115

242 cvEqua l i z eH i s t ( f i n a l , f i n a l ) ;243 num =244 ana l i s i s_proye c c i on ( f i n a l , minsdev , maxsdev , minavg , maxavg , pkmin ,245 pkmax , pkup , pkdown , verbose ) ;246 if ( verbose )247 p r i n t f ( " Ana l i s i s de proy v e r t i c a l = %d \n" , num) ;248 if (num == 12)249 {250 //binarizacion usando otsu

251 th = cvOtsu ( f i n a l , verbose ) ;252 if ( verbose )253 p r i n t f ( "Umbral optimo a ap l i c a r = %f \n" , th / otsu_div ) ;254 cvThreshold ( f i n a l , f i n a l , th / otsu_div , 255 , CV_THRESH_BINARY) ;255 //realiza el filtrado de la imagen antes de guardarla

256 if ( verbose )257 p r i n t f ( " F i l t rando imagen \n" ) ;258 ocrprepare ( f i n a l , verbose ) ;259 if ( verbose )260 {261 cvNamedWindow ( " f i n a l " , 1 ) ;262 cvShowImage ( " f i n a l " , f i n a l ) ;263 cvWaitKey ( 0 ) ;264 cvDestroyWindow ( " f i n a l " ) ;265 }266 push_element_end ( rec tangu lo s , tpt ) ;267 char *out ;268 out = make_message ( arch ivo_sa l ida , arcv ) ;269 if ( verbose )270 p r i n t f ( "Guardando imagen %s\n" , out ) ;271 cvSaveImage ( out , f i n a l ) ;272 arcv++;273274 }275 }276 //libera memoria temporal

277 cvReleaseImage (& re su l t ado ) ;278 cvReleaseImage (&temp ) ;279 cvReleaseImage (& f i n a l ) ;280 }281282 /**\brief Filtra la imagen obtenida para el OCR

283 *284 * @param imagen Es la imagen a filtrar

285 * @param verbose Si es diferente de cero, muestra la salida de depuracion

286 */

287 void

288 ocrprepare ( IplImage * imagen , int verbose )289 {290 IplImage * r e s1 ;291 r e s1 = cvCreateImage ( cvGetSize ( imagen ) , 8 , 1 ) ;292 if ( verbose )293 {294 cvNamedWindow ( " f i n a l " , 1 ) ;295 cvShowImage ( " f i n a l " , imagen ) ;296 cvWaitKey ( 0 ) ;297 cvDestroyWindow ( " f i n a l " ) ;298 }299 cvDi l a t e ( imagen , res1 , NULL, 1 ) ;300 if ( verbose )301 {302 cvNamedWindow ( " d i l a t e " , 1 ) ;303 cvShowImage ( " d i l a t e " , r e s 1 ) ;304 cvWaitKey ( 0 ) ;305 cvDestroyWindow ( " d i l a t e " ) ;306 }307 cvErode ( res1 , imagen , NULL, 1 ) ;308 if ( verbose )309 {310 cvNamedWindow ( " erode " , 1 ) ;311 cvShowImage ( " erode " , imagen ) ;312 cvWaitKey ( 0 ) ;313 cvDestroyWindow ( " erode " ) ;

Page 136: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 116

314 }315 cvReleaseImage (&re s1 ) ;316 }

A.3.3. PROCESAMIENTO DE IMAGEN

1 /***************************************************************************2 * imgproc.h

3 *4 * Sun Aug 27 15:17:58 2006

5 * Copyright 2006 Diego F. Asanza

6 * [email protected]

7 ****************************************************************************/

89 /*

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

11 * it under the terms of the GNU General Public License as published by

12 * the Free Software Foundation; either version 2 of the License, or

13 * (at your option) any later version.

14 *15 * This program is distributed in the hope that it will be useful,

16 * but WITHOUT ANY WARRANTY; without even the implied warranty of

17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

18 * GNU General Public License for more details.

19 *20 * You should have received a copy of the GNU General Public License

21 * along with this program; if not, write to the Free Software

22 * Foundation, Inc., 59 Temple Place − Suite 330, Boston, MA 02111−1307, USA.

23 */

2425 #ifndef _IMGPROC_H26 #define _IMGPROC_H2728 #ifdef __cplusplus29 extern "C"30 {31 #endif

3233 #include <cv . h>34 #include <cxcore . h>35 /** \brief Ecualiza la imagen.

36 *37 * Este algoritmo ecualizacion es una adaptacion de un algoritmo

38 * implementado en OpenCV 0.98.

39 * @param src Imagen a ecualizar

40 * @param dst Imagen donde almacenar el resultado

41 */

42 void cvEqua l i z eH i s t ( IplImage * src , Ipl Image * dst ) ;4344 /** \brief Encuentra el umbral optimo usando el metodo de otsu

45 *46 * Usa el metodo de otsu para encontrar el nivel optimo de umbral. Devuelve

47 * un entero que representa el nivel de umbral calculado usando el metodo de

48 * otsu. Puede estar entre 0 y 255.

49 *50 * @param imagen Imagen de la cual calcular el nivel optimo de umbral

51 * @param verbose si es diferente de cero muestra la informacion de depuracion

52 */

53 int cvOtsu ( IplImage * imagen , int verbose ) ;5455 /** \brief Calcula la proyeccion vertical de la imagen

56 *57 * @param img imagen de la cual calcular la proyeccion horizontal

58 * @param proy matriz en la que se almacenara la proyeccion. Debe tener una

59 * fila, y el mismo numero de columnas de la imagen. Ademas debe ser del tipo

60 * CV32SC1, (ver documentacion de CvMat en OpenCV).

61 * @param verbose si es diferente de cero publica informacion de depuracion

62 */

63 void cvVertProy ( IplImage * img , CvMat * proy , int verbose ) ;

Page 137: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 117

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

66 *67 * Construye una cadena de caracteres combinando los valores pasados como

68 * parametros. Por ejemplo, si name="muestra1" y value=2, el valor devuelto

69 * por la funcion sera "muestra1−2.png". Se usa para construir nombres de

70 * archivo que difieran en el ultimo numero. Es util para guardar diferentes

71 * imagenes bajo el mismo prefijo comun, en caso de haberse encontrado mas de

72 * una placa en la imagen.

73 *74 * @param name Cadena de caracteres

75 * @param value Un entero

76 */

77 char *make_message (char *name , int value ) ;7879 #ifdef __cplusplus80 }81 #endif

8283 #endif /* _IMGPROC_H */

1 /***************************************************************************2 * imgproc.c

3 * Funciones para el procesamiento de imagenes

4 * Sun Aug 27 13:09:15 2006

5 * Copyright (c)2006 Diego F. Asanza, Escuela Politécnica Nacional.

6 * [email protected]

7 ****************************************************************************/

89 /*

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

11 * it under the terms of the GNU General Public License as published by

12 * the Free Software Foundation; either version 2 of the License, or

13 * (at your option) any later version.

14 *15 * This program is distributed in the hope that it will be useful,

16 * but WITHOUT ANY WARRANTY; without even the implied warranty of

17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

18 * GNU General Public License for more details.

19 *20 * You should have received a copy of the GNU General Public License

21 * along with this program; if not, write to the Free Software

22 * Foundation, Inc., 59 Temple Place − Suite 330, Boston, MA 02111−1307, USA.

23 */

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

262728 /* Ecualiza la imagen.

29 * @args: imagen src fuente, imagen dst destino

30 * retorna −1 si la imagen no es del tipo CV_8C1

31 *32 * El codigo de esta funcion fue adaptado de una

33 * implementacion aparecida en OpenCV 0.9.6.

34 */

35 #include " imgproc . h"36 #include <s td i o . h>37 void

38 cvEqua l i z eH i s t ( IplImage * src , Ipl Image * dst )39 {4041 //Declaracion de variables

42 CvHistogram * h i s t = 0 ;43 CvMat * l u t = 0 ;44 int i , h i s t_sz = 256 ;45 CvSize img_sz ;46 float s c a l e ;47 float *h ;48 int sum = 0 ;49 int type ;5051 //Esta funcion unicamente trabaja con imagenes del tipo CV_8UC1

Page 138: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 118

52 type = cvGetElemType ( s r c ) ;53 if ( type != CV_8UC1)54 {55 p r i n t f ( "CvEqualize , t i po no reconoc ido " ) ;56 e x i t (−1);57 }5859 //Inicializa el histograma y la LUT

60 h i s t = cvCreateHist (1 , &hist_sz , CV_HIST_ARRAY, NULL, 0 ) ;61 l u t = cvCreateMat (1 , 256 , CV_8UC1) ;6263 //calculo del histograma

64 cvCalcHist (&src , h i s t , 0 , NULL) ;65 img_sz = cvGetSize ( s r c ) ;6667 //escala: 255/totaldepixeles

68 s c a l e = 255 . f / ( img_sz . width * img_sz . he ight ) ;69 h = (float *) cvPtr1D ( h i s t−>bins , 0 , 0 ) ;7071 //Calcula la probabilidad acumulada y llena la LUT

72 for ( i = 0 ; i < his t_sz ; i++)73 {74 sum += cvRound (h [ i ] ) ;75 lut−>data . ptr [ i ] = ( uchar ) cvRound (sum * s c a l e ) ;76 }7778 lut−>data . ptr [ 0 ] = 0 ;79 //aplica la LUT (hace la ecualizacion)

80 cvLUT ( src , dst , l u t ) ;81 }82838485 /**\briefCalcula el umbral usando el metodo de otsu

86 * @aparam imagen, variable de depuracion.

87 * imagen es un puntero a la imagen de la

88 * que se calculara el umbral optimo. Verbose

89 * controla la salida de depuracion.

90 * devuelve el valor del umbral calculado para esa

91 * imagen.

92 */

9394 int

95 cvOtsu ( IplImage * imagen , int verbose )96 {97 if ( verbose )98 p r i n t f ( " In i c i ando l a de t e c c i on optima de umbral\n" ) ;99 //Declaracion de variables

100 CvHistogram * h i s t = 0 ;101 int i , h i s t_sz = 256 ;102 float *h ;103 int sum = 0 , th = 0 ;104 double mom = 0 ;105 int type ;106 double fmax = −1, csum = 0 .0 , m1, m2, sb ;107 int n1 = 0 , n2 = 0 ;108109 //Esta funcion unicamente trabaja con imagenes del tipo CV_8UC1

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

111 type = cvGetElemType ( imagen ) ;112 if ( type != CV_8UC1)113 {114 p r i n t f ( "cvOtsu , t i po no reconoc ido " ) ;115 e x i t (−1);116 }117118 //Inicializa el histograma

119 h i s t = cvCreateHist (1 , &hist_sz , CV_HIST_ARRAY, NULL, 0 ) ;120121 //calculo del histograma

122 cvCalcHist (&imagen , h i s t , 0 , NULL) ;123

Page 139: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 119

124 h = (float *) cvPtr1D ( h i s t−>bins , 0 , 0 ) ;125126 //calcula la masa y el momento de masa

127 for ( i = 0 ; i < his t_sz ; i++)128 {129 sum += cvRound (h [ i ] ) ;130 mom += (double ) i *(double ) cvRound (h [ i ] ) ;131 }132133 /* Aplica el metodo de global de Otsu para calcular el umbral optimo.

134 * Este codigo fue implementado por Ryan Dibble <[email protected]>

135 * para el programa GOCR.

136 * El metodo compara el histograma en escala de gris con el diagrama de

137 * densidad de masa. Es como dividir un cuerpo (el histograma) en dos

138 * partes, de tal manera que los centros de masa de cada parte tengan la

139 * mayor distancia entre ellos.

140 */

141 for ( i = 0 ; i < his t_sz ; i++)142 {143 n1 += cvRound (h [ i ] ) ;144 if ( ! n1 )145 {146 continue ;147 }148 n2 = sum − n1 ;149 if ( n2 == 0)150 {151 break ;152 }153 csum += (double ) i *cvRound (h [ i ] ) ;154 m1 = csum / n1 ;155 m2 = (mom − csum) / n2 ;156 sb = (double ) n1 *(double ) n2 *(m1 − m2) * (m1 − m2) ;157158 if ( sb > fmax )159 {160 fmax = sb ;161 th = i ;162 }163164 }165 if ( verbose )166 p r i n t f ( "Umbral optimo otsu = %d\n" , th ) ;167 return th ;168 }169170 /* calcula la proyeccion vertical de la Imagen.

171 *172 * @args: imagen, int *proy,int verbose

173 * imagen es la imagen que contiene unicamente la placa del

174 * vehiculo. (es una imagen en escala de grises)

175 * CvMat pv es el vector que contendra la proyeccion vertical

176 * debe ser del tipo CV32SC1 y tener el ancho de la imagen.

177 */

178179 void

180 cvVertProy ( IplImage * img ,CvMat *pv , int verbose )181 {182 CvMat *tp ,* opt ;183 int i ;184 tp=cvCreateMat (1 , img−>width ,CV_32SC1 ) ;185 opt=cvCreateMat (1 , img−>width ,CV_8SC1) ;186187 //obtiene la primera fila de la imagen y la guarda en opt

188 cvGetRow( img , opt , 0 ) ;189 //convierte los datos de 8 bits en opt a 32 bits en pv. Esto es

190 //necesario por que la suma exede los 8 bits.

191 cvConvertScale ( opt , pv , 1 , 0 ) ;192 //toma las siguientes filas y las suma.

193 for ( i =1; i<img−>he ight ; i++)194 {195 cvGetRow( img , opt , i ) ;

Page 140: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 120

196 cvConvertScale ( opt , tp , 1 , 0 ) ;197 cvAdd( tp , pv , pv , 0 ) ;198 }199 cvReleaseMat(&tp ) ;200 cvReleaseMat(&opt ) ;201 }202203 char *

204 make_message (char *name , int value )205 {206 /* A lo mucho se usan 100 caracteres de espacio */

207 int s i z e = 100 ;208 char * bu f f e r = (char *) mal loc ( s i z e ) ;209 int nchars ;210 if ( bu f f e r == NULL)211 return NULL;212213 /* Se intenta imprimir al espacio determinado */

214 nchars = snp r i n t f ( bu f f e r , s i z e , " %s−%d . png" ,215 name , va lue ) ;216 if ( nchars != s i z e )217 {218 /* Se reacomoda el buffer, pues ya se sabe el espacio necesario*/

219 bu f f e r = (char *) r e a l l o c ( bu f f e r , nchars + 1 ) ;220221 if ( bu f f e r != NULL)222 s np r i n t f ( bu f f e r , s i z e , " %s−%d . png" ,223 name , va lue ) ;224 }225 return bu f f e r ;226 }

A.3.4. FUNCIONES AUXILIARES

1 /***************************************************************************2 * vlpdgeom.h

3 *4 * Sun Aug 27 15:12:28 2006

5 * Copyright 2006 Diego F. Asanza

6 * [email protected]

7 ****************************************************************************/

89 /*

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

11 * it under the terms of the GNU General Public License as published by

12 * the Free Software Foundation; either version 2 of the License, or

13 * (at your option) any later version.

14 *15 * This program is distributed in the hope that it will be useful,

16 * but WITHOUT ANY WARRANTY; without even the implied warranty of

17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

18 * GNU General Public License for more details.

19 *20 * You should have received a copy of the GNU General Public License

21 * along with this program; if not, write to the Free Software

22 * Foundation, Inc., 59 Temple Place − Suite 330, Boston, MA 02111−1307, USA.

23 */

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

2627 #ifndef _VLPDGEOM_H28 #define _VLPDGEOM_H2930 #ifdef __cplusplus31 extern "C"32 {33 #endif

3435 #include <cxcore . h>

Page 141: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 121

36 #include <cv . h>3738 //Definicion de constantes

39 /** \brief El minimo valor de la desviacion estandard de la proyeccion vertical

40 * que deben cumplir los candidatos a placa.

41 *42 * Para que un rectangulo sea considerado placa, la desviacion standard de la

43 * Proyeccion vertical de este rectangulo debe estar comprendida entre los

44 * limites marcados por los valores STD_DEV_MIN_VAL y STD_DEV_MAX_VAL.

45 */

46 #define STD_DEV_MIN_VAL 0.124748 /** \brief El maximo valor de la desviacion estandard de la proyeccion vertical

49 * que deben cumplir los candidatos a placa

50 */

51 #define STD_DEV_MAX_VAL 0.225253 /** \brief El maximo valor del promedio de la proyeccion vertical que deben

54 * cumplir los candidatos a placa.

55 *56 * Para que un rectangulo sea considerado placa, la media aritmetica de la

57 * Proyeccion vertical de este rectangulo debe estar comprendida entre los

58 * limites marcados por los valores AVG_MAX_VAL y AVG_MIN_VAL.

59 */

60 #define AVG_MAX_VAL 0 .86162 /** \brief El minimo valor del promedio de la proyeccion vertical que deben

63 * cumplir los candidatos a placa.

64 */

65 #define AVG_MIN_VAL 0 .56667 /** \brief El maximo valor de la separacion entre picos de

68 * la proyeccion vertical que deben cumplir los candidatos a placa.

69 */

70 #define PK_MAX_SEP 307172 /** \brief El minimo valor de la separacion entre picos de

73 * la proyeccion vertical que deben cumplir los candidatos a placa.

74 */

75 #define PK_MIN_SEP 57677 /** \brief El maximo numero de picos en la proyeccion vertical que deben

78 * tener los candidatos a placa.

79 */

80 #define PK_MAX_UP 48182 /** \brief El maximo numero de valles en la proyeccion vertical que deben

83 * tener los candidatos a placa.

84 */

85 #define PK_MAX_DOWN 48687 /** \brief La maxima area que deben compartir dos rectangulos antes de ser

88 * considerados el ser el mismo.

89 */

90 #define MAX_AREA_COMUN 1.39192 /** \brief Esta funcion encuentra la distancia entre dos puntos.

93 *94 * Devuelve el

95 * valor de la distancia entre dos puntos usando la formula:

96 * \f$ d=\sqrt{(x_0−x_1)^2+(y_0−y_1)^2}\f$, donde \f$(x_0,y_0)\f$

97 * y \f$(x_1,y_1)\f$ son las coordenadas de p0 y p1 respectivamente.

98 *99 * @param p0,p1 los puntos.

100 */

101 float d i s t anc e ( CvPoint * p0 , CvPoint * p1 ) ;102103 /** \brief Encuentra si dos rectangulos se intersecan.

104 *105 * Esta funcion toma como argumentos las coordenadas de los vertices de dos

106 * rectangulos pt0[] y pt1[]. Si estos comparten un area mayor a

107 * \f$(1−ca)\times100\f$ la funcion devuelve 1. Si el area compartida es menor

Page 142: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 122

108 * devuelve \f$0\f$.

109 *110 * @param pt0[],pt1[] vectores que contienen las coordenadas de los vertices

111 * de los rectangulos a comparar.

112 * @param ca Corresponde a 1+(maxima area compartida)

113 */

114 int compare_elements ( CvPoint pt0 [ ] , CvPoint pt1 [ ] , double ca ) ;115116 /** \brief Toma los elementos de la parte de arriba de la pila

117 *118 * @param squares La pila de rectangulos

119 * @param pt[] vector donde colocar los vertices del rectangulo de arriba

120 * de la pila

121 */

122 void pop_element (CvSeq * squares , CvPoint pt [ ] ) ;123124 /** \brief Coloca los elementos en la parte inferior de la pila

125 *126 * @param squares La pila de rectangulos

127 * @param pt[] vector que contiene los vertices del rectangulo que se

128 * colocara al final de la pila.

129 */

130 void push_element_end (CvSeq * squares , CvPoint pt [ ] ) ;131132 /** \brief Coloca los elementos en la parte superior de la pila

133 *134 * @param squares La pila de rectangulos

135 * @param pt[] vector que contiene los vertices del rectangulo que se

136 * colocara al principio de la pila.

137 */

138 void push_element (CvSeq * squares , CvPoint pt [ ] ) ;139140 /** \brief Esta funcion encuentra el angulo entre dos vectores

141 *142 * Devuelve el valor del coseno del angulo entre pt1<−−pt0−−>pt2.143 * Usa la ley del

144 * coseno.

145 *146 * @param pt0,p11,pt2 los puntos. pt0 es el punto central.

147 */

148 double ang le ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * pt0 ) ;149150 /** \brief Esta funcion encuentra la relacion entre dos vectores.

151 *152 * Devuelve el cociente de (pt1<−>pt0)/(pt2<−>pt0).153 *154 * @param pt0,pt1,pt2 los puntos.

155 */

156 double proporc ion ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * pt0 ) ;157158 /** \brief Esta funcion elimina los rectangulos duplicados de la pila.

159 *160 * Esta funcion toma una pila de rectangulos, y elimina los repetidos.

161 *162 * @param squares la pila que contiene los rectangulos.

163 * @param ca el maxima area comun que pueden compartir dos rectangulos antes

164 * antes de considerarse ser el mismo.

165 * @param verbose si es diferente de cero, imprime informacion de depuracion.

166 */

167 int dup l i cados (CvSeq * squares , double ca , int verbose ) ;168169 /** \brief Esta funcion ordena los vertices de tpt.

170 *171 * Devuelve los vertice de tpt ordenados en src. Ordena los vertices en src

172 * de tal

173 * forma que el primer elemento del arreglo sea el v’ertice

174 * ubicado en la esquina inferior izquierda del rect’angulo ($pt0$), el segundo

175 * elemento del arreglo

176 * debe ser el ubicado en la esquina superior izquierda ($pt1$), el tercer

177 * elemento debe ser el v’ertice ubicado en la esquina inferior derecha($pt2$), y

178 * el cuarto debe estar ubicado en la esquina superior derecha($pt3$).

179 *

Page 143: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 123

180 * @param tpt los vertices a ordenar.

181 * @param src sitio donde se colocan los vertices ordenados.

182 */

183 void ordenar_ver t i c e s ( CvPoint * tpt , CvPoint2D32f * s r c ) ;184185 /** \brief Realiza el analisis de la proyeccion vertical.

186 *187 * Esta funcion realiza el analisis de la proyeccion vertical de los

188 * candidatos a placa. Devuelve 12 en caso de aprobar el analisis.

189 * devuelve cero en caso contrario. Para aprobar el analisis la

190 * proyeccion vertical debe tener al menos (picos_up) picos y

191 * (picos_down) valles,

192 * la media aritmetica de la proyeccion debe estar entre minavg y maxavg

193 * y la desviacion estandard debe estar entre minsdev y max sdev. Los picos

194 * de la proyeccion deben estar separados una distancia comprendida entre

195 * dmin y dmax.

196 *197 * @param img La imagen a analizar

198 * @param minsdev,maxsdev Los limites de la desviacion estandard

199 * @param minavg,maxavg Los limites de la media aritmetica

200 * @param dmin,dmax Los limites de la separacion entre picos, y entre valles

201 * @param picos_up,picos_down El numero de picos y valles

202 * @param si es diferente de cero, muestra informacion de depuracion

203 */

204 int

205 ana l i s i s_proye c c i on ( IplImage * img , double minsdev , double maxsdev ,206 double minavg , double maxavg , int dmin , int dmax ,207 int picos_up , int picos_down , int verbose ) ;208209 /** \brief Esta funcion cuenta el numero de picos en la proyeccion vertical

210 * que son mayores a un determinado valor.

211 *212 * Esta funcion cuenta el numero de picos de la proyeccion vertical

213 * almacenada en scale, que son mayores a avg, y estan separados por

214 * una distancia minima dmin y maxima dmax. Devuelve el numero de picos

215 * sobre avg.

216 *217 * @param scale La proyeccion vertical

218 * @param avg El valor sobre el cual se cuentan los picos

219 * @param dmin,dmax La separacion entre picos.

220 */

221 int picos_sobre_avg (CvMat * s ca l e , double avg , float minsdv , int dmax , int dmin ) ;222223 /** \brief Esta funcion cuenta el numero de valles en la proyeccion vertical

224 * que son menores a un determinado valor.

225 *226 * Esta funcion cuenta el numero de valles de la proyeccion vertical

227 * almacenada en scale, que son menores a minsdv, y estan separados por

228 * una distancia minima dmin y maxima dmax. Devuelve el numero de picos

229 * bajo minsdv.

230 *231 * @param scale La proyeccion vertical

232 * @param avg El valor sobre el cual se cuentan los picos

233 * @param dmin,dmax La separacion entre picos.

234 */

235 int picos_bajo_minsdv (CvMat * s ca l e , float minsdv , float avg , int dmax , int dmin ) ;236237 #ifdef __cplusplus238 }239 #endif

240241 #endif /* _VLPDGEOM_H */

1 /***************************************************************************2 * vlpdgeom.c

3 *4 * Sun Aug 27 14:08:01 2006

5 * Copyright 2006 Diego F. Asanza

6 * [email protected]

7 ****************************************************************************/

89 /*

Page 144: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 124

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

11 * it under the terms of the GNU General Public License as published by

12 * the Free Software Foundation; either version 2 of the License, or

13 * (at your option) any later version.

14 *15 * This program is distributed in the hope that it will be useful,

16 * but WITHOUT ANY WARRANTY; without even the implied warranty of

17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

18 * GNU General Public License for more details.

19 *20 * You should have received a copy of the GNU General Public License

21 * along with this program; if not, write to the Free Software

22 * Foundation, Inc., 59 Temple Place − Suite 330, Boston, MA 02111−1307, USA.

23 */

2425 /* Implementacion de funciones de uso comun. */

262728 #include "vlpdgeom . h"29 #include " imgproc . h"30 #include <s td i o . h>3132 /* calcula la distancia en pixeles de un punto a otro */

33 float

34 d i s t anc e ( CvPoint * p0 , CvPoint * p1 )35 {36 float dx = p0−>x − p1−>x ;37 float dy = p0−>y − p1−>y ;38 return ( s q r t ( dx * dx + dy * dy ) ) ;39 }4041 /* compare_elements

42 * @args: Puntos[] pt0, puntos[] pt1

43 * compara los rectangulos definidos por pt0 y pt1.

44 * si se intersecan en mas del 30% del area, se consideran iguales y la

45 * funcion devuelve 1.

46 */

47 int

48 compare_elements ( CvPoint pt0 [ ] , CvPoint pt1 [ ] , double ca )49 {50 int dx , dy , lx1 , lx2 , ly1 , ly2 , lx , l y ;51 //obtiene lx y ly

52 //corregir esta parte de la implementacion

5354 /* comprueba si los dos rectanguloe se intersecan */

55 if ( abs ( pt0 [ 0 ] . x − pt1 [ 0 ] . x ) + abs ( pt0 [ 2 ] . x − pt1 [ 0 ] . x ) <56 ca * abs ( pt0 [ 0 ] . x − pt0 [ 2 ] . x )57 && abs ( pt0 [ 0 ] . y − pt1 [ 0 ] . y ) + abs ( pt0 [ 2 ] . y − pt1 [ 0 ] . y ) <58 ca * abs ( pt0 [ 0 ] . y − pt0 [ 2 ] . y ) )59 {60 return 1 ;61 }62 else

63 {64 return 0 ;65 }66 }676869 /* pop_elemet

70 * @args: Secuencia rectangulos, Puntos[] puntos

71 * Lee los elementos de la secuencia de cuatro en

72 * cuatro, y los almacena en un vector de puntos

73 */

74 void

75 pop_element (CvSeq * squares , CvPoint pt [ ] )76 {77 cvSeqPop ( squares , &pt [ 0 ] ) ;78 cvSeqPop ( squares , &pt [ 1 ] ) ;79 cvSeqPop ( squares , &pt [ 2 ] ) ;80 cvSeqPop ( squares , &pt [ 3 ] ) ;81 }

Page 145: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 125

8283 /* push_element_end

84 * @args: Secuencia rectangulos, Puntos[] puntos

85 * Guarda los cuatro elementos al final de la secuencia desde vector de puntos

86 */

87 void

88 push_element_end (CvSeq * squares , CvPoint pt [ ] )89 {90 cvSeqPushFront ( squares , &pt [ 0 ] ) ;91 cvSeqPushFront ( squares , &pt [ 1 ] ) ;92 cvSeqPushFront ( squares , &pt [ 2 ] ) ;93 cvSeqPushFront ( squares , &pt [ 3 ] ) ;94 }9596 /* push_element

97 * @args: Secuencia rectangulos, Puntos[] puntos

98 * guarda los cuatro elementos del vector puntos al inicio de la secuencia.

99 */

100 void

101 push_element (CvSeq * squares , CvPoint pt [ ] )102 {103 cvSeqPush ( squares , &pt [ 0 ] ) ;104 cvSeqPush ( squares , &pt [ 1 ] ) ;105 cvSeqPush ( squares , &pt [ 2 ] ) ;106 cvSeqPush ( squares , &pt [ 3 ] ) ;107 }108109 /*Funcion Angle

110 *111 * Angle, encuentra el coseno del angulo entre los vectores formados por los

112 * puntos pt1−pt0−pt2. (ley del coseno);

113 */

114115 double

116 ang le ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * pt0 )117 {118 double dx1 = pt1−>x − pt0−>x ;119 double dy1 = pt1−>y − pt0−>y ;120 double dx2 = pt2−>x − pt0−>x ;121 double dy2 = pt2−>y − pt0−>y ;122 return ( ( dx1 * dx2 +123 dy1 * dy2 ) / sq r t ( ( dx1 * dx1 + dy1 * dy1 ) * ( dx2 * dx2 +124 dy2 * dy2 ) ) ) ;125 }126127 /* Proporcion

128 * @args: punto pt1, punto pt2, punto pt0)

129 * Devuelve la relacion entre pt1<−>pt0/pt2<−>pt0130 */

131 double

132 proporc ion ( CvPoint * pt1 , CvPoint * pt2 , CvPoint * pt0 )133 {134 double dx1 = pt1−>x − pt0−>x ;135 double dy1 = pt1−>y − pt0−>y ;136 double dx2 = pt2−>x − pt0−>x ;137 double dy2 = pt2−>y − pt0−>y ;138 return ( s q r t ( ( dx1 * dx1 + dy1 * dy1 ) ) / sq r t ( ( dx2 * dx2 + dy2 * dy2 ) ) +139 1e−10);140 }141142 /* duplicados

143 * @args: Secuencia Rectangulos

144 * Borra los elementos repetidos en una secuencia de rectangulos.

145 * Los rectangulos se consideran que encierran la misma area si comparten mas

146 * del 50% de la misma. Devuelve cero si se ejecuto correctamente.

147 */

148 int

149 dup l i cados (CvSeq * squares , double ca , int verbose )150 {151 if ( verbose )152 p r i n t f ( " i n i c i ando l a e l im inac i on de dup l i cados \n" ) ;153 CvPoint pt0 [ 4 ] ;

Page 146: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 126

154 CvPoint pt1 [ 4 ] ;155 CvSeq *temp ;156 CvMemStorage * s t o rage ;157 int i , j ;158159 /* Si solo hay un posible candidato no es necesario discriminar rectangulos

160 * repetidos

161 */

162 if ( squares−>to t a l / 4 == 1)163 {164 return 0 ;165 }166167 //inicializa el almacen temporal de areas

168 s t o rage = cvCreateMemStorage ( 0 ) ;169 temp = cvCreateSeq (0 , sizeof (CvSeq ) , sizeof ( CvPoint ) , s t o rage ) ;170171 // lee los cuatro elementos de la secuencia a un tiempo

172 for ( i = 0 ; i < ( squares−>to t a l ) / 4 ; i++)173 {174 pop_element ( squares , pt0 ) ;175 for ( j = 0 ; j < ( squares−>to t a l ) / 4 ; j++)176 {177 pop_element ( squares , pt1 ) ;178 if ( ! compare_elements ( pt0 , pt1 , ca ) )179 {180 push_element_end ( squares , pt1 ) ;181 }182 else

183 {184 j−−;185 }186 }187 push_element_end ( squares , pt0 ) ;188 }189 cvReleaseMemStorage (&s to rage ) ;190 if ( verbose )191 p r i n t f ( " El iminac ion de dup l i cados terminada . \n" ) ;192 return 0 ;193 }194195196 /* Funcion ordenar vertices. Ordena los vertices en src de tal

197 * forma que el primer elemento del arreglo sea el v’ertice

198 * ubicado en la esquina inferior izquierda del rect’angulo ($pt0$), el segundo

199 * elemento del arreglo

200 * debe ser el ubicado en la esquina superior izquierda ($pt1$), el tercer

201 * elemento debe ser el v’ertice ubicado en la esquina inferior derecha($pt2$), y

202 * el cuarto debe estar ubicado en la esquina superior derecha($pt3$).

203 */

204205 void

206 ordenar_ver t i c e s ( CvPoint * tpt , CvPoint2D32f * s r c )207 {208 int i , k ;209 CvPoint tempt ;210 for ( i = 0 ; i < 3 ; i++)211 {212 for ( k = i + 1 ; k < 4 ; k++)213 {214 if ( tpt [ i ] . x > tpt [ k ] . x )215 {216 tempt = tpt [ i ] ;217 tpt [ i ] = tpt [ k ] ;218 tpt [ k ] = tempt ;219 }220 }221 }222223 if ( tpt [ 0 ] . y > tpt [ 1 ] . y )224 {225 s r c [ 0 ] = cvPointTo32f ( tpt [ 0 ] ) ;

Page 147: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 127

226 s r c [ 1 ] = cvPointTo32f ( tpt [ 1 ] ) ;227 }228 else

229 {230 s r c [ 0 ] = cvPointTo32f ( tpt [ 1 ] ) ;231 s r c [ 1 ] = cvPointTo32f ( tpt [ 0 ] ) ;232 }233234 if ( tpt [ 2 ] . y > tpt [ 3 ] . y )235 {236 s r c [ 2 ] = cvPointTo32f ( tpt [ 2 ] ) ;237 s r c [ 3 ] = cvPointTo32f ( tpt [ 3 ] ) ;238 }239 else

240 {241 s r c [ 2 ] = cvPointTo32f ( tpt [ 3 ] ) ;242 s r c [ 3 ] = cvPointTo32f ( tpt [ 2 ] ) ;243 }244 }245246 /* funcion analisis_proyeccion

247 * realiza el analisis de la proyeccion vertical

248 * calcula el numero de picos en la proyeccion que sobrepasan

249 * cierto nivel.

250 * Recibe como argumentos la imagen a analizar. Devuelve 12 a la salida si

251 * la proyeccion cumple con las caracteristicas de las placas. Devuelve 0

252 * si no cumple.

253 */

254 int

255 ana l i s i s_proye c c i on ( IplImage * img , double minsdev , double maxsdev ,256 double minavg , double maxavg , int dmin , int dmax ,257 int picos_up , int picos_down , int verbose )258 {259 int p i co s = 0 , r e su l t ado = 0 ;260 CvMat *proy ;261 CvMat * s c a l e ;262 IplImage *temp1 ;263 double min , max ;264 CvPoint Min , Max ;265 CvScalar avg , sdv ;266 double maxsdv ;267 int picos_min ;268 double minsdv ;269 double s c l ;270 temp1 = cvCreateImage ( cvGetSize ( img ) , 8 , 1 ) ;271 proy = cvCreateMat (1 , img−>width , CV_32SC1 ) ;272 s c a l e = cvCreateMat (1 , img−>width , CV_64FC1) ;273 //bordes horizontales

274 cvCopy ( img , temp1 , NULL) ;275 //proyeccion vertical

276 cvVertProy ( temp1 , proy , verbose ) ;277 //Analisis de la proyeccion.

278 //obtener maximo y minimo

279 cvMinMaxLoc ( proy , &min , &max , &Min , &Max, NULL) ;280 //La proyeccion normalizada se consigue multiplicando la

281 //matriz que contiene la proyeccion por 1/max

282 s c l = 1 / max ;283 cvConvertScale ( proy , s ca l e , s c l , 0 ) ;284 //estadisticas varias, consigue el promedio (avg) y

285 //la desviacion estandar(sdv)

286 cvAvgSdv ( s ca l e , &avg , &sdv , NULL) ;287 //calcula el numero de picos sobre avg+sdv. Estos picos deben estar separados

288 //al menos una distancia minima dmin y maxima dmax determinadas experimentalmente.

289 maxsdv = avg . va l [ 0 ] + sdv . va l [ 0 ] / 3 ;290 minsdv = avg . va l [ 0 ] − sdv . va l [ 0 ] / 3 ;291 p i co s = picos_sobre_avg ( s ca l e , maxsdv , minsdv , dmax , dmin ) ;292 //calcula el numero de picos bajo avg−sdv293 picos_min = picos_bajo_minsdv ( s ca l e , minsdv , maxsdv , dmax , dmin ) ;294 if ( verbose )295 {296 p r i n t f ( " p i c o s sobre avg+stddev=%d , p i c o s bajo avg−stddev=%d\n" , p icos ,297 picos_min ) ;

Page 148: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 128

298 p r i n t f ( " average=%f , s d ev i a t i on=%f \n" , avg . va l [ 0 ] , sdv . va l [ 0 ] ) ;299 }300 //caracteristicas de las placas

301 if ( sdv . va l [ 0 ] > minsdev && sdv . va l [ 0 ] < maxsdev && avg . va l [ 0 ] < maxavg302 && avg . va l [ 0 ] > minavg )303 if ( ( p i c o s >= picos_up && picos_min >= picos_down ) )304 {305 r e su l t ado = 12 ;306 if ( verbose )307 {308 p r i n t f ( "Creo haber encontrado una placa de veh i cu l o . . . ; ) \ n" ) ;309 }310 }311312 cvReleaseImage (&temp1 ) ;313 cvReleaseMat (&proy ) ;314 cvReleaseMat (& s c a l e ) ;315 return r e su l t ado ;316 }317318 /**\brief Cuenta el numero de valles bajo el limite inferior

319 *320 * cuenta el numero de picos bajo el limite_inferior, que tengan como

321 * predecesor a un pico sobre el limite superior, y que ademas esten

322 * separados una distancia entre dmin y dmax. No toma en consideracion

323 * la regularidad de los valles, es decir q no considera el ancho que

324 * tengan los picos sobre el limite_superior. Esto podria mejorarse.

325 *326 * \param scale es la proyeccion vertical

327 * \param minsdv es el limite_inferior

328 * \param avg es el limite_superior

329 * \param dmin es la distancia minima

330 * \param dmax es la distancia maxima

331 */

332 int

333 picos_bajo_minsdv (CvMat * s ca l e , float minsdv , float avg , int dmax , int dmin )334 {335 int p i co s = 0 , i ;336 int p i c o an t e r i o r = 0 ;337 int e sp i c o = 1 ;338 for ( i = 1 ; i < sca l e−>co l s − 1 ; i++)339 {340 if ( cvGetReal1D ( s ca l e , i − 1) >= cvGetReal1D ( s ca l e , i )341 && cvGetReal1D ( s ca l e , i ) <= cvGetReal1D ( s ca l e , i + 1) )342 {343 //minimomolocal, compara con el pico anterior. por comodidad se asume el

344 //primer pico en cero

345 if ( e sp i c o ){346 if ( ( i − p i c o an t e r i o r ) > dmin && ( i − p i c o an t e r i o r ) < dmax&& cvGetReal1D ( s ca l e , i ) < minsdv )347 {348 p i co s++;349 p i c o an t e r i o r = i ;350 e sp i c o =0;351 }352 else

353 {354 if ( cvGetReal1D ( s ca l e , i ) < minsdv )355 {356 p i c o an t e r i o r = i ;357 }358 }359 }360 }361 if ( cvGetReal1D ( s ca l e , i − 1) <= cvGetReal1D ( s ca l e , i )362 && cvGetReal1D ( s ca l e , i ) >= cvGetReal1D ( s ca l e , i + 1)&& cvGetReal1D ( s ca l e , i ) > avg )363 {364 e sp i c o = 1 ;365 }366 }367 return p i co s ;368 }369

Page 149: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 129

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

371 *372 * cuenta el numero de picos bajo el limite_superior, que tengan como

373 * predecesor a un pico bajo el limite_inferior, y que ademas esten

374 * separados una distancia entre dmin y dmax. No toma en consideracion

375 * la regularidad de los picos, es decir q no considera el ancho que

376 * tengan los valles bajo el limite_inferior. Esto podria mejorarse.

377 *378 * \param scale es la proyeccion vertical

379 * \param minsdv es el limite_inferior

380 * \param avg es el limite_superior

381 * \param dmin es la distancia minima

382 * \param dmax es la distancia maxima

383 */

384385 int

386 picos_sobre_avg (CvMat * s ca l e , double avg , float minsdv , int dmax , int dmin )387 {388 int p i co s = 0 , i ;389 int e s v a l l e = 1 ;390 int p i c o an t e r i o r = 0 ;391 for ( i = 1 ; i < sca l e−>co l s − 1 ; i++)392 {393 if ( cvGetReal1D ( s ca l e , i − 1) <= cvGetReal1D ( s ca l e , i )394 && cvGetReal1D ( s ca l e , i ) >= cvGetReal1D ( s ca l e , i + 1) )395 {396 //maximolocal, compara con el pico anterior. por comodidad se asume el

397 //primer pico en cero

398 if ( e s v a l l e )399 {400 if ( ( i − p i c o an t e r i o r ) > dmin && ( i − p i c o an t e r i o r ) < dmax401 && cvGetReal1D ( s ca l e , i ) > avg )402 {403 p i co s++;404 p i c o an t e r i o r = i ;405 e s v a l l e =0;406 }407 else

408 {409 if ( cvGetReal1D ( s ca l e , i ) > avg )410 {411 p i c o an t e r i o r = i ;412 }413 }414 }415 }416 if ( cvGetReal1D ( s ca l e , i − 1) >= cvGetReal1D ( s ca l e , i )417 && cvGetReal1D ( s ca l e , i ) <= cvGetReal1D ( s ca l e , i + 1)&& cvGetReal1D ( s ca l e , i ) < minsdv )418 {419 e s v a l l e = 1 ;420 }421 }422 return p i co s ;423 }

A.4. INTEGRACION OCR

1 # ! / bin /bash23 #Archivo v lp r4 #Este s c r i p t ana l i z a l a s imagenes en formato JPG5 #ubicadas en e l d i r e c t o r i o usado como argumento .6 #El r e su l t ado de l a n a l i s i s e s guardado en una pagina7 #web en ese d i r e c t o r i o . S i se d ispone de l navegador8 #Mozi l la , e l r e su l t ado se abre en e se navegador .9 #

10 #Uso : v lp r [ D i r e c t o r i o ]1112 IMAGESDIR=$1

Page 150: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 130

13 BINDIR=/home/ diego / proceso / s c r i p t s #d i r e c t o r i o q cont i ene l o s s c r i p t s de14 #vlpd15 ACTUALDIR=$PWD1617 if [ [ $# != 1 ] ] ; then18 echo19 echo v lp r : I n t e g r a c i on ent r e vlpd y e l ocr20 echo21 echo Uso : v lp r d i r e c t o r i o de prueba22 echo23 e x i t 124 f i2526 # se e j e cu ta t e s t e r sobre e l d i r e c t o r i o de imagenes , se guarda en . l og27 $BINDIR/ t e s t e r $IMAGESDIR | t e e $IMAGESDIR/ . l og2829 # se procesa . l og con parse1 e s e es e l r e su l t ado30 cat $IMAGESDIR/ . l og | t r −d " " | t r −d " ( " | t r −d " ) " | t r \31 −d "?" | $BINDIR/parse1 > $IMAGESDIR/ r e su l t ado s . html3233 #abre e l browser con e l r e su l t ado34 moz i l l a f i l e : ///$IMAGESDIR/resultados.html &

3536 cd $ACTUALDIR37 e x i t 0

1 # ! / bin /bash2 #

3 #Archivo t r a i n i n g4 #Este s c r i p t de bash se encarga de r e a l i z a r l a i n t e g r a c i o n entr e e l5 #programa vlpd y e l reconocedor opt i co de c a r a c t e r e s .6 #

7 #Anal iza l a s f o t o g r a f i a s en formato jpg ubicadas en e l d i r e c t o r i o8 #pasado como argumento . Muestra en pan ta l l a l o s c a r a c t e r e s no9 # r e conoc ido s por e l OCR y espera entrada de l u suar i o . Usado para

10 # ent renar e l OCR.11 #

12 #Uso : t r a i n i n g [ d i r e c t o r i o ]13 #

1415 IMAGESDIR=$1 #El d i r e c t o r i o donde estan l a s f o t o g r a f i a s a ana l i z a r16 VLPD=vlpd #la ub i cac ion de l programa vlpd17 OCR=/usr / bin / gocr #Ubicacion de l OCR18 ACTUALDIR=$PWD19 DBDIR=~/vlpd/db #ub icac ion de l a base de datos de l OCR2021 if [ [ $# != 1 ] ] ; then22 echo23 echo t e s t e r : u t i l i d a d para i n t e g r a r vlpd y gocr24 echo25 echo Uso : t e s t e r d i r e c t o r i o de prueba26 echo27 e x i t 128 f i2930 #Si no e x i s t e l a base de datos l a c rea .3132 #echo Generando l i s t a de a r ch ivo s .3334 cd $IMAGESDIR3536 for f i l e in * . jpg #trabajamos solamente con a r ch ivo s terminados en jpg3738 do

39 if [ ! −e $ f i l e ] ; then40 echo No hay a r ch ivo s jpg en e l d i r e c t o r i o $IMAGESDIR41 e x i t 142 f i4344 echo45 echo $IMAGESDIR/ $ f i l e46 f i l e o u t=$IMAGESDIR/ ` echo $ f i l e | cut −d " . " −f1 `

Page 151: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 131

47 #echo $ f i l e o u t4849 if $VLPD $ f i l e $ f i l e o u t ; then50 l e t "SUCCESS += 1"51 else

52 l e t "NUMBERTOTAL +=1"53 continue

54 f i5556 #transforma l a s a l i d a de vlpd a pgm para e l OCR57 #asume una placa por f o t o g r a f i a58 convert $ f i l e o u t −0.png \59 $ f i l e o u t . pgm60 rm $ f i l e o u t −0.png61 #mv /home/ diego / p laca .pgm /home/ diego / proceso / r e s u l t ado s / $ f i l e . pgm6263 #Rea l i za e l r econoc imiento de l o s c a r a c t e r e s64 $OCR −p $DBDIR −f ASCII −m 130 −d 650 \65 −C "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789−" \66 $ f i l e o u t . pgm67 echo6869 l e t "NUMBERTOTAL += 1"70 done71 echo Exitos=$SUCCESS, Fo tog r a f i a s eva luadas=$NUMBERTOTAL72 cd $ACTUALDIR73 e x i t 0

1 # ! / bin /bash2 #

3 #Archivo t e s t e r4 #Este s c r i p t de bash se encarga de r e a l i z a r l a i n t e g r a c i o n entr e e l5 #programa vlpd y e l reconocedor opt i co de c a r a c t e r e s . Es llamado6 #por e l s c r i p t v lp r7 #

89 IMAGESDIR=$1 #El d i r e c t o r i o donde estan l a s f o t o g r a f i a s a ana l i z a r

10 VLPD=vlpd #la ub i cac ion de l programa vlpd11 OCR=/usr / bin / gocr #Ubicacion de l OCR12 ACTUALDIR=$PWD1314 if [ [ $# != 1 ] ] ; then15 echo16 echo t e s t e r : u t i l i d a d para i n t e g r a r vlpd y gocr17 echo18 echo Uso : t e s t e r d i r e c t o r i o de prueba19 echo20 e x i t 121 f i2223 #echo Generando l i s t a de a r ch ivo s .2425 cd $IMAGESDIR2627 for f i l e in * . jpg #trabajamos solamente con a r ch ivo s terminados en jpg2829 do

30 if [ ! −e $ f i l e ] ; then31 echo No hay a r ch ivo s jpg en e l d i r e c t o r i o $IMAGESDIR32 e x i t 133 f i3435 echo36 echo $IMAGESDIR/ $ f i l e37 f i l e o u t=$IMAGESDIR/ ` echo $ f i l e | cut −d " . " −f1 `38 #echo $ f i l e o u t3940 if $VLPD $ f i l e $ f i l e o u t ; then41 l e t "SUCCESS += 1"42 else

43 l e t "NUMBERTOTAL +=1"44 continue

Page 152: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

APÉNDICE A. CÓDIGO FUENTE 132

45 f i4647 #transforma l a s a l i d a de vlpd a pgm para e l OCR48 #asume una placa por f o t o g r a f i a , so lamente toma49 #la imagen devue l ta por vlpd terminada en −0.png50 convert $ f i l e o u t −0.png \51 $ f i l e o u t . pgm52 rm $ f i l e o u t −0.png5354 #Rea l i za e l r econoc imiento de l o s c a r a c t e r e s55 $OCR −p /home/ diego / proceso /db/ −f ASCII −m 2 −d 450 \56 −C "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789−" \57 $ f i l e o u t . pgm58 echo5960 l e t "NUMBERTOTAL += 1"61 done62 echo Exitos=$SUCCESS, Fo tog r a f i a s eva luadas=$NUMBERTOTAL63 cd $ACTUALDIR64 e x i t 0

1 # ! / usr / bin /gawk −f23 #Archivo parse14 # es l lamado por e l s c r i p t v lp r5 #Este s c r i p t toma l o s r e s u l t ado s produc idos por v lp r6 #y l o s pre senta en forma de una pagina web78 BEGIN { FS = "\n" ;RS="\n\n" ;9 pr in t "<html> <head> <t i t l e > Resultados de VLPD</t i t e > </head><body>"

10 pr in t "<h1 a l i g n=centered> Resultado de l Reconocimiento </h1>"11 pr in t "<pre>"12 }1314 / jpg / { p r i n t " "15 if ( l ength ( $3 ) >6| | l ength ( $3)<6)16 pr in t "<a hr e f=\" f i l e : /// " $2 "\">" $2"</a>\t " "<b>ERROR_R</b> \ t " $317 else

18 pr in t "<a hr e f=\" f i l e : /// " $2 "\">" $2 "</a>\t " $319 } ;2021 /Exitos / { p r i n t }2223 END { pr in t "</pre>"24 pr in t "<p>" NR " r e g i s t r o s ana l i z ado s </p> "25 pr in t "</body></html>"26 }

Page 153: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ANEXO B

MANUAL DE USUARIO

133

Page 154: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Manual de UsuarioPrograma para la deteccion automatica

del numero placa en fotografıas de vehıculosvlpd version 0.1. Junio 03, 2006.

Diego F. Asanza.

Page 155: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Esta edicion del manual es para el programa vlpd (version 0.1, 03 Junio 2006), un programade analisis de imagen para detectar y recortar las placas de identificacion en fotografıas devehıculos.

Copyright c© 2006 Escuela Politecnica Nacional, Diego F. Asanza.Ladron de Guevara E11-102Quito-Ecuadorhttp://www.epn.edu.ec

Este manual de usuario es un documento libre; puede reproducirlo y/o mod-ificarlo bajo los terminos de la version 2 (o, a su eleccion, cualquier versionposterior) de la Licencia General Publica GNU tal como ha sido publicada porla Free Software Foundation.

Este manual se distribuye con la esperanza de que sea util, pero sin ningunagarantıa, ni siquiera la garantıa implıcita de comerciabilidad o adecuacion a unproposito particular.

Publicado por Diego F. Asanza.

Page 156: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

i

Indice General

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

2 Instalacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

3 Utilizacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3.1 Programa vlpd. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43.2 Programa training . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53.3 Programa vlpr. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

4 Limitaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

5 Licencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

Indice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Page 157: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 1: Requisitos 1

1 Requisitos

Antes de instalar vlpd se deben cumplir los siguientes requisitos:

1. Procesador Intel R© Pentium R© II, III, IV, Celeron R©, Centrino R© o compatibles.

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.

5. Librerıas OpenCV R© Version 0.9-6 Beta 4.

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 unade estas distribuciones de Linux. Para mas informacion respecto a como conseguir estasdistribuciones, puede dirigirse a las siguientes direcciones electronicas:

• Pagina Web del proyecto Debian: http://www.debian.org

• Pagina Web del proyecto Ubuntu: http://www.ubuntu.com

Page 158: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 2: Instalacion 2

2 Instalacion

Luego de conseguir las funtes de vlpd, y antes de proceder con su instalacion es nece-sario conseguir e instalar las librerıas OpenCV R©. La instalacion de OpenCV R© puedehacerse mediante las fuentes, que pueden descargarse de la pagina web del proyecto enhttp://opencv. sourceforge.net, o por medio de los binarios, disponibles como *.deb o*.rpm.

En Debian y Ubuntu, los binarios de OpenCV R© estan disponibles para aquellos quetienen una conexion a internet usando la herramienta apt en los repositorios oficiales. Eneste caso para instalar las librerıas 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 librerıas OpenCV aun estan en la etapa Beta de desarrollo,lo que significa que pueden haber diferencias entre versiones, por lo que se recomiendaencarecidamente se use la version 0.9-6 Beta4, la cual esta disponible con Ubuntu 6.06.

Luego de tener instaladas las librerıas OpenCV, se puede instalar vlpd. Para eso hayque seguir los siguientes pasos

1. Conseguir las fuentes de VLPD. Estas estan disponibles en el CD que acompana estemanual.

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 librerıas necesarias para compilar el pro-grama, y tambien verifica la version del compilador disponible. Si todo es correctoconstruye 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 lacarpeta de instalacion, se debe ejecutar lo siguiente en el paso 2, (por ejemplo, para instalaren /home/rats:

diego@netstar:~/vlpd$ ./configure --prefix=/home/rats

Para ver todas las opciones de compilacion e instalacion:

Page 159: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 2: Instalacion 3

diego@netstar:~/vlpd$ ./configure --help

Si se desea realizar reconocimiento de caracteres sobre las placas detectadas se debeinstalar 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 proporcionasu 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. Estosse 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 ensu path. Estos scripts necesitan que vlpd, gocr y convert esten instalados.

Page 160: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 3: Utilizacion 4

3 Utilizacion

Se deben colocar las fotografıas a procesar en una carpeta, por ejemplo ‘~/fotografias’.Estas fotografıas deben estar en formato jpg, y poseer una resolucion de 640x480 pixeles.

Luego ejecutar vlpr ~/fotografias. Se puede tardar algunos minutos en procesartodas las fotografıas. 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 fotografıa, y el resultado del reconocimiento. Encaso 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 sintaxisde cada uno de ellos:

3.1 Programa vlpd

Sintaxis: vlpd [opciones] archivo_entrada archivo_salida: Es el programa principal.Archivo entrada es la fotografıa en formato jpg, de la parte frontal o posterior de unvehıculo. Archivo salida es el prefijo con el que se guardaran los archivos que contienenlas placas (en caso de haber mas de una)detectadas y recortadas por vlpd de la fotografıapasada como archivo entrada.

Archivo salida es solo el prefijo, y tiene formato png. Los archivos de salida son guarda-dos siempre como prefijo-x.png donde x corresponde a un numero que empieza en cero yaumenta conforme aumenta el numero 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 paradeterminar el nivel optimo. El valor especificado con este parametro es un divisor paraeste umbral optimo. Permite disminuir el umbral de tal forma que solo las zonas masobscuras de la imagen sobresalgan. Puede ser un numero cualquiera mayor que cero.El valor por defecto es 1,6.

• ‘-c max_cos’. Es un n’umero entre 0 y 1, especifica el valor maximo del coseno quepuede tener el angulo entre dos lados adyacentes de un rectangulo encontrado en laimagen, para ser considerado candidato a placa. El valor por defecto es 0,3.

• ‘-r min_rel’. Es un numero mayor que cero y menor que max rel. Representa larelacion mınima entre el lado mas amplio y el mas angosto de los rectangulos detectadospara ser considerado candidato a placa. El valor por defecto es 1,3.

• ‘-R max_rel’, Es un numero mayor que min rel. Representa el maximo valor de larelacion 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 pıxeles de la imagen resul-tado. El valor por defecto es 100.

• ‘-h height’, Es un numero entero que representa el alto en ı de la imagen resultado.El valor por defecto es 50.

• ‘-a min_area’, El area mınima que debe poseer un rectangulo encontrado para serconsiderado placa de identificacion. Es un numero entero.El valor por defecto es 450.

Page 161: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 3: Utilizacion 5

• ‘-A max_area’, El area maxima que debe poseer un rectangulo encontrado para serconsiderado placa de identificacion. Es un numero entero, mayor que min area. Elvalor por defecto es 50000.

• ‘-D dp_dist_min’. El error tolerable para el mecanismo de aproximaci’on poligonalusando Douglas-Peuker. Es un numero positivo, que es multiplicado por el perimetrodel contorno. El valor por defecto es 0,025.

• ‘-s std_dev_min_val’. Valor mınimo de la desviacion estandard de l proyeccion ver-tical sobre el cual esta es considerada perteneciente a un rectangulo que contiene laplaca de identificacion. Su valor por defecto es 0,12

• ‘-S std_dev_max_val’ Valor maximo de la desviacion estandard de l proyeccion verticalbajo el cual esta es considerada como perteneciente a una placa de identificacion. Suvalor por defecto es 0,22.

• ‘-p avg_min_val’Valor mınimo de la media arıtmetica de la proyeccion vertical sobreel cual esta es considerada como perteneciente a una placa de identificacion. Su valorpor defecto es 0,5.

• ‘-P avg_max_val’Valor maximo de la media arıtmetica de l proyeccion vertical bajo elcual esta es considerada como perteneciente a una placa de identificacion. Su valor pordefecto es 0,8.

• ‘-k pk_min_sep’Separacion mınima en pixeles de los picos en la proyeccion vertical. Esun numero entero. Su valor por defecto es 5.

• ‘-K pk_max_sep’Separacion maxima en pixeles de los picos de la proyeccion vertical.Su valor por defecto es 30. Es un numero entero.

• ‘-U pk_max_up’Numero de picos que debe presentar la proyeccion vertical para serconsiderada placa. Es un numero entero. Su valor por defecto es 4.

• ‘-d pk_max_down’Numero de valles que debe presentar la proyeccion vertical para serconsiderada placa. Es un numero entero. Su valor por defecto es 4.

• ‘-C max_area_comun’ Es el area que deben compartir dos rectangulos para ser consid-erados ser uno solo. Por ejemplo si es el treinta por ciento del area, este valor deberiaser 1,3. Si es el 45%, 1,45, etc.

3.2 Programa training

Sintaxis: training directorio: Es el programa de entrenamiento del ocr. toma comoargumentos un directorio que contiene las fotografıas a procesar. En caso de no reconocerlos caracteres en una fotografıa, traininig muestra la imagen no reconocida y espera a queel 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 per-manentemente 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 numero de matric-ula. Recibe como argumentos el directorio que contiene las fotografias a procesar. Devuelve

Page 162: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 3: Utilizacion 6

como salida un archivo en ‘~/directorio_analizado/resultado.html’ que contiene lalista de los numeros de placa, en formato html, y con un link hacia la ubicacion fisica decada una de las fotografias procesadas.

Page 163: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 4: Limitaciones 7

4 Limitaciones

Vlpd funcina por el momento con fotografıas jpg. Las fotografıas deben ser tomadas entre40cm a tres metros de distancia al vehıculo. 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 querequiere que esta este en buenas condiciones y presente un claro contraste con respecto alresto del vehıculo.

El programa actualmente presenta una efectividad del 75.8% en la deteccion de placa, yaproximadamente del 54% en el reconocimiento de los caracteres de placa. Mientras mayorla resolucion de las fotografıas, mayor la probabilidad de deteccion.

Actualmente presenta problemas en la deteccion de placa especialmente cuando no existeel suficiente contraste entre la placa y el fondo. La probabilidad de deteccion cae hasta casiel 3% en fotografıas con estas caracterısticas.

Vlpd funciona con placas que se ajusten a las caracterısticas especificadas en la legislacionde la Republica de Ecuador. Especıficamente aquellas con un solo color de fondo, y seiscaracteres (tres letras y tres numeros).

Vlpr asume que las fotograf’ias contienen una unica placa detectable

Page 164: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 5: Licencia 8

5 Licencia

VLPD se distribuye con la esperanza de que le sea util, pero SIN NINGUNA GARANTIA;sin incluso la garantıa implıcita de MERCANTIBILIDAD o IDONEIDAD PARA UNPROPOSITO PARTICULAR. El autor rechaza toda responsabilidad por danos operjuicios que se puedan producir por el uso de este programa.

Page 165: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Capıtulo 5: Indice 9

Indice

DDebian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

FFormatos de Imagen . . . . . . . . . . . . . . . . . . . . . . . . . . 7

GGarantia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

GCC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

IInstalacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

KKernel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

LLicencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

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

MMemoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

OOCR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1, 2

PPentium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Procesador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

RReconocimiento Optico de Caracteres . . . . . . . . . . 3

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

Resolucion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

UUbuntu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Utilizacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Page 166: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ANEXO C

DIMENSIONES DE LAS PLACAS VEHICULARES

146

Page 167: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 168: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

ANEXO D

ALGORITMO DE DETECCIÓN DE CONTORNOS

148

Page 169: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 170: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 171: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 172: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 173: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 174: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 175: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 176: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 177: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 178: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 179: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 180: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 181: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 182: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 183: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …
Page 184: Body Margin Notes...Header Body Footer Margin Notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2 one inch + \voffset 3 \oddsidemargin = 13pt 4 \topmargin = -23pt 5 …

Este documento se ha escrito usando unicamente herramientas libres. Entre otras, se

usaron GIMP, LATEX2ε, TEX, X�g, gnuplot.