Interfaz gráfica que utiliza un módulo de visión artificial para detectar manos en tiempo real a través de una webcam. Elige entre las diferentes opciones haciendo gestos con las manos
En este proyecto utilizaremos una heladería como ejemplo para crear un módulo de visión artificial que tramita sus pedidos escaneando en tiempo real los gestos que realiza el cliente con las manos.
Cuando el cliente hace el gesto correspondiente a cualquiera de las 3 opciones, se genera una elipse alrededor de la opción seleccionada que representa el tiempo de confirmación, cuando la elipse se completa la opción se selecciona y la interfaz acctualiza de pantalla
Seleccionar opción 1 | Seleccionar opción 3 | Seleccionar opción 2 |
---|---|---|
Esta dividida en 3 bloques de imágenes que se superponen entre sí dependiendo de las elecciones del cliente:
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.
Código | Gesto |
---|---|
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).