• No se han encontrado resultados

Análisis y desarrollo de la iteración 4

3.7. Desarrollo

3.7.7. Análisis y desarrollo de la iteración 4

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

Demo de la iteración 3

En la figura 3.19 se ve el demo de la iteración 3 que es la activación de la cámara para la captura de la imagen del medidor.

Figura 3.19: Demo de la iteración 3 Fuente: Elaboración propia

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

PÁG. 111

c) Sprint backlog

En esta fase se detalla las tareas y sub-tareas contenidas dentro de la iteración 4 que engloba la historia de usuario denominado tratamiento de la imagen. En la tabla 3.35 se puede ver la pila de tareas para la iteración 4.

TABLA 3.35: Sprint backlog 4 Spi

nt Inicio Duración

(días) Elementos del Producto Backlog

Días 20-24 Junio 27 Junio-01 Julio 4-8 Julio 11-15 Julio

4 20-jun-16 20

Tratamiento de la imagen

Id Tarea Delegado Estado Hora 20 20 20 20

5 Determinar el algoritmo OCR Desarrollador 1 Finalizado X

5 Codificar las utilidades de la cámara Desarrollador 1 Finalizado X

5 Codificar motor de la cámara Desarrollador 1 Finalizado X

5 Codificar el motor del auto enfoque Desarrollador 1 Finalizado X 5 Codificar las utilidades del cuadro de enfoque Desarrollador 1 Finalizado X 5 Codificar la vista del cuadro de enfoque Desarrollador 1 Finalizado X

5 Codificar el preprocesado de la imagen Desarrollador 1 Finalizado X

5 Codificar el reconocimiento de la imagen Desarrollador 1 Finalizado X

5 Codificar la visualización del texto Desarrollador 1 Finalizado X

5 Codificar la confirmación y almacenamiento del texto Desarrollador 1 Finalizado X Fuente: Elaboración propia

d) Revisión del sprint

Tareas complementarias

La tabla 3.36 muestra las tareas que el desarrollador 1 ha terminado hasta el momento de la finalización de la iteración 4.

TABLA 3.36: Tareas complementarias iteración 4

Tarea asignada a: Bixbi Tapia Sueldo Estado Tareas: Completado Número de Tareas: 10

Id Nombre Tarea Nombre Proyecto Iteración Fecha Modificación

5 Determinar el algoritmo OCR ALME 4 21-Junio-2016

5 Codificar las utilidades de la cámara ALME 4 24-Junio-2016

5 Codificar motor de la cámara ALME 4 23-Junio-2016

5 Codificar el motor del auto enfoque ALME 4 24-Junio-2016

5 Codificar las utilidades del cuadro de enfoque ALME 4 30-Junio-2016

5 Codificar la vista del cuadro de enfoque ALME 4 01-Julio-2016

5 Codificar el preprocesado de la imagen ALME 4 07-Julio-2016

5 Codificar el reconocimiento de la imagen ALME 4 08-Julio-2016

5 Codificar la visualización del texto ALME 4 14-Julio-2016

5 Codificar la confirmación y almacenamiento del texto ALME 4 14-Julio-2016

Fuente: Elaboración propia

cc

Repositorio Institucional – UNAMBA - PERÚ

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

Burn down chart

El gráfico 3.4 presenta el avance del proyecto hasta el momento de la finalización de la iteración 4.

Gráfico 3.4: Gráfico Burn Down Chart de la iteración 4 (Anexo B.4) Fuente: Elaboración propia

Código fuente de la iteración 4

A la hora de reconocer un texto de una imagen digital, el procesado de la imagen es una parte muy importante ya que es donde se corrigen los posibles defectos que se hayan dado a la hora de tomar la foto y se prepara para el reconocimiento.

Dependiendo del tipo de dispositivo Android que se use la calidad de la cámara varía, por ello lo primero que se realiza en el procesado es un filtro paso bajo de tipo blur.

Los filtros paso bajo se ocupan de eliminar las frecuencias altas de la imagen, de esta manera se consigue suavizar los contrastes de la imagen y así eliminar gran parte del ruido que se pueda meter en la imagen.

Para conseguir este objetivo se crea una máscara de pixeles con la forma de una matriz y cada uno de los componentes está dividido por el número de casillas que se encuentra en la matriz, es decir, si tenemos una matriz de 3x3 el resultado será el siguiente:

83 80

74 72

63 61 61

52 48

41 39 39

31 26

20 14 13 8 4 0 0

10 20 30 40 50 60 70 80 90

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Unidades restantes de Scrum

Días Burndown Chart

Actual Ideal

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

PÁG. 113

1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9

Esta máscara se aplica a la imagen que se desea tratar. Usando el centro de la máscara como referencia, se le hace pasar por todos los pixeles, se multiplica ese valor, tanto en el centro como en los pixeles vecinos, y se usa el valor de la suma de los resultados como nuevo valor del pixel.

Para obtener este efecto se ha usado la siguiente línea de código.

TABLA 3.37: Código fuente – efecto blur

Fuente: Elaboración propia

Se ha decidido usar un filtro no muy agresivo ya que no se quiere distorsionar demasiado los caracteres para no dificultar el proceso del reconocimiento.

Una vez se ha aplicado el blur se procede al siguiente paso del preprocesado, la ecualización del histograma con el fin de mejorar el contraste de la imagen. Para ellos se usa el siguiente comando:

TABLA 3.38: Código fuente – ecualización del histograma

Fuente: Elaboración propia

El siguiente paso del preprocesado consta de una umbralización adaptativa, para ello se ha usado el siguiente código:

TABLA 3.39: Código fuente – umbralización adaptativa

Fuente: Elaboración propia

Esta función se usa para separar entre las letras y el fondo, optimizando así el posterior proceso de reconocimiento. Se ha elegido una umbralización adaptativa debido a que

Imgproc.blur(Input, Output, Kernel Size);

Imgproc.equalizeHist(input,output);

Imgproc.adaptiveThreshold(input,output,maxValue,adaptativeMethod,thre sholdType,BlockSize,C);

cc

Repositorio Institucional – UNAMBA - PERÚ

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

los resultados de una umbralización predeterminada no se ajusta a los niveles de iluminación cambiantes a lo largo del día. Lo que hace la función adaptativeThreshold() es calcular un umbral diferente para cada punto de la imagen y de esta manera ajustando el umbral a cada zona de la imagen.

Una vez realizada la umbralización se observa como los caracteres se han podido separar del fondo, pero también se detectan zonas de ruido que Tesseract puede confundir con caracteres, por lo que es necesario una limpieza de ruido. Para realizar este cometido se ha usado la función de apertura morfológica, usando las siguientes líneas de código:

TABLA 3.40: Código fuente – apertura morfológica

Fuente: Elaboración propia

La función de apertura morfológica consiste en aplicar dos operadores morfológicos elementales, conocidos como erosión y dilatación, para realzar las formas de los objetos.

Estos operadores elementales funcionan de la siguiente manera.

La primera función que se aplica es erode. Esta es una función de degradación, pues elimina los pixeles que sean más pequeños que el elemento geométrico determinado, en este caso un rectángulo de 2x2 pixeles, tamaño elegido debido a que es el máximo posible sin que se deteriore demasiado los caracteres. Esto debería eliminar la mayoría de los errores ya que se cuentan como pequeños puntos negros aleatorios.

La siguiente función aplicada es dilate, la función hermana de erode, que corrige los caracteres defectuosos que ha dejado erode. Dilate funciona prácticamente igual que erode, la única diferencia es que, al contrario de eliminar pixeles, los crea.

Con la suma de estas dos funciones se pueden eliminar errores de digitalización más pequeños que los caracteres manteniendo estos relativamente intactos.

Imgproc.erode(salida,salida,

Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT, new Size(2,2)));

Imgproc.dilate(salida,salida,Imgproc.getStructuringElement(Imgproc.CV_

SHAPE_RECT,new Size(2,2)));

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

PÁG. 115

En este punto del algoritmo, el texto ha sido digitalizado y tratado, por lo que solo queda la fase de reconocimiento. La llamada a la clase que se ocupa de contener el código de reconocimiento es la siguiente:

TABLA 3.41: Código fuente – motor Tesseract public String detectText(Bitmap bitmap) {

Log.d(TAG, "Inicializando TessBaseApi");

TessGestorDatos.initTessTrainedData(context);

TessBaseAPI tessBaseAPI = new TessBaseAPI();

String path = TessGestorDatos.getTesseractFolder();

Log.d(TAG, "Tess folder: " + path);

tessBaseAPI.setDebug(true);

tessBaseAPI.init(path, "spa");

tessBaseAPI.setPageSegMode(TessBaseAPI.OEM_TESSERACT_CUBE_COMBINED);

Log.d(TAG, "Finalización de la inicialización de TessMotor");

Log.d(TAG, "Ejecutar la inspección en mapa de bits");

tessBaseAPI.setImage(bitmap);

String inspection = tessBaseAPI.getUTF8Text();

Log.d(TAG, "Datos obtenidos: " + inspection);

tessBaseAPI.end();

System.gc();

return inspection;

}

Fuente: Elaboración propia

Primero se llama al constructor del algoritmo con la función TessBaseAPI y para poder inicializarlo se recurre a la línea tessBaseAPI.Init(). Los argumentos que necesita el algoritmo para inicializarse son dos, el primero es la dirección de la carpeta donde se encuentran los datos del entrenador del algoritmo, previamente copiados al dispositivo Android; el segundo es para indicarle a Tesseract que idioma se va a usar. Ahora se le tiene que indicar a Tesseract que archivo tiene que reconocer, para ello se usa la línea tessBaseAPI.setImage() que admite diferentes tipos de input, pudiendo ser imágenes en bitmap, archivos en formato pixa, que es el que usa la librería Leptonica.

Se decidió extraer el texto mediante la línea de código tessBaseAPI.getUTF8Text() en un String y luego mostrar dicho texto en un cuadro de dialogo.

Demo de la iteración 4

En la figura 3.20 se puede ver el demo de la iteración 4; que es el tratamiento de la imagen y obtención de la información.

cc

Repositorio Institucional – UNAMBA - PERÚ

“RECONOCIMIENTO ÓPTICO DE CARACTERES MEDIANTE UNA APLICACIÓN MÓVIL PARA LA REDUCCIÓN DE ERRORES DE LECTURAS EN LOS MEDIDORES ELÉCTRICOS DE ELECTRO SUR ESTE S.A.A. 2014”

CAPÍTULO III: PARTE EXPERIMENTAL

Figura 3.20: Demo de la iteración 4 Fuente: Elaboración propia