Visión Artifical

¿De donde nació la idea?

Como muchos otros proyectos de esta web, este proyecto no es más que una práctica de la teconología que necesitaré utilizar en proyectos futuros. En este caso utilizaré el módulo de visión artificial HandTrackingModule de la librería de python cvzone para detectar manos en tiempo real. Además también crearé una interfaz gráfica mediante imágenes creadas en PowerPoint con un reproductor de la webcam en tiempo real.

Los conocimientos en visión artificial y reconocimiento de objetos en tiempo real y la interfaz gráfica con el reproductor también en tiempo real son fundamentales para algunos de los módulos del proyecto de Reconocimiento óptico de caracteres en tiempo real y análisis de datos de los partidos de clubes de esports en FIFA 23 que explicaré más adelante en esta web.

¿Cómo funciona?

- Interfaz gráfica:

En cuanto a la interfaz gráfica, he creado una serie de imágenes que se superponen entre sí dependiendo de la elección seleccionada y se pueden dividir en 3 bloques:

- Fondo

Es la base de la interfaz gráfica, en el cuadrado grande se mostrará el reproductor de la webcam en tiempo real, en el hueco vacío de la derecha se mostraran las diferentes pantallas con las opciones y en los círculos inferiores se mostrarán los iconos de cada selección.

- Opciones

Indican las opciones disponibles, en la primera imagen son sólo 2 mientras que en las siguientes son 3. Además la segunda y la tercera imagen dependen de la primera elección y la última muestra únicamente que el pedido se ha realizado con éxito. Todas estas variaciones hay que tenerlas en cuenta a la hora de crear la lógica del código

- Iconos

Indican las selecciones hechas, igual que con las opciones, el segundo icono depende de la primera elección y por lo tanto habrá que aplicar esa lógica en el código

Evolución paso a paso de la interfaz gráfica:

1. Desliza para ver el cambio
Fondo
Opción 1

A la izquierda tenemos la imagen de fondo y a la derecha la imagen de el programa ejecutado, con el reproductor y la primera opción

2. Desliza para ver el cambio
Opción 1
Opción 2

A la izquierda tenemos la opción 1 y a la derecha la opción 2 con el icono de la primera selección 

3. Desliza para ver el cambio
Opción 2
Opción 3

A la izquierda tenemos la opción 2 con el icono de la primera selección  y a la derecha la opción 3 con los iconos de las 2 primeras selecciones 

4. Desliza para ver el cambio
Opción 3
Final

A la izquierda tenemos la opción 3 con los iconos de las 2 primeras selecciones y a la derecha la última pantalla que indica que el pedido se ha realizado

- Lógica del código:

Puedes ver la explicación de cada sección dentro de el propio código subido a Github

En cuanto a la lógica del código, en primer lugar la imagen de la webcam se captura mediante el método videoCapture() de la librería de python opencv (cv2), este método básicamente lo que hace es capturar la imagen de la webcam en un formato de imagen. Para convertir esta imagen en un vídeo en tiempo real creamos un bucle infinito que muestre imágenes cada 1 milisegundo, es decir, le pedimos a nuestro ordenador que muestre el número máximo de frames por segundo que pueda. 

Una vez tenemos este reproductor creado, lo ubicamos en el cuadrado de la interfaz gráfica y añadimos también la primera pantalla de opción y ya tenemos la interfaz gráfica lista para aplicar la visión artificial.

Para detectar las manos y los gestos que nos servirán de referencia para elegir entre una opción u otra utilizaremos el módulo de visión artificial HandTrackingModule de la librería de python cvzone

Con el método findHands() de la clase detector y con la imagen de la webcam, el número máximo de manos simultáneas que queremos detectar y el índice de confianza como inputs detectaremos la mano que captura la webcam y sus 20 puntos de referencia.

Finalmente el método fingersUp() también de la clase detector, con la mano detectada en el método anterior como input, deducirá si cada uno de los dedos está levantado o no dependiendo de la posición de sus puntos de referencia

Sabiendo si cada uno de los dedos está levantado (1 si lo está, 0 si no lo está) podemos empezar a construir los condicionales que formarán la lógica de nuestro código.

Por lo tanto, si todos los dedos están bajados (0) y el dedo índice esta levantado (1) quiere decir que estamos haciendo el gesto «1» con la mano y por lo tanto estamos seleccionando la opción 1, si también esta levantado el dedo corazón estaremos haciendo el gesto «2» y eligiendo la opción 2 y si están levantados los dedos índice, corazón y anular y el resto bajados estaremos haciendo el gesto «3» y eligiendo la tercera opción.

fingers1 = [pulgar, índice, corazón, anular, meñique]

if fingers1 == [0,1,0,0,0]:  

                    selección = 1
if fingers1 == [0,1,1,0,0]
 
                    selección = 2
if fingers1 == [0,1,1,1,0]
 
                    selección = 3

Teniendo ya la selección detectada en tiempo real guardada en una variable lo único que nos queda por hacer es añadir un tiempo de confirmación para que la opción no se elija instantáneamente al hacer cualquiera de los 3 gestos. 

Para generar este tiempo de confirmación añadiremos un contador que incrementará su valor en cada frame que se detecte cualquiera de los 3 gestos de modo que si en algún momento dejamos de hacer el gesto o cambiamos de gesto este contador se reiniciará.

Por lo tanto si le indicamos al programa que cuando el contador llegue a 80 se seleccione la opción correspondiente al gesto, le estaremos diciendo que, a una frecuencia de 20 fps, el tiempo de confirmación serán 4 segundos. (80 frames contados a 20 frames por segundo)

Por último representaremos este tiempo de confirmación en la interfaz gráfica mediante una elipse que generaremos a través del método ellipse() de la librería de python opencv. Simplemente debemos ajustar algunos parámetros de la elipse como la posición del centro de la circunferencia (el centro de la opción seleccionada), el radio horizontal y vertical de la elipse, el grosor, el color y su valor, que será proporcional al contador mencionado anteriormente (tiempo de confirmación).

Seguir viendo proyectos de...

Desarrollo Python

Ciencia de datos

Ingenieria de datos