Nos planteamos como reto que el sistema de reconocimiento fuera lo más sencillo posible, y capaz de detectar las yemas de los dedos que aparecieran en cualquier ángulo en la imagen, y que el algoritmo solo necesitara de una iteración para conseguirlo. A priori puede parecer una tarea complicada, pero en nuestro mundo de 24x24 píxeles las cosas se simplifican.
Echemos un vistazo a algunas imágenes de manos ampliadas en las que aparezcan dedos, tal como las captura el PIC32:
Se ha marcado con rojo las zonas correspondientes a las yemas de los dedos. Puede apreciarse que en condiciones normales de funcionamiento las yemas de los dedos pueden contenerse en un cuadrado de 2x2 píxeles. De hecho, la condición de que la mano deba abarcar la pantalla entera antes de poder comenzar a realizar gestos para que el reconocimiento funcione también consigue que los dedos ocupen el tamaño deseado. Bajo esta premisa, basamos nuestro algoritmo de tracking de dedos en comparar cada zona de 4x4 píxeles de la imagen con un parche como este:
Nos recorremos la imagen de arriba a abajo y de izquierda a derecha, cogiendo los píxeles en grupos de 4x4. Si el grupo de 4x4 píxeles de la imagen tiene al menos 3 píxeles en negro lo comparamos con el parche mencionado, sumando un punto por cada píxel de la zona de la imagen que sea igual que el píxel correspondiente del parche. Una vez establecida la comparación, observamos la puntuación del grupo de píxeles. Hay 16 píxeles en cada grupo, y la puntuación indica cuántos de ellos eran iguales a los correspondientes píxeles del parche. Si la puntuación es 12 o más, consideramos que en ese grupo de píxeles de la imagen estaba la yema de un dedo, y marcamos un píxel negro en una imágen auxiliar en la posición del centro de ese grupo de píxeles, que consideramos como el píxel con coordenadas (1,1) situando el origen en la esquina superior izquierda.
Puede comprobarse que con un umbral de 12 píxeles los bordes de la imagen no son tenidos en cuenta, y la punta de la mayoría de estructuras protuberantes que no excedan los 2 píxeles de grosor es considerada como la yema de un dedo. Bajar el umbral a 11 implica que algunas zonas del borde son consideradas dedos, y subirlo a 13 o más hace que muchos dedos no se detecten. De hecho, es altamente improbable que un dedo de verdad obtenga una puntuación superior a 14.
En las dos imágenes anteriores se puede ver la puntuación de varias zonas de la imagen. En verde están los píxeles que suman puntuación, y en rojo los que no (oscuro = el pixel de la imagen era negro, claro = el píxel de la imagen era blanco). En la imagen de la derecha se ve cómo las 3 yemas de los dedos de la imagen se reconocen perfectamente. En la imagen izquierda se ve como los bordes se ignoran y el por qué de no realizar una comparación si la zona de la imagen tenía menos de 3 píxeles en negro (cualquier trozo de fondo blanco tiene puntuación 12). También puede apreciarse cómo el algoritmo no es perfecto, y aparte de las yemas también detecta algunas zonas de la imagen correspondientes a zonas delgadas y largas de la imagen, que en la mayoría de ocasiones pertenecen a un dedo.
El resultado del algoritmo es por lo general una imagen auxiliar con varios grupos de unos pocos
(por lo general 1, 2 ó 3) píxeles negros muy juntos, situados en zonas cercanas a donde es muy probable que esté la yema de un dedo. El paso siguiente es hacer algo para tratar de quedarse con un punto de cada grupo de píxeles, en concreto aquel que esté más arriba y a la izquierda. Para ello pasamos un filtro por la imagen que, para cada píxel negro de la imagen auxiliar, busca si hay algún otro píxel a su alrededor tal como muestra este diagrama donde el píxel negro es el que nos interesa, y el resto de píxeles son aquellas posiciones donde se comprueba si hay otro píxel negro:
Si se encuentra otro píxel negro en esa zona, el píxel de interés se borra. En nuestra implementación final, el filtro se pasa a la vez que se va pasando el parche por la imágen, antes de marcar un píxel como posible nueva yema dactilar en la imagen auxiliar (en vez de primero sacar y guardar todos los posibles puntos y luego filtrar y borrar los necesarios, aplciamos el filtro a cada nuevo punto candidato y si no lo pasa, no lo guardamos). Dado que el parche y por consiguiente el filtro se pasan de izquierda a derecha y de arriba a abajo, conseguiremos que sólo sobreviva aquel píxel de cada grupo que esté más arriba a la izquierda. El área de exclusión del filtro se diseñó a partir de observaciones de los resultados del algoritmo sin filtrar, y se obtienen muy buenos resultados, dando lugar en la inmensa mayoría de los casos a imágenes auxiliares con tantos píxeles negros como dedos hubiera en la imágen original, situados en aquellas posiciones donde se encontraban sus yemas.
Y todo esto se realiza en menos de 1 milisegundo.




No hay comentarios:
Publicar un comentario