See discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/261062347
Trabajo Final Curso Procesamiento de Imágenes con OpenCV Article · March 2014
CITATIONS
READS
0
2,721
1 author:
Jose Obdulio Vera La Universidad Nacional Arturo Jauretche 1 PUBLICATION 0 CITATIONS
SEE PROFILE
All content following this page was uploaded by Jose Obdulio Vera on Vera on 25 March 2014. The user has requested enhancement of the downloaded file.
TRABAJO FINAL PARA APROBACION DEL CURSO DE POSTGRADO: INTRODUCCION AL PROCESAMIENTO DIGITAL DE IMAGENES. UN ENFOQUE TEORICO - PRACTICO UTILIZANDO OPEN CV. FACULTAD DE INGENIERÍA. 2013. Autor: Vera, José Obdulio. Tema: Detección de billetes con OpenCV en Android.
Objetivo Este trabajo consiste en el armado de una aplicación de Android capaz de detectar billetes de Pesos Argentinos utilizando OpenCV y los algoritmos de detección de Features (SURF, SIFT, ORB).
Introducción Para cumplir los objetivos el trabajo se dividió en dos etapas: •
•
realización de una aplicación Desktop (Windows en este caso) que permita evaluar los diferentes algoritmos para la detección de features en imágenes y detectar diferentes acercamientos para la resolución del problema. Una vez evaluado el algoritmo a utilizar, se procederá a trasladarlo a un sistema Android. En este caso se evaluará la performance del sistema entero.
Desarrollo El proceso de detección de billetes en imágenes pertenece al área del procesamiento de imágenes denominado “Feature Detection”. Actualmente existen varios algoritmos y todos se basan en detectar puntos de interés (“keypoint detection”) en las imágenes que sean invariantes al escalamiento, la rotación y los colores. Entre los mas reconocidos se pueden nombrar: SURF, SIFT y ORB.
Una vez obtenidos los puntos de interés, se procede a darle una métrica o parámetros únicos que permita reconocerlos luego (“keypoint description”). Los algoritmos SURF, SIFT y ORB proveen descriptores para los puntos. OpenCV implementa los tres algoritmos anteriormente nombrados. Todos usando la misma interface de programación (API), permitiendo de esta manera, intercambiar los métodos en forma transparente, preservando las propiedades de los sistemas Orientados a Objetos. OpenCV es un Framework enteramente escrito para el lenguaje C++, compatible con los compiladores GCC (multiplataforma), Ms Visual C (Windows) y Objetive-C (MacOSX). Además, existen “wrappers” (envoltorios) que permite usarlos en otros lenguajes tales como Python, Java, C#, etc. Estos wrappers permiten el intercambio de mensajes y datos entre C++ y el lenguaje final, siendo costoso en términos de rendimiento de la aplicación esta doble conversión ida y vuelta. En el caso de OpenCV para Android, el wrapper se lo denomina JNI. En la segunda parte del desarrollo se hablara más detallado JNI.
Desarrollo Primera Parte En esta etapa se pretende desarrollar una aplicación Desktop que permita evaluar los algoritmos OpenCV de detección de features, para luego pasar a Android. El IDE (Integrated Development Environment) utilizado es QT 5. QT nació como framework multiplataforma para realización de programas visuales en C++ tanto para móviles como para desktop. Actualmente genera código para plataformas Windows, Linux, Unix, MacOSX, Android, iOS, Blackberry y Linux embebidos. QT es software libre y de libre distribución sin royalties. También existen versiones pagas de soporte. La lógica del programa Desktop desarrollado es el siguiente:
Comentarios del código:
Funcion “buscarMatch”, es la encargada de hacer la comparación entre los billetes y la imagen obtenida a través de la webcam:
Conclusión Primera Parte En función de mis experiencias en una notebook Core i5, era más rápido el detector ORB. El SURF bajaba demasiado los frames por segundo que se podían procesar. Se puede aumentar el rendimiento bajando la resolución de captura de la webcam, pero a costa de perder nitidez y claridad. En cuanto a detección positiva de billetes los dos algoritmos se parecían. Se suelen confundir un billete de 100 por uno de 50. Tal vez aumentando la resolución de las imágenes de los billetes se logre mejores resultados.
Desarrollo Segunda Parte Habiendo probado los algoritmos y notado que con una notebook potente el procesamiento era intenso, finalmente NO implemente la solución en Android. La decisión se baso en que no tengo un dispositivo potente con TEGRA (tengo una tablet mas viejita), que es lo que se recomienda para estos casos. Buscando bibliografía en internet muchas de las soluciones de reconocimiento de billetes se basa en tomar una captura por la webcam, se la sube a un servidor (sitio) de Internet y éste se encarga de hacer el procesamiento pesado para luego solo devolver los valores de billetes. Este caso es fácil de desarrollar debido a que con el código realizado para Desktop (comentado en la primer parte) solo hay que cambiar el origen de la imagen y compilarlo para la plataforma deseada (Windows o Linux). El encargado de realizar la interconexión entre el móvil y la aplicación seria un servidor web, típicamente Apache, con un script pequeño en PHP. Nada de otro mundo ;) Para no quedar inconclusa la parte del desarrollo de OpenCv para dispositivos Android, realice el reconocimiento de monedas utilizando el algoritmo de Hough de detección de círculos. Al principio idee la aplicación para detectar las monedas en función de los radios (diámetros) imponiendo como condición que haya siempre en la imagen una moneda de 10 centavos. La moneda de 10ctvos la utilizaría como referencia de radio para las demás monedas, sin embargo después me di cuenta de que las monedas de 25, 50 y 1 peso son casi de igual diámetro y por lo tanto invalida cualquier diferenciación (detección). Finalmente decidí que la aplicación final solo realiza la detección de círculos mediante el algoritmo de Hough. La interacción entre OpenCV (en lenguaje C++) y Android (que trabaja utilizando una Java Virtual Machine), es realizada a través de lo que se llama un “wrapper”. El nombre en este caso del wrapper es JNI. Java Native Interface (JNI) es un framework de programación que permite que un programa escrito en Java ejecutado en la máquina virtual java (JVM) pueda interactuar con programas escritos en otros lenguajes como C, C++ y ensamblador [Wikipedia].
Cada función (o equivalente) de OpenCV en C++ tiene su “traducción” en JAVA. La implementación es de tal manera, que, cuando se ejecuta una función en JAVA de la librería de OpenCV, JNI hace la comunicación con C++, ejecuta el código OpenCV en C++ correspondiente y devuelve, a través de la misma comunicación, los datos resultantes. Es importante notar que estos datos de ida y vuelta casi siempre son matrices de imágenes y por lo tanto hace disminuir mucho el rendimiento de una aplicación en Android. Debido a esto último, la recomendación es utilizar celulares/tablets de varios cores o con procesador gráfico Tegra. También, a raíz de la “traducción” JNI, siempre se recomienda hacer un SOLO llamado desde JAVA a una función creada ad-hoc que realice la mayor cantidad de procesamiento de OpenCV en C++ y no realizar en JAVA varios llamados a diferentes funciones en C++.
Conclusiones Finales Debo nombrar dos consideraciones importantes a la hora de usar los algoritmos SURF/SIFT/ORB: es que son de cálculo intensivo • y las características de las imágenes a detectar deben ser únicas y bien • diferenciadas. Como decía más arriba, confundía billetes de 50 y 100 por ser similares. Unos de los futuros pasos a investigar es la del desarrollo de un servidor que albergue el programa principal de reconocimiento de billetes y que luego desde cualquier artefacto (PC, celular, tablet, reloj con webcam, anteojos Google, etc) envíe la imagen a procesar vía Internet y devuelva el resultado como simple texto. Esto tiene dos ventajas: la aplicación servidora puede albergar billetes de varios países y hacer el • reconocimiento, permitiendo actualizar el algoritmo en forma transparente sin que tenga que modificarse los clientes la aplicación de los clientes sería mucho más liviana, ágil y con mejor • performance. Otras líneas de investigación me las guardo para uso propio :P