body margin notes...header body footer margin notes 8 7 1 3 10 9 11 2 4 5 6 1 one inch + \hoffset 2...
TRANSCRIPT
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
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
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
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
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
DEDICATORIA
Dedicado a Dios, a mis Padres y a mi Familia.
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
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
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
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
Í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
Í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
Í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
Í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
Í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
Í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
Í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
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
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
Í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.
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
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.
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].
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.
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.
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].
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
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.
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.
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
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
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
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
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]:
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].
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.
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.
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
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.
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.
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
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.
CAPÍTULO 2. DESCRIPCIÓN DEL MÓDULO 23
Figura 2.18: Imagen e histograma correspondiente
Figura 2.19: Imagen ecualizada e histograma correspondiente
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
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
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
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
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.
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
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)
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′.
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.
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
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
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.
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.
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
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.
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
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.
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:
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
CAPÍTULO 3. IMPLEMENTACIÓN 43
Figura 3.1: Diagrama de flujo general del método de detección de placa propuesto.
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
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.
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.
CAPÍTULO 3. IMPLEMENTACIÓN 47
Figura 3.5: Diagrama de flujo de la etapa de detección de rectángulos
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.
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
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).
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
CAPÍTULO 3. IMPLEMENTACIÓN 52
Figura 3.10: Diagrama de flujo de la etapa de selección y filtrado
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)
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
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.
CAPÍTULO 3. IMPLEMENTACIÓN 56
Figura 3.14: Procedimiento de análisis de la proyección vertical
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.
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
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:
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
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)
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.
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
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
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
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.
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
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
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'."
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
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.).
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.
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.
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.
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
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.
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.
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
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.
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-
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.
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-
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
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.
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.
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).
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
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
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
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 %
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
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
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
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
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
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.
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
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
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.
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).
ANEXO A
CÓDIGO FUENTE
101
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.
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.
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 ) ;
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 ) ;
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 }
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" } ,
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 ' :
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
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 */
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.
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 ;
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
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 ;
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
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 " ) ;
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
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 ) ;
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.
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
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
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 ) ;
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
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>
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
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 *
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
7 ****************************************************************************/
89 /*
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 }
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 ] ;
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 ] ) ;
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 ) ;
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
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
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 `
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
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 }
ANEXO B
MANUAL DE USUARIO
133
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.
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.
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
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
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:
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.
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.
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
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.
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
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.
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
ANEXO C
DIMENSIONES DE LAS PLACAS VEHICULARES
146
ANEXO D
ALGORITMO DE DETECCIÓN DE CONTORNOS
148
Este documento se ha escrito usando unicamente herramientas libres. Entre otras, se
usaron GIMP, LATEX2ε, TEX, X�g, gnuplot.