0% encontró este documento útil (0 votos)
3 vistas

Programación Python

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
3 vistas

Programación Python

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 8

UNIVERSIDAD TECNOLÓGICA DE TULA-TEPEJI

Carrera: Ingeniería en Mecatrónica

Asignatura: Modelo de Programación Avanzada

Profesor: Mtra. Caridad Montiel Hernández

“REPORTE DE PRÁCTICA: Mini proyecto

Unidad V

Alumnos:
Chayan Omar Cruz Vidaure
Eduardo Yair Martinez Montoya
Jose Manuel Briceño Resendiz
Brandon Alexis Gonzalez Ramirez
Jose Manuel Estrada Mendoza

Grupo: 9 IMC-G3

Tula de Allende, Hidalgo a 8 de Agosto del 2024


introducción
Este código de Python es una implementación de un sistema de reconocimiento de gestos
de mano que utiliza las potentes bibliotecas MediaPipe y OpenCV. El objetivo principal del
código es detectar y hacer un seguimiento preciso de las manos en tiempo real, determinar
cuántos dedos están levantados en cada mano y enviar esta información a través de una
conexión serial.
El reconocimiento de gestos de mano es una tecnología cada vez más popular en el campo
de la interacción hombre-máquina, ya que permite a los usuarios interactuar de manera
natural y sin necesidad de utilizar dispositivos físicos como controles remotos o teclados.
Esta aplicación demuestra cómo se puede aprovechar esta tecnología para crear interfaces
de usuario innovadoras..
Además de las funcionalidades de control de dispositivos, este código también podría ser
utilizado en una amplia gama de aplicaciones, como juegos interactivos, sistemas de
asistencia para personas con discapacidades o incluso en el campo de la realidad virtual y
aumentada. Las posibilidades son realmente emocionantes.
Explicacion del codigo
1. Importación de Librerías
python
from math import acos, degrees
import mediapipe as mp
import numpy as np
import serial
import time
import cv2

math: Para cálculos matemáticos (en este caso, calcular ángulos).


mediapipe: Para la detección de manos y seguimiento de medios de forma fácil y eficiente.
numpy: Para operaciones con matrices y cálculos numéricos.
serial: Para la comunicación con dispositivos a través de un puerto serie.
time: Para controlar el tiempo y las pausas.
cv2: La biblioteca OpenCV para la manipulación de visión por computadora.

2. Definición de Funciones
def palm_centroid(coordinates_list):
coordinates = np.array(coordinates_list)
centroid = np.mean(coordinates, axis=0)
centroid = int(centroid[0]), int(centroid[1])
return centroid

Esta función calcula el centroide de la palma. Toma una lista de coordenadas (puntos de la
palma) y devuelve su promedio, que representa el centro.

3. Configuración del Puerto Serie


ser = serial.Serial('COM4', 9600, timeout=1)
time.sleep(2)

Aquí se inicia la comunicación en serie por el puerto COM4 a una velocidad de 9600
baudios. Se espera 2 segundos para permitir que la conexión se establezca.

4. Inicialización de MediaPipe y OpenCV


mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
Inicializa las utilidades de dibujo y la solución de manos de MediaPipe.
Captura el video de la cámara. 0 se refiere a la cámara predeterminada.

5. Definición de Puntos de los Dedos y Palma


# Pulgar
thumb_points = [1, 2, 3]
# Índice, medio, anular y meñique
palm_points = [0, 1, 2, 5, 9, 13, 17]
fingertips_points = [8, 12, 16, 20]
fingerbase_points = [6, 10, 14, 18]

Define los índices de los puntos de interés en la mano, como el pulgar, los dedos y la palma.

6. Bucle Principal para Procesar Video


with mp_hands.Hands(...) as hands:
while True:
ret, frame = cap.read()
if ret == False:
break

Se abre un contexto para usar el modelo de manos y se inicia un bucle infinito para
procesar cada cuadro del video.

7. Procesamiento del Cuadro de Video


frame = cv2.flip(frame, 1)
height, width, _ = frame.shape
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hands.process(frame_rgb)

Se voltea el marco horizontalmente para una mejor interacción, se obtiene su altura y


ancho, y se convierte a formato RGB antes de procesarlo con el modelo de manos.

8.Detección de Manos y Coordenadas


if results.multi_hand_landmarks:
coordinates_thumb = []
coordinates_palm = []
coordinates_ft = []
coordinates_fb = []

for hand_landmarks in results.multi_hand_landmarks:


# Obtener coordenadas de cada punto de interés

Si se detectan manos, se extraen las coordenadas de los puntos de interés (pulgar, palma, y
extremos de los dedos) en listas.

9. Cálculo del Ángulo del Pulgar


# Cálculo del ángulo del pulgar
p1 = np.array(coordinates_thumb[0])
p2 = np.array(coordinates_thumb[1])
p3 = np.array(coordinates_thumb[2])
l1 = np.linalg.norm(p2 - p3)
l2 = np.linalg.norm(p1 - p3)
l3 = np.linalg.norm(p1 - p2)

angle = degrees(acos((l1**2 + l3**2 - l2**2) / (2 * l1 * l3)))


Se obtienen las posiciones del pulgar y se calcula el ángulo entre los segmentos del mismo
utilizando la ley de cosenos.

10. Contando los Dedos Elevados


# Contar los dedos levantados
nx, ny = palm_centroid(coordinates_palm)
...
fingers_count = str(np.count_nonzero(fingers == True))

Se determina qué dedos están levantados comparando las distancias desde el centro de la
palma a las puntas y bases de los dedos. Luego se cuenta cuántos dedos están levantados.

11.Envío de Datos a Través de Serial


if fingers_count == '0':
print('Cero')
ser.write(b'f')
...
elif fingers_count == '5':
print('Cinco')
ser.write(b'e')

Dependiendo de cuántos dedos están levantados, se envía un carácter específico a través


del puerto serie.

12. Visualización de los Resultados

mp_drawing.draw_landmarks(...)

cv2.rectangle(frame, (0, 0), (80, 80), (255, 0, 0), -1)


cv2.putText(frame, fingers_count, (15, 65), 1, 5, (255, 255, 255), 2)
cv2.imshow('Frame', frame)

Dibuja los puntos y conexiones de la mano en el video y muestra la cantidad de dedos


levantados en la esquina superior izquierda.

13. Finalización del Programa


cap.release()
cv2.destroyAllWindows()
ser.close()

Libera el objeto de captura de video, cierra todas las ventanas de OpenCV y finaliza la
conexión serie.
Descripción de sensores y actuadores
Un servomotor es un tipo de motor eléctrico diseñado para ofrecer un control preciso de la
posición, la velocidad y el torque. Se utiliza comúnmente en aplicaciones que requieren
movimientos controlados y precisos, como en robótica, sistemas de automatización,
aeronáutica y en el control de sistemas mecánicos.

Diagrama de conexión

Pruebas de funcionamiento
reflexión
A medida que hemos trabajado en el desarrollo de este sistema de reconocimiento de
gestos de mano, hemos adquirido valiosos conocimientos y habilidades que sin duda serán
útiles en futuros proyectos.
En primer lugar, hemos profundizado nuestro entendimiento de la visión por computadora y
el procesamiento de imágenes en tiempo real. Trabajar con las bibliotecas MediaPipe y
OpenCV nos permitió familiarizarnos con técnicas avanzadas de detección y seguimiento de
objetos, lo cual es fundamental para lograr un reconocimiento preciso de los movimientos
de la mano.
Además, aprendimos a integrar diferentes tecnologías de manera efectiva, combinando el
análisis de imágenes con la comunicación serial. Esto nos ha brindado una perspectiva más
amplia sobre cómo diseñar sistemas que puedan interactuar con dispositivos externos,
abriendo nuevas posibilidades para el control de interfaces y la automatización.
Quizás lo más destacado ha sido comprender la importancia de la interacción natural entre
humanos y máquinas. Al explorar el reconocimiento de gestos de mano, hemos adquirido
una apreciación más profunda de cómo las interfaces basadas en movimientos corporales
pueden mejorar la experiencia de usuario y facilitar tareas complejas.
En términos de la importancia de este mini proyecto, consideramos que ha sido una
oportunidad valiosa para poner en práctica nuestras habilidades de programación,
resolución de problemas y pensamiento creativo. Al enfrentarnos a desafíos técnicos y de
diseño, desarrollamos una mayor capacidad para abordar proyectos complejos de manera
sistemática y efectiva.

También podría gustarte