Autor: TESINA PARA LA Director: OBTENCIÓN DEL TÍTULO DE: Diploma de...

50
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

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.

Proyecto: Reconocedor Automático de Matrículas de Tráfico Alumno: Gonzalo Puga Sabio

50

Diploma de Especialización en Desarrollo de Aplicaciones para Android

Y posteriormente pegamos ahí el directorio tessdata con el fichero de entrenamiento en

inglés.