Autor: TESINA PARA LA Director: OBTENCIÓN DEL TÍTULO DE: Diploma de...
Transcript of Autor: TESINA PARA LA Director: OBTENCIÓN DEL TÍTULO DE: Diploma de...
Título del
Proyecto:
RECONOCEDOR
AUTOMÁTICO DE
MATRÍCULAS DE
TRÁFICO
Autor:
Puga Sabio,
Gonzalo
Director:
Tomás Gironés,
Jesús
TESINA PARA LA OBTENCIÓN DEL TÍTULO DE:
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Julio del 2015
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
2
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Contenido
Introducción .................................................................................................................................. 3
Descripción del problema ......................................................................................................... 3
Objetivos ................................................................................................................................... 3
Motivación ................................................................................................................................ 3
Tecnologías utilizadas ................................................................................................................... 4
Restricciones hardware ................................................................................................................. 5
Arquitectura de la aplicación ........................................................................................................ 7
Esquema del diseño .................................................................................................................. 8
Localización de la placa de matrícula ...................................................................................... 10
Proceso de localización de la matrícula. ............................................................................. 11
Proceso de clasificación de la matrícula.............................................................................. 20
Reconocimiento de la placa de matrícula ............................................................................... 21
Segmentación interior de la placa de matrícula. ................................................................ 23
Reconocedores Ópticos de Caracteres OCR. ...................................................................... 24
Vistas de la aplicación ................................................................................................................. 36
Manual de usuario ...................................................................................................................... 39
Conclusiones ............................................................................................................................... 39
Código fuente en GitHub ............................................................................................................. 42
Anexos ......................................................................................................................................... 43
Instalación de Tesseract .......................................................................................................... 43
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
3
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Introducción
Descripción del problema
El reconocimiento automático de matrículas de tráfico (del inglés ANPR – Automatic Number
Plate Recognition-, también conocido como ALPR –Automatic License Plate Recognition-, AVI –
Automatic Vehicle Identification-, o CPR – Car Plate Recognition- ) es un procedimiento muy
común hoy día. Lo podemos encontrar en radares de tráfico, sistemas de control de acceso,
etc. Dado que hoy día cada uno de nosotros dispone de dispositivos móviles con un gran poder
de cálculo y que además disponen de, al menos, una cámara, vamos a desarrollar un sistema
de reconocimiento para dispositivos Android, el cual nos debe permitir, de un modo rápido y
sencillo, la detección y reconocimiento de placas de matrícula españolas.
Objetivos
El principal objetivo del proyecto es utilizar procedimientos de tratamiento de imágenes, tales
como segmentación de la imagen, extracción de características y reconocimiento de patrones,
así como mostrar el uso de distintos mecanismos de OCR para el reconocimiento de los
caracteres que componen la placa de matrícula.
Motivación
La idea original era desarrollar un sistema de apoyo a los cuerpos y fuerzas de seguridad del
estado, en este caso policía local, para consultar los datos de los vehículos ubicados en la vía
pública. Para ser más concretos, tener acceso a los datos de los propietarios de los vehículos
(mediante la consulta a bases de datos municipales) de cara a realizar trámites relacionados
con el vehículo, como gestión de boletines de denuncia, retirada de vía pública, etc. Sin
embargo, nos vamos a centrar en mayor medida en la localización y reconocimiento de las
placas de matrícula, ya que el paso posterior de procesamiento de ese dato creemos que se
sale del contexto del proyecto tal y como está planteado.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
4
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Tecnologías utilizadas
Para la realización de este proyecto nos hemos basado en los siguientes elementos:
OpenCV v.2.4.10 (versión Android)1. Se trata de una librería de visión artificial de libre
distribución, inicialmente desarrollada por Intel y posteriormente liberada con licencia
BSD para un uso tanto académico como comercial. OpenCV fue desarrollada pensando
en la eficiencia computacional, de cara a centrar su uso en aplicaciones de tiempo real.
Dispone de versiones en C, C++, Java y Python de modo que puede ser utilizada en
entornos Windows, Linux, Mac OS, iOS y Android. Está escrita en un lenguaje C/C++
optimizado de cara a hacer uso de los sistemas multiprocesador actuales.
SVM2. Las máquinas de soporte vectorial o máquinas de vectores de soporte son un
conjunto de algoritmos de aprendizaje supervisado. Estos métodos están propiamente
relacionados con problemas de clasificación y regresión. Dado un conjunto de
ejemplos de entrenamiento (de muestras) podemos etiquetar las clases y entrenar una
SVM para construir un modelo que prediga la clase de una nueva muestra.
Intuitivamente, una SVM es un modelo que representa a los puntos de muestra en el
espacio, separando las clases por un espacio lo más amplio posible. Cuando las nuevas
muestras se ponen en correspondencia con dicho modelo, en función de su
proximidad pueden ser clasificadas a una u otra clase.
Tesseract 3 para Android 4 . Tesseract es un motor OCR libre. Fue desarrollado
originalmente por Hewlett Packard como software propietario entre 1985 y 1995. Tras
diez años sin ningún desarrollo, fue liberado como código abierto en el año 2005 por
Hewlett Packard y la Universidad de Nevada, Las Vegas. Tesseract es desarrollado
actualmente por Google y distribuido bajo la licencia Apache, versión 2.0. Tesseract
está considerado como uno de los motores OCR libres con mayor precisión disponible
actualmente.
En los siguientes puntos describiremos con mayor detalle estos puntos, poniéndolos
en contexto con la necesidad de su uso.
1 http://opencv.org/downloads.html
2 http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
3 https://code.google.com/p/tesseract-ocr/
4 https://github.com/rmtheis/tess-two
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
5
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Restricciones hardware
La situación ideal la obtendríamos utilizando una cámara de infrarrojos para capturar la
imagen5, dado que este tipo de cámara permite operar de un modo sencillo con cualquier tipo
de luz, facilitando igualmente los procesos de segmentación y OCR. Es un sistema sencillo pero
que facilita el trabajo de los algoritmos y minimiza errores. De hecho, de acuerdo a la segunda
ley de la reflexión de la luz6, el ángulo de incidencia es igual al ángulo de reflexión. Es algo que
se puede verificar claramente en superficies lisas y pulidas como puede ser un espejo. Por
desgracia, la superficie de las matrículas de tráfico es rugosa, lo cual provoca un nuevo tipo de
reflexión conocida como difusa o dispersa. Es más, la mayoría de las placas se desarrollan con
materiales retrorreflectantes que producen un tercer tipo de reflexión conocida como
retrorreflexión, provocando que el haz de luz vuelva hacia el origen del mismo.
Combinando la reflexión difusa con la retrorreflexión de los materiales retrorreflectantes,
obtenemos un esquema de luz como el siguiente.
5 https://en.wikipedia.org/wiki/Automatic_number_plate_recognition
6 https://es.wikipedia.org/wiki/Reflexi%C3%B3n_(f%C3%ADsica)
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
6
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Mediante el uso de cámaras infrarrojas, sólo obtenemos el espectro infrarrojo de la luz, lo que
nos devuelve una imagen de alta calidad para segmentar, y posteriormente detectar y
reconocer las placas de matrícula con independencia del tipo de luz ambiental. De hecho,
mediante el uso de un filtro de infrarrojos vamos a conseguir enfatizar la placa de matrícula a
la vez que oscurecemos el resto de elementos de la imagen. Valga como ejemplo la siguiente
imagen:
Por lo tanto, los dispositivos profesionales de reconocimiento automático de matrículas de
tráfico están compuestos por los siguientes elementos:
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
7
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Sin embargo, en nuestro caso, el hardware del que haremos uso es el integrado en los móviles
actuales.
Arquitectura de la aplicación
Antes de explicar el funcionamiento del ANPR, debemos definir los pasos principales que
componen el sistema de reconocimiento de matrículas. Inicialmente, y simplificando al
máximo el proceso, podemos pensar que el sistema de reconocimiento consta de dos pasos
principales:
Localización de la matrícula.
Reconocimiento de la matrícula.
La fase de detección de la matrícula tiene como objetivo la localización de la placa de matrícula
dentro del frame de imagen devuelto por la cámara (o bien en una fotografía del vehículo).
Una vez localizada la placa de matrícula, el siguiente paso será segmentarla y analizarla
(reconocimiento de la matrícula) mediante el uso de algoritmos de OCR para determinar los
caracteres alfanuméricos que la componen.
Sin embargo, para poder llevar nuestro objetivo a la práctica, junto a los 2 pasos principales
anteriores hay que llevar a cabo otros 2.
Preproceso de la imagen: será necesario llevar a cabo una serie de pasos previos sobre
la imagen que tenemos cuya única finalidad será la de facilitar el trabajo de la fases
posteriores. Tal y como se ha indicado en las restricciones hardware, el uso de
hardware específico como pueden ser cámara con infrarrojos, podría realizar esta fase
de preproceso (si no completa al menos en parte) por nosotros. Sin embargo, al
carecer de dicho hardware, este paso será realizado mediante directivas software.
Segmentación: a la hora de llevar a cabo el reconocimiento nos encontramos con 2
fases claramente diferenciadas. Por un lado, segmentar la placa de matrícula y por
otro aplicar un OCR a dicha segmentación. Posteriormente veremos que esta fase de
segmentación puede no ser necesaria, quedando reducido todo a aplicar directamente
un OCR.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
8
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Por lo tanto, hechas estas matizaciones, podemos determinar que nuestro algoritmo, de modo
genérico dispone de las siguientes 4 partes:
Preproceso de la imagen.
Localización de la matrícula.
Segmentación interior.
OCR
Esquema del diseño
En la siguiente figura se muestran los pasos seguidos por el algoritmo de ANPR. Una vez
completados dichos pasos, si el procedimiento ha sido satisfactorio, mostraremos una zona
rectangular delimitando la placa de matrícula así como los caracteres detectados (en caso de
que se hayan podido reconocer).
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
9
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Recordemos que dentro del esquema anterior hay dos procedimientos fundamentales. Por un
lado deberemos realizar el localizar, dentro de la imagen, todos aquellos candidatos a ser
placas de matrícula. Posteriormente procederemos a analizar esos candidatos a placas con
distintos algoritmos de reconocimiento de patrones u OCR.
Estos procedimientos deberán estar presentes en cualquier sistema ANPR, disponga o no de
hardware específico que pueda facilitar a los mismos un conjunto de imágenes más favorables
para el mismo. Sin embargo, los algoritmos a emplear son los mismos independientemente de
la entrada que se les facilite. A continuación ofrecemos un esquema de los mismos.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
10
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Localización de la placa de matrícula
A la hora de llevar a cabo la localización de la placa de matrícula, hay varios aspectos a tener
en cuenta, y sin duda alguna el más importante de ellos es el tamaño de la misma.
En la actualidad, hay varios tipos de placa de matrícula homologados para el territorio
nacional, todos ellos reglados por la orden de 15 de septiembre de 2000 por la que se modifica
el anexo XVIII del Reglamento General de Vehículos, aprobado por Real Decreto 2822/1998, de
23 de diciembre.7
En nuestro caso, y de cara a simplificar el proceso, vamos a desarrollar un algoritmo que
detecte y analice la matrícula ordinaria larga, ya sea con o sin siglas de provincia. El esquema
de la misma es el siguiente:
Esta placa de matrícula tiene unas medidas de 520x110 mm y está formada por dos grupos de
caracteres que se encuentran separados por un espacio de 41mm. Del mismo modo, hay una
distancia de 14mm entre cada uno de los caracteres individuales. El primer grupo de
caracteres está formado por 4 dígitos y el segundo por 3 letras, no pudiendo formar parte de
las mismas las vocales (A, E, I, O, U), ni las letras Ñ y Q. Por último, indicar que las dimensiones
de cada uno de los caracteres tienen una dimensión de 45x77mm.
Aunque el algoritmo ha sido desarrollado basándonos en las características anteriores, y dado
que el modelo regional de matrícula larga difiere únicamente en la separación entre grupos de
caracteres, dicha matrícula también será reconocida por nuestro algoritmo. A continuación se
puede ver su esquema.
7 http://www.boe.es/diario_boe/txt.php?id=BOE-A-2000-16805
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
11
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Como ha podido observar, se ha hecho hincapié en las medidas, tanto de la matrícula, como
de los dígitos que la componen, ya que serán empleados a la hora de localizar y segmentar las
placas de matrícula.
Igualmente, hay que indicar que el proceso para adaptar el reconocedor a otros tipos de
matrícula, ya sea por tamaño o por pertenecer a otro país, no debería ser muy complejo
basándonos en los procedimientos aplicados en este proyecto.
Proceso de localización de la matrícula.
Para poder a llevar a cabo la localización de la placa de matrícula, debemos llevar a cabo un
proceso de segmentación sobre la imagen. Gracias a este proceso, simplificaremos la imagen
para su análisis de modo que se facilitará la extracción de secciones de la misma gracias a sus
características.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
12
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Un aspecto a tener en cuenta, y que en cierto modo limita a nuestro algoritmo, es que
el API de OpenCV para Android no es tan completo como el API para C++. Esto implica que
algunos algoritmos o funciones que nos podrían ser de utilidad, no se podrán utilizar
directamente en nuestro código Java8, si no es mediante la inclusión de llamadas a código
nativo. Algunas de estas funciones son empleadas para llevar a cabo correcciones de
perspectiva9, de cara a facilitar el trabajo de segmentación, y que no han implementado de
cara a mantener únicamente código Java. Como se verá posteriormente, los resultados son
satisfactorios sin dichos procedimientos.
Durante el proceso, y de cara a verificar el correcto funcionamiento de los distintos
procedimientos, se ha utilizado una base de datos de imágenes, tomadas a una distancia
aproximada de 2-3 metros del vehículo, con unas condiciones lumínicas suficientes y con poca
distorsión de la perspectiva. Nos basaremos en ellas de cara a mostrar los distintos pasos que
sigue el algoritmo de detección y reconocimiento de matrículas. Estas imágenes son de libre
acceso, disponibles como ejemplos del ANPR desarrollado como tema del libro Mastering
OpenCV10 disponibles en su página de github11.Dichas imágenes son las siguientes:
8 http://stackoverflow.com/questions/28565778/imgproc-getrectsubpix-opencv-function-give-an-error-
in-java 9 http://opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/
10 http://www.amazon.es/Mastering-Opencv-Practical-Computer-Projects/dp/1849517827
11 https://github.com/MasteringOpenCV/code
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
13
Diploma de Especialización en Desarrollo de Aplicaciones para Android
El primer paso a realizar, es la conversión de la imagen a escala de grises. Esto es debido a que
el color únicamente aporta información no relevante en el proceso, y por lo puede ser un
inconveniente en lugar de una ventaja.
A la hora de llevar a cabo la segmentación de la matrícula, podemos tomar en consideración
que la placa estará formada por un gran número de bordes verticales (asumiendo que la
matrícula se ha tomado frontalmente, que no está rotada y que no hay demasiada distorsión
de la perspectiva). Por lo tanto, este será un aspecto a explotar en el proceso de localización.
Pero antes de llevar a cabo la localización de los bordes verticales, eliminaremos parte del
ruido ambiente o que se haya podido generar por la cámara. Para ello, aplicamos un filtro
gaussiano de tamaño 5x5. Si no realizamos este paso previo, podríamos localizar falsos ejes
verticales que afectarían la precisión del algoritmo.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
14
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Una vez filtrado el ruido, hacemos uso de un filtro de Sobel, de cara a localizar los bordes
verticales. Mediante dicho algoritmo localizamos la primera derivada vertical, la cual
corresponde a los bordes verticales de la imagen.
El siguiente paso es binarizar la imagen (treshold), de cara a obtener píxeles únicamente con
valores 0 y 1. En nuestro caso empleamos Otsu.
A continuación, se lleva a cabo una operación morfológica (close) con el objetivo de eliminar
los espacios en blanco entre las líneas verticales, de cara a conectar todas las regiones que
dispongan de un alto número de bordes verticales. Una vez realizado este paso tendremos a
nuestra disposición regiones candidatas a contener placas de matrícula.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
15
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Como se ha comentado previamente, en este momento disponemos de las regiones de la
imagen que son candidatas a contener una placa de matrícula. Sin embargo, y tal como se
puede observar en las imágenes previas, la mayoría de las regiones no contienen la placa de
matrícula. Para discriminar entre las distintas regiones, vamos a utilizar la función findContours
teniendo en cuenta que únicamente necesitamos los bordes exteriores.
Dado que necesitamos aumentar el detalle, vamos a mostrar las imágenes a color y de
un tamaño mayor.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
16
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Tal y como se observa en la tabla anterior, en rojo aparecen marcadas las zonas de la imagen
candidatas a contener una placa de matrícula. Sin embargo, este tipo de información aún no se
puede procesar y son necesarios algunos pasos más para limitar y discriminar los candidatos a
contener placas de matrícula.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
17
Diploma de Especialización en Desarrollo de Aplicaciones para Android
El siguiente paso, por lo tanto, será encerrar las regiones detectadas anteriormente en una
zona rectangular de área mínima. Para ello, OpenCV hace uso de la función minAreaRect, la
cual devuelve un rectángulo de la clase RotatedRect.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
18
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Es en este punto, a partir del cual podremos empezar a discriminar candidatos basándonos en
diferentes técnicas. En nuestro caso vamos a utilizar 2:
Discriminación basada en tamaños: tal y como se describió en los pasos previos,
la placa de matrícula tiene un tamaño de 520x110mm. Por lo tanto, tenemos un
ratio de aspecto de 4.727272 (resultante de dividir el ancho por el alto). Por lo
tanto, todas las regiones que no cumplan con ese ratio de aspecto (más un margen
de error que hemos definido en el 40%) serán descartadas. Igualmente, todas las
áreas con menos de 15 píxeles o más de 125 también serán descartadas. Estos
márgenes se deberían ajustar de acuerdo a la resolución de la imagen.
Discriminación basada en ángulos. Si tomamos como referencia la placa de
matrícula, con los bordes largos horizontales y los cortos verticales, considerando
en dicho caso un ángulo de 90º, podremos eliminar aquellos candidatos cuya
rotación sea excesiva (mayor o menor en 15º a lo anterior), todo ello en base a la
idea de que las imágenes se tomarán con una perspectiva apropiada. Igualmente,
se ha de tener en cuenta que OpenCV devuelve los ángulos de los RotateRect en
un rango comprendido entre [-90º, 0º)12 , y por lo tanto será necesaria una
conversión a un sistema más comprensible.
12
https://stackoverflow.com/questions/15956124/minarearect-angles-unsure-about-the-angle-returned/21427814#21427814
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
19
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
20
Diploma de Especialización en Desarrollo de Aplicaciones para Android
En este punto hemos determinado los candidatos a placa de matrícula en la imagen. Tal y
como se observa en las imágenes anteriores, lo normal es que tengamos varios candidatos en
una misma imagen. Por lo tanto, la siguiente fase que debemos afrontar es la de clasificación.
Proceso de clasificación de la matrícula.
Para poder determinar si un candidato a matrícula es en realidad o no una placa de matrícula,
vamos a hacer uso de patrones de reconocimiento a través de máquinas de soporte vectorial
SVM13 (Support Vector Machine).
Lo ideal en este caso, sería disponer de ejemplos de entrenamiento que distingan entre zonas
que son placas de matrícula y aquellas que no lo son. Desafortunadamente, no disponemos de
dichas tablas de entrenamiento. En nuestro caso disponemos únicamente de tablas de
entrenamiento para los caracteres interiores de la imagen, los cuales los vamos a utilizar para
discriminar entre placas de matrícula y aquellas zona que no lo son. Este procedimiento estará
integrado en la siguiente fase del ANPR, la segmentación interior de la matrícula, donde se
explicará con mayor detalle.
No quisiéramos dejar pasar un detalle a tener en cuenta en relación al SVM con
OpenCV en Android. Lo normal, es disponer de un fichero de entrenamiento en formato XML,
con cientos, sino miles, de datos provenientes de fases previas de entrenamiento. Dentro de la
API de OpenCV hay funciones que se encargan de la lectura/escritura de dichos ficheros de un
13
https://es.wikipedia.org/wiki/M%C3%A1quinas_de_vectores_de_soporte
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
21
Diploma de Especialización en Desarrollo de Aplicaciones para Android
modo rápido y eficiente. Se trata de la clase FileStorage14. Desafortunadamente, dicha clase no
se encuentra en el API de OpenCV para Android15. Por lo tanto, deberemos implementar una
función para leer los datos del fichero de entrenamiento en XML. Durante la fase de pruebas
se puso de manifiesto que la lectura de estos datos era muy lenta (pudiendo llegar a tardar
minutos) con la función en Java, lo cual nos obligó a buscar una solución alternativa. En
nuestro caso, transformamos los datos a un fichero de imagen png, el cual se lee de modo
bastante más rápido, solventando de modo satisfactorio este problema. En la estructura de
ficheros del programa se han incluido ambas versiones, de cara a un futuro uso.
Reconocimiento de la placa de matrícula
El siguiente paso consiste en analizar el interior de la zona de imagen que se ha clasificado
como placa de matrícula con dos objetivos:
Determinar que realmente se trata de una placa de matrícula.
Aplicar el OCR a los distintos caracteres que la componen de cara a ofrecer el resultado
al usuario.
Dado que el procedimiento en ambos casos, al menos en nuestro caso, es el mismo, lo hemos
integrado todo en un único procedimiento.
A la hora de determinar que realmente estamos ante una placa de matrícula, procedemos a su
análisis mediante máquinas de vectores de soporte (SVM) y siempre que el número de
elementos reconocidos positivamente sea superior o igual a 4, determinamos que se trata de
una placa de matrícula. En caso contrario, se descarta.
A continuación puede encontrar, tal y como hemos hecho en pasos anteriores, un esquema
simplificado del proceso de reconocimiento de la placa de matrícula. Como podrá observar,
dispone de una primera parte que se encargará de segmentar el interior de la zona candidata a
placa de matrícula. En caso de que la zona segmentada disponga de las características
necesarias para considerarla una placa de matrícula, procederemos en un segundo paso a
aplicarle un OCR para que nos ofrezca el resultado definitivo del proceso de reconocimiento.
14
http://docs.opencv.org/modules/core/doc/xml_yaml_persistence.html 15
http://answers.opencv.org/question/12818/does-filestorage-work-on-android/
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
22
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
23
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Segmentación interior de la placa de matrícula.
Previamente a lo anterior, deberemos segmentar la imagen con la posible placa de matrícula de cara a delimitar los posibles caracteres que la componen. Para ello, los pasos a seguir los siguientes:
1. Convertimos la imagen a escala de grises. 2. Ecualizamos el histograma, de cara a mejorar el contraste de esa zona de la imagen. Lo
que intentamos con este paso es que la imagen tenga una distribución lo más plana posible, lo cual facilitará los siguientes pasos.
3. Binarizamos la imagen de modo inverso, de cara a transformar los elementos blancos de la misma en negros, y los negros en blancos, siendo este paso necesario para la búsqueda posterior de contornos, basada en la búsqueda de píxeles blancos.
4. Buscamos los contornos con findContours y para cada región detectada realizamos una verificación de tamaños para eliminar falsos candidatos a dígitos. En nuestro caso descartamos aquellas regiones cuyo alto sea inferior a su alto, ya que los dígitos de la placa de matrícula que hemos tomado como base tienen un alto de 77 mm y un ancho de 45 mm.
En la siguiente tabla puede observar el resultado de aplicar todos y cada uno de los pasos anteriores sobre nuestra base de vehículos de prueba.
Original Escala de grises Ecu. Histograma Binaria Contornos
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
24
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Tal y como se observa, el porcentaje de acierto en la localización de los dígitos es muy elevada.
Llegados a este punto, debemos aplicar el OCR a cada uno de los segmentos reconocidos anteriormente. En nuestro caso, daremos distintas opciones al usuario.
Reconocedores Ópticos de Caracteres OCR.
Tesseract
La primera alternativa que ofrecemos al usuario es reconocer caracteres mediante Tesseract.
Tesseract16 es un motor OCR libre. Fue desarrollado originalmente por Hewlett Packard como software propietario entre 1985 y 1995. Tras diez años sin ningún desarrollo, fue liberado como código abierto en el año 2005 por Hewlett Packard y la Universidad de Nevada, Las Vegas. Tesseract está siendo desarrollado actualmente por Google y distribuido bajo la licencia Apache, versión 2.0.
Tesseract está considerado como uno de los motores OCR libres con mayor precisión disponible actualmente.
Por desgracia, Tesseract no dispone de una versión para Android, por lo que tendremos que utilizar un fork de Tesseract denominado Tess-two.17 De nuevo, nos encontramos con el pequeño inconveniente de que debe ser transformado a librería mediante android-ndk18 e integrado en el entorno de desarrollo, en nuestro caso Android Studio. Dado que este procedimiento no es trivial, aportamos un anexo al final de esta memoria donde explicamos paso a paso su configuración para un entorno Windows.
16
https://es.wikipedia.org/wiki/Tesseract_OCR 17
https://github.com/rmtheis/tess-two 18
https://developer.android.com/tools/sdk/ndk/index.html
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
25
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Ventajas e inconvenientes de Tesseract
Sin duda, la gran desventaja de este sistema OCR es que se trata de un sistema lento y difícil de
configurar 19 . Dada su naturaleza, Tesseract lleva a cabo una serie de pasos en el
reconocimiento muy similares a los empleados por nuestra aplicación de detección de
matrículas de tráfico20 que provocan que tarde del orden de segundos en dar un resultado al
reconocimiento.
Sin embargo, tiene una importante ventaja, y es que no es necesario segmentar el interior de
la matrícula para proceder a su reconocimiento. Por lo tanto, si nuestro algoritmo de
localización de la placa de matrícula es efectivo, podremos pasar toda la placa como tal al
reconocedor y este la analizará sin problemas. Y no sólo eso, sino que es más conveniente, a
efectos de tiempo, hacerlo de este modo que carácter a carácter, ya que este procedimiento,
teniendo en cuenta que el número de caracteres de una matrícula oscila entre 7 y 8 que
deberá preprocesar de modo individual, por lo que el tiempo de respuesta será acumulativo.
Como ventaja adicional, tenemos una lista blanca y una lista negra de caracteres que pueden
formar parte de la salida. Se ha usado ya que las matrículas, como se comentó previamente,
está formado por dígitos y letras, salvo vocales, Ñ y Q. Esto con una excepción, ya que hemos
permitido el carácter E, ya que en muchas ocasiones reconocerá el identificador del país.
Análisis de resultado de Tesseract
A continuación vamos a mostrar una tabla con los resultados de nuestro reconocedor de
matrícula mediante Tesseract. Tal y como hemos comentado en el paso anterior, vamos a
trabajar con la placa de matrícula como un todo, sin segmentar su interior. Por lo tanto,
aspectos como el hecho de que no se puedan segmentar todos los caracteres de la matrícula,
como por ejemplo en el siguiente ejemplo no nos debería afectar.
Sin embargo, es muy probable que los elementos de los bordes de la matrícula, como la barra
azul con el identificador del país, o zonas de sombra, puedan provocar falsos positivos.
19
http://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version 20
file:///C:/Users/Gonzalo/Downloads/TesseractOSCON.pdf
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
26
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Resolución 320x240
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
27
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Resolución 640x480
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
28
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Resolución 800x600
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
29
Diploma de Especialización en Desarrollo de Aplicaciones para Android
A continuación, analizamos el resultado para cada una de las matrículas y resolución
disponibles.
Matrícula 320x240 640x480 800x600
2715DTZ 52715DTZJ 52715DTZJ 52715DTZJ
3028BYS 1112032875BVS ??????? ???????
3154FFY ??????? ??????? ???????
3266CNT H3265CNT E3266CNT E3266CNT
3732FWW E3732FWQZ E3732FWQZ E3732FWQZ
5445BSX 134445755X 15549515453141 15549515453141
7215BGN H7215BGN 15172151511 15172151511
8995CCN 1138995CCN 1138995CCN 1138995CCN
9588DWV 5195878115W 5195878115W 5195878115W
973BNB 9773ENE ??????? ???????
0226FBV 10226FVBH ??????? ???????
4898GXY E4898BXY 1H4898GXY 1H4898GXY
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
30
Diploma de Especialización en Desarrollo de Aplicaciones para Android
En verde, se marcan las matrículas reconocidas correctamente, y en rojo, aquellos
caracteres que habría que eliminar o cambiar para obtener un resultado correcto.
De acuerdo a la tabla anterior, estamos ante un algoritmo impreciso y que requiere refinar el
análisis de la matrícula de cara a amoldar el resultado a la entrada. Igualmente hay que decir
que en las pruebas de campo, los resultados son bastante más satisfactorios.
Dada que la finalidad última de esta memoria es su publicación libre online, y dada la
controversia21 existente sobre si la matrícula de un vehículo es un dato de carácter personal,
de acuerdo a la Agencia Española de Protección de Datos22, no se van a mostrar en este
informe las matrículas obtenidas en los análisis de campo.
Máquinas de Soporte Vectorial (SVM-Support Vector Machine)
Originalmente, los sistemas SVM son un conjunto de algoritmos de aprendizaje supervisado.
De acuerdo a la Wikipedia23, estos métodos están propiamente relacionados con problemas de
clasificación y regresión. Dado un conjunto de ejemplos de entrenamiento (de muestras)
podemos etiquetar las clases y entrenar una SVM para construir un modelo que prediga la
clase de una nueva muestra. Intuitivamente, una SVM es un modelo que representa a los
puntos de muestra en el espacio, separando las clases por un espacio lo más amplio posible.
Cuando las nuevas muestras se ponen en correspondencia con dicho modelo, en función de su
proximidad pueden ser clasificadas a una u otra clase.
Más formalmente, una SVM construye un hiperplano o conjunto de hiperplanos en un espacio
de dimensionalidad muy alta (o incluso infinita) que puede ser utilizado en problemas de
clasificación o regresión. Una buena separación entre las clases permitirá una clasificación
correcta.
En el caso de OpenCV24, dichos sistemas aparecen integrados dentro de la API (aunque con
ciertas limitaciones en el caso de API para Android) y pueden ser utilizados sin mayor
problema como una clase más.
La gran ventaja de este procedimiento, es que es muy rápido. Por el contrario, la adecuación
de resultados depende de tener una buena y amplia base de entrenamiento25, la cual viene en
un fichero XML, lo cual ya comentamos que aporta problemas ante las limitaciones del API. De
cualquier modo, una vez solventados estos problemas, tenemos un reconocedor rápido y
fiable, que únicamente necesita segmentar el interior de la matrícula y pasar uno a uno los
21
https://www.samuelparra.com/2010/08/25/matricula-vehiculo-no-es-dato-personal/ 22
http://www.agpd.es/portalwebAGPD/canaldocumentacion/informes_juridicos/conceptos/common/pdfs/2006-0425_Matr-ii-culas-de-veh-ii-culos-y-concepto-de-dato-de-car-aa-cter-personal.pdf 23
https://es.wikipedia.org/wiki/M%C3%A1quinas_de_vectores_de_soporte 24
http://docs.opencv.org/modules/ml/doc/support_vector_machines.html 25
https://docs.marklogic.com/guide/search-dev/classifier
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
31
Diploma de Especialización en Desarrollo de Aplicaciones para Android
segmentos de imagen a reconocer. En nuestro caso, dichos segmentos se analizarán en escala
de grises, dado que aportan una mayor información que si fuesen en blanco y negro.
Llegados a este punto, y al igual que hicimos con Tesseract en el paso anterior, vamos a
someter nuestra batería de imágenes de prueba a este OCR para ver qué resultados
obtenemos.
Resolución 320x240
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
32
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Resolución 640x480
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
33
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Resolución 800x600
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
34
Diploma de Especialización en Desarrollo de Aplicaciones para Android
A continuación, analizamos el resultado para cada una de las matrículas y resolución
disponibles.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
35
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Matrícula 320x240 640x480 800x600
2715DTZ 2715DTZ 2715DTZ 2715DTZ
3028BYS 3???BYS ??????? ???????
3154FFY 3154FFY 3154UU 3154UU
3266CNT 3266CNT 3266CNT 3266CNT
3732FWW 3732FWF 3732FWF 3732FWF
5445BSX 5445BSX 5445BSX 5445BSX
7215BGN N7215BGN 2175BUU 2175BUU
8995CCN 8985CNN 8985CNN 8985CNN
9588DWV 69588DRV 69588DRV 69588DRV
9773BNB 9773BNB 9773??? 9773???
0226FBV 0226FBV 0226FBV 0226FBV
4898GXY 48980XY 84898GXY 84898GXY
Tal y como se puede observar, el porcentaje de acierto es bastante más elevado, y en aquellos
casos en los que no se acierta, se debe, o bien a una alteración del orden de los caracteres (a
pesar de tener una función que corrige el orden de los mismos), o bien a que se ha añadido
algún carácter extra proveniente de la fase de segmentación, y no achacable por lo tanto al
OCR.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
36
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Vistas de la aplicación
A continuación puede ver un esquema que muestra las principales pantallas de la aplicación y
el diagrama de navegación entre ellas.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
37
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Al acceder a la aplicación, se cargarán las bases de datos de reconocimiento (puede tardar
algunos segundos con la pantalla en negro) y tras ello se mostrara la imagen capturada por la
cámara.
Las opciones estarán disponibles pulsando sobre la pantalla:
Tal y como se observa, tenemos 4 opciones:
Cambiar resolución: nos permite elegir entre 3 tipos de resolución de cámara distintas
(por defecto trabajamos con una resolución de 320x240):
Cambiar entrada: nos ofrece los distintos modos de entrada de imagen .
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
38
Diploma de Especialización en Desarrollo de Aplicaciones para Android
o La cámara es la opción por defecto.
o Mediante fichero nos aparece un grid con la batería de imágenes prueba:
o Mediante galería se nos permitirá elegir entre las opciones del dispositivo de
cara a localizar una imagen a analizar:
Cambiar reconocedor: nos permite elegir entre los distintos algoritmos de OCR
disponibles (por defecto SVM):
Guardar imagenes: guarda en el dispositivo, en una carpeta con el nombre de la
aplicación dentro del directorio Pictures las imágenes antes y después del proceso de
reconocimiento de la placa de matrícula.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
39
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Manual de usuario
La aplicación es muy sencilla de utilizar. Por defecto está configurada en el modo que mejores
resultados ha obtenido en la fase de estudio (resolución de 320x240 y algoritmo SVM),
pudiéndose denominarse como una aplicación “OutOfTheBox”. Una vez cargada la aplicación,
únicamente habrá que dirigirla hacia la zona del vehículo donde se encuentra la matrícula (a
una distancia aproximada de 1.5 a 2 metros) y esperar el resultado del análisis.
Cuando la app detecte una matrícula la rodeará con un rectángulo de color rojo cuando se va a
proceder al análisis interior de la misma o verde cuando se detecta como candidato a placa de
matrícula pero su segmentación interior devuelve un resultado que hace sospechar a la
aplicación que es un falso positivo (puede que no sea una placa de matrícula) o cuando hay
varios candidatos en la misma imagen.
A través del menú de la aplicación podremos modificar tanto la resolución a la que queremos
hacer el procesado como cambiar el algoritmo de OCR (entre SVM –predeterminado- y
Tesseract).
Conclusiones
Grado de cumplimiento de los objetivos planteados.
Después de un duro trabajo, hemos de reconocer que estamos bastante satisfechos con el
resultado obtenido. El proceso de localización de matrícula tiene una eficiencia cercana al
100%, sobre todo con procesado en tiempo real donde se puede modificar la posición de la
cámara de cara a facilitar el trabajo al algoritmo.
Igualmente, el proceso de reconocimiento del interior de la matrícula es bastante exitoso,
sobre todo haciendo uso de SVM. Tesseract sin embargo se ha mostrado más impreciso y lento
de esperado, sobre todo después de unas pruebas previas bastante prometedoras.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
40
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Líneas abiertas.
Respecto al programa hay varias líneas abiertas que, o bien por falta de tiempo o bien porque
se escapaba un poco de la idea original del proyecto no se han llevado a cabo. Valgan como
ejemplo las siguientes:
Ampliar el reconocedor a los otros tipos de matrícula disponibles en el estado español,
como puede ser la versión cuadrada de la misma, la matrícula reducida o matrículas de
vehículos especiales. En ambos casos, dada su singularidad y la falta de tiempo no se
han llevado a cabo. A continuación se pueden ver las especificaciones de algunas de
ellas:
Matrícula reducida (delantera) Matrícula reducida delantera larga con siglas de provincia
Matrícula ordinara alta con siglas de provincia
Matrícula ordinaria alta
Matrícula ordinaria de motocicleta Matrícula ordinaria de motocicleta con siglas de provincia
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
41
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Matrícula de vehículos especiales con fondo blanco
Matrícula de remolques y semirremolques larga con fondo rojo
Matrícula de remolques y semirremolques alta con fondo rojo
Matrícula de ciclomotores fondo amarillo
Estudiar un poco más en profundidad las opciones que nos ofrece Tesseract de cara a
mejorar sus resultados. Hay decenas de variables de configuración que podemos
modificar para mejorar estos resultados, pero es algo que se escapa al objetivo de este
proyecto.
La nueva versión de OpenCV, la 3.026, incorpora por defecto funciones de OCR capaces
de detectar y procesar dentro de una imagen aquellas secciones o zonas donde hay un
texto, en lo que han venido a denominar Scene Text Recognition27. Sería importante
probar esta nueva funcionalidad, ya que si funciona, puede venir a reemplazar al
conjunto de este proyecto.
26
http://opencv.org/opencv-3-0.html 27
http://docs.opencv.org/3.0-beta/modules/text/doc/ocr.html
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
42
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Dado que nos ha sido imposible disponer de una base entrenada para el
reconocimiento de placas de matrícula no hemos podido usarlo. La idea es, que al igual
que hemos hecho uso de un sistema entrenado para el reconocimiento de dígitos de
placa de matrícula, disponer de otro que reconozca la forma de la placa en su
conjunto. Es un proceso que facilitaría y mejoraría la precisión de la localización de
placas de matrícula, al comparar posibles candidatos con un sistema ya entrenado
para ello.
Finalmente, por falta de tiempo no hemos podido aplicar la salida del reconocedor con
consultas a una base de datos de vehículos, de cara a facilitar una información más
detallada del mismo (como datos de conductor, marca, modelo, etc.). Esto se debe en
gran parte a que hemos preferido centrar nuestros esfuerzos en el reconocedor de
cara a hacerlo más rápido y eficiente. El paso adicional de consultar una base de datos
puede considerarse como sencillo y rápido de realizar en un futuro en caso de
necesitarse.
Consideraciones personales.
Considerando todo lo anterior, podemos considerar que la aplicación actual cumple con
nuestras exigencias en un porcentaje bastante alto (obviamente no el 100% ya que siempre se
puede mejorar). Ni que decir tiene que siempre hay trabajo adicional que realizar, por lo que
animamos al lector a que adapte esta aplicación a sus necesidades. Todo el código está
disponible en libre distribución en gitbub para que todo aquel que lo considere oportuno o
necesario lo use, adapte a sus propias necesidades, y por supuesto mejore.
Código fuente en GitHub
https://github.com/gonpuga/ANPR/
En el enlace de github se dispone de todo el código de la aplicación. Sin embargo, dado que
debemos hacer uso de las librerías de OpenCV y de Tesseract, adjuntamos también el proyecto
completo para Android Studio. De este modo simplemente habrá que importarlo y ejecutarlo.
Si no desea hacer lo anterior, adjuntamos también el fichero apk de nuestra aplicación, listo
para instalar y utilizar.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
43
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Anexos
Instalación de Tesseract
Preparar Tesseract (entorno Windows)
1. Nos lo debemos descargar desde github28.
2. Descomprimimos el contenido en una carpeta de nuestro equipo.
3. Hay que tener en cuenta que requiere Android 2.0 o superior.
4. Descargar los ficheros de entrenamiento para el lenguaje que necesitemos29. En
nuestro caso, dadas las características de las matrículas nos decantamos por el
inglés30. El problema es que el fichero de la versión 3.0.2 ocupa 21 MB. Mientras que
el de la versión 3.0.1 sólo ocupa 4 MB. Dado que es un fichero que acompaña a
nuestra aplicación y que básicamente reconoce números, nos vamos a decantar por el
de menor tamaño.
5. Este fichero se deberá descomprimirse en el móvil en un subdirectorio denominado
tessdata dentro de assets.
Para importar Tesseract en nuestro proyecto de Android, primero habrá que compilarlo.
Para ello debemos descargarnos el Android NDK e instalarlo en nuestro sistema.
Una vez instalado, debemos añadir la ruta donde se encuentra al Path.
Una vez añadido el NDK a nuestra variable de entorno, podremos hacer uso de sus
comandos desde la consola desde cualquier directorio.
Ahora crearemos la librería OCR de Tesseract usando la consola (Este proceso bastante
lento y puede durar más de 30 minutos, todo dependiendo del equipo. Para ello
iremos al directorio tess-two y abriremos la consola del sistema mediante shift+click
derecho
28
https://github.com/rmtheis/tess-two/archive/master.zip 29
https://code.google.com/p/tesseract-ocr/downloads/list 30
https://code.google.com/p/tesseract-ocr/downloads/detail?name=tesseract-ocr-3.02.eng.tar.gz&can=2&q=
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
44
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Deberemos utilizar la siguiente secuencia de comandos:
ndk-build android update project --path C:\...\tess-two ant release
Mediante ndk-build compilaremos los ficheros en formato .c para los distintos tipos de
procesadores móviles disponibles (armeabi, x86 y mips).
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
45
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Seguidamente, con android update project --path C:\...\tess-two31generaremos el fichero
proguard-project.txt
Finalmente, generaremos la librería mediante ant release. Desafortunadamente, esta
herramienta no forma parte del SDK estándar de Android, por lo que habrá que instalarla
siguiendo los siguientes pasos:
La descargamos desde The Apache Ant Project32.
La descomprimiremos en un fichero, por ejemplo C:/ant
Añadimos el directorio C:/ant/bin a la variable Path.
31
Para más información de compilación desde línea de comandos: http://developer.android.com/tools/building/building-cmdline.html 32
http://ant.apache.org/bindownload.cgi
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
46
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Después de haber compilado la librería tess-two necesitamos importarla a nuestro proyecto de Android Studio.
Añadir tess-two a nuestro proyecto en Android Studio
El primer paso es situarnos en el explorador de ficheros de nuestro proyecto, subir a nivel de
proyecto y crear un nuevo directorio denominado libraries
Dentro de este directorio, creamos un subdirectorio denominado tess-two y desde Windows
movemos la carpeta tess-two completa.
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
47
Diploma de Especialización en Desarrollo de Aplicaciones para Android
El tamaño de dicha carpeta es bastante grande, aproximadamente 380MB. De acuerdo
a cierta información de terceros33 se pueden eliminar parte de sus subdirectorios como lib y
ficheros como .project, .classpath, build.xml y Project.propierties. Sin embargo en las pruebas
que hemos llevado a cabo esto provoca errores en nuestro proyecto. La única carpeta que
podemos vaciar es obj. Como observarás, tiene un tamaño de unos 330MB. De este modo, la
librería Tesseract “sólo” aporta 50 MB a nuestro proyecto.
Para continuar, dentro del directorio libraries/tess-two deberemos crear un nuevo fichero
build.gradle y lo rellenamos teniendo en cuenta lo siguiente:
o Todos los build.gradle de nuestra aplicación deben tener el mismo targetSdk
versión.
o Hay que asegurarse de que el fichero build.gradle se ha creado correctamente
dentro de libraries/tess-two.
El contenido de dicho fichero gradle puede ser el siguiente:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
apply plugin: 'com.android.library'
android {
33
https://coderwall.com/p/eurvaq/tesseract-with-andoird-and-gradle
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
48
Diploma de Especialización en Desarrollo de Aplicaciones para Android
compileSdkVersion 22
buildToolsVersion "21.1.2"
defaultConfig {
minSdkVersion 9
targetSdkVersion 22
}
sourceSets.main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
res.srcDirs = ['res']
jniLibs.srcDirs = ['libs']
}
}
Seguidamente, dentro del settings.gradle principal debemos incluir la librería tess-two (se
puede hacer, salvo la línea de libraries, aceptando la advertencia del entorno de desarrollo
que nos aparece al crear el fichero build.gradle). De cualquier modo, si lo desea hacer de
modo manual, deberá añadir las siguientes líneas:
include ':app', ':tess-two'
include ':libraries:tess-two'
project(':tess-two').projectDir = new File('libraries/tess-two')
El último paso es añadir una dependencia al módulo tess-two dentro de nuestra aplicación, en
la estructura del proyecto (por ejemplo mediante ctrl+alt+shift+s)
Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio
49
Diploma de Especialización en Desarrollo de Aplicaciones para Android
Esperamos a que se reconstruyan los gradle, cosa que se debe hacer sin problemas ni
advertencias.
A partir de este momento, nuestra librería tesseract podrá ser utilizada dentro de nuestro
proyecto de Android Studio. Pero antes, tal y como comentamos en los primeros pasos de este
manual, debemos guardar los ficheros de reconocimiento en inglés en la carpeta
assets/tessdata. Para no errar en el lugar donde crearlo, lo podemos hacer mediante
new->folder->assets folder desde app.