2) Detección de Manos y Coordenadas- Bases para el control de Proyectos con Visión Artificial 🖐️
Acerca del Tutorial
Este vídeo te voy a explicar conceptos y códigos que te permitirán entender como se realiza la detección de coordenadas de las manos utilizando MediaPipe y posteriormente verás la utilidad de conocer estos conceptos, cuando se inicie interactuando con Arduino.
Enlaces:
Codigo Python – Detección de Manos
import cv2
import mediapipe as mp
# Inicializa MediaPipe Drawing Utilities para dibujar las manos
mp_drawing = mp.solutions.drawing_utils
# Inicializa MediaPipe Hands
mp_hands = mp.solutions.hands
# Configura los parámetros de detección de manos
hands = mp_hands.Hands(
static_image_mode=False, # Modo de video en tiempo real
max_num_hands=1, # Detectar hasta 2 manos
min_detection_confidence=0.5, # Umbral de confianza de detección
)
# Iniciar captura de video
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
print("Ignorando frame vacío.")
break
# voltea la imagen horizontalmente - Flip
# realiza la conversion BGR a RGB
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
# Procesa la imagen y detecta las manos
results = hands.process(image)
# print("multi_handedness",results.multi_handedness)
# print("multi_hand_landmarks",results.multi_hand_landmarks)
# Convierte la imagen a BGR para OpenCV
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# Dibuja las manos detectadas
"""
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS,
mp_drawing.DrawingSpec(color=(0,255,0),thickness=4,circle_radius=5),
mp_drawing.DrawingSpec(color=(255,0,0),thickness=4)
)
"""
"""
height, width, _ = image.shape
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
thumb_tip_landmark = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
thumb_tip_x = thumb_tip_landmark.x
thumb_tip_y = thumb_tip_landmark.y
thumb_tip_z = thumb_tip_landmark.z
#print(f"Pulgar Coordenadas - X: {thumb_tip_x}, Y: {thumb_tip_y}, Z: {thumb_tip_z}")
thumb_tip_x_int = int(thumb_tip_x*width)
thumb_tip_y_int = int(thumb_tip_y*height)
thumb_tip_z_int = int(thumb_tip_y*200)
print(f"Pulgar Coordenadas - X: {thumb_tip_x_int}, Y: {thumb_tip_y_int}, Z: {thumb_tip_z_int}")
"""
height, width, _ = image.shape
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
thumb_tip_landmark = hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP]
idx_fin_tip_landmark = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
thumb_tip_x = thumb_tip_landmark.x
thumb_tip_y = thumb_tip_landmark.y
idx_fin_tip_x = idx_fin_tip_landmark.x
idx_fin_tip_y = idx_fin_tip_landmark.y
thumb_tip_x_int = int(thumb_tip_x*width)
thumb_tip_y_int = int(thumb_tip_y*height)
idx_fin_tip_x_int = int(idx_fin_tip_x*width)
idx_fin_tip_y_int = int(idx_fin_tip_y*height)
cv2.circle(image, (thumb_tip_x_int,thumb_tip_y_int), 10, (255,0,0),5)
cv2.circle(image, (idx_fin_tip_x_int,idx_fin_tip_y_int), 10, (0,255,0),5)
resta_coordenadas = abs(idx_fin_tip_y_int - thumb_tip_y_int)
print(f"resta_coordenadas: {resta_coordenadas}")
# Mostrar la imagen
cv2.imshow('Detector de Manos', image)
if cv2.waitKey(5) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()