Alguna de las principales tareas que estamos llevando a cabo para nuestro proyecto están siendo la investigación y numerosas pruebas en el campo de la visión artificial, por lo que en esta entrada nos dedicaremos a enumerar los distintos métodos empleados para intentar realizar una detección correcta de las siluetas de las monedas antes de llegar a la solución final:
1) Detección sobre una imagen en blanco y negro:
Este método trata de transformar una imagen en escala de grises a blanco y negro, la idea era mantener con color negro únicamente las monedas y el resto de la imagen en blanco para así poder calcular los contornos con mayor facilidad.
Para su implementación es necesario establecer un umbral, se analizará la imagen pixel por pixel y en función de su color (si supera o no el umbral definido) se sobrescribirá cada pixel con un valor binario (blanco o negro). En este caso, el fondo sobre el que se encuentren las monedas es de vital importancia para su correcta detección. Se decidió colocarlas sobre un fondo blanco y establecer un umbral bastante alto, de esta manera el fondo se quedaría como está (blanco) y la moneda pasaría a ser mayormente negra (descartando los brillos que, obviamente aparecerían blancos).
Una vez implementado, se hicieron pruebas y aparecieron varios problemas: los contornos que se detectaban incluían las sombras que pudieran tener las monedas, por lo que la medida de los ejes para la identificación por tamaños sería una medida falsa. Además al cambiar a otro ambiente con distinto nivel de luz, el umbral dejaba de ser válido y era necesario ajustarlo manualmente. La idea para evitar este último problema era utilizar de alguna manera un umbral dinámico, el método de Otsu.
2) Detección mediante el método de Otsu:
Dicho método convierte una imagen en grises a blanco y negro calculando el umbral óptimo en cada momento a partir del histograma de la misma. De esta manera, se obtiene un umbral dinámico válido para cualquier situación de luminosidad. Sin embargo, seguía apareciendo el problema de la detección de sombras con otra complicación añadida, como el método calcula el histograma de la imagen, no puede haber en toda la imagen algún objeto oscuro, ya que esto provocaría un descenso del umbral y por lo tanto los pixeles correspondientes a las monedas se tomarían como blancos y la detección sería errónea.
Para evitar la complicación de las sombras, se optó por cambiar el fondo de la imagen a negro, de manera que las monedas quedarían como superficies blancas y las sombras pasarían a formar parte del fondo. Finalmente, se invertiría el valor de cada pixel de la imagen para volver a la situación anterior (monedas negras y fondo blanco).
Figura 1: Imagen binaria mediante el método Otsu
Figura 2: Imagen RGB resultante
Esta última modificación hizo que la detección fuera lo suficientemente buena para el clasificador por tamaños, pero estaba limitada a tener un fondo oscuro, por lo que se probaron otros métodos para poder hacer la detección independiente del fondo.
3) La transformada de Hough:
Este método se tuvo que implementar enteramente en C++ incluyendo el código en la carpeta jni del proyecto debido a que las librerías OpenCv para Java no incluían los métodos necesarios para su desarrollo.
Este método se propuso inicialmente para detectar líneas rectas, pero con el paso del tiempo se ha utilizado para la detección de todo tipo de figuras geométricas siempre que sus ecuaciones se puedan describir con unos cuantos parámetros. En nuestro caso se empezó con la detección de círculos por su mayor simplicidad, pudiendo después extrapolarlo a elipses si los resultados obtenidos eran buenos. Los parámetros a tener en cuenta en este caso son tres: la posición del centro de la circunferencia (valores x e y) y el tamaño del radio, que son los parámetros que se utilizarán para su representación y para hacer la clasificación.
Con este método evitaríamos además la necesidad de estar obligados a disponer de un fondo de un determinado tono.
Figura 3: Transformada de Hough
Figura 4: Problema de no-detección.
Una vez implementado, se hizo evidente el primer problema, el método requiere un cálculo computacional demasiado grande como para poder hacerlo a tiempo real en un dispositivo móvil. Aun así esto no supondría un problema, ya que se podrían hacer dos hebras en la aplicación: una en la que solo se mostraran las imágenes captadas y otra que sería la encargada de coger unos cuantos frames del flujo continuo de vídeo y hacer los cálculos sobre ellos, siendo este comportamiento totalmente transparente al usuario.
Tras varias pruebas e intentos de mejora descartamos la implementación del método para elipses, ya que aunque las detecciones que hacía eran muy precisas, un gran número de las monedas presentes en la imagen no eran detectadas y en ocasiones aparecían falsas monedas.
Nota: En todos los métodos anteriores es necesario incluir un pre-procesado de la imagen como por ejemplo un filtro gaussiano para eliminar ruido o una normalización de la escala de grises (de 0 a 255).
No hay comentarios:
Publicar un comentario