Lee la mano: gestos con landmarks
Un modelo de manos te da 21 puntos. Con cuatro reglas de geometría los conviertes en «palma», «puño», «victoria» o «pulgar», sin entrenar nada y sin cámara.
HANDS tiene los 21 puntos de cuatro fotos nuestras (palma abierta, puño, uve de victoria y pulgar arriba), tal como los devolvió MediaPipe. Cada punto es [x, y] entre 0 y 1. Escribe cuatro funciones:
fingerExtended(lm, tip, pip): un dedo está estirado si su punta queda más lejos de la muñeca (lm[0]) que su segunda articulación. Compara distancias con dist.
thumbExtended(lm): el pulgar está fuera si la distancia de su punta (lm[4]) a la muñeca supera 1.1 veces el tamaño de la palma, que mides de la muñeca a lm[9].
fingersUp(lm): [pulgar, índice, corazón, anular, meñique], cinco booleanos, usando FINGERS para los cuatro dedos.
classify(lm): "palma" con los cinco fuera, "puño" con ninguno, "victoria" con solo índice y corazón, "pulgar" con solo el pulgar; cualquier otra combinación, "otro". La vista previa dibuja el esqueleto y tu etiqueta.
Retos 0/5
- Un dedo estirado y uno doblado
- El pulgar está fuera en «pulgar» y «palma», dentro en «puño»
- Cinco booleanos por mano: palma y victoria
- Las cuatro fotos reciben su nombre
- Lo que no tiene nombre es «otro»
function fingerExtended(lm, tip, pip) {
// true si la punta queda más lejos de la muñeca (lm[0]) que la segunda articulación
return false;
}
function thumbExtended(lm) {
// la punta (lm[4]) está a más de 1,1 tamaños de palma (muñeca a lm[9]) de la muñeca
return false;
}
function fingersUp(lm) {
// [pulgar, índice, corazón, anular, meñique]
return [false, false, false, false, false];
}
function classify(lm) {
// 'palma', 'puño', 'victoria', 'pulgar' u 'otro'
return 'otro';
}
console.log(Object.keys(HANDS).map((k) => k + ': ' + classify(HANDS[k].landmarks)).join(', '));La idea
Un modelo de manos no te dice «esto es un pulgar arriba». Te da 21 puntos con sus coordenadas, y el gesto lo decides tú con reglas que puedes leer. Esa separación es útil: el modelo (pesado, entrenado por otros) hace la percepción; la lógica de negocio (ligera, tuya) decide, y se prueba sin cámara, con un fichero de puntos.
Las reglas usan cocientes, no distancias absolutas: una mano cerca de la cámara mide el doble que una lejos, pero la punta del índice sigue estando más lejos de la muñeca que su segunda articulación. Por eso el umbral del pulgar se expresa en «tamaños de palma».
Lo que medimos: MediaPipe Hand Landmarker (modelo float16, 7,8 MB, Apache-2.0) tardó entre 16 y 38 ms por foto en la CPU del DGX Spark el 18-10-2026, y acertó la mano (izquierda o derecha) en las cuatro imágenes, que generamos con FLUX.1-schnell porque no tenemos fotos de manos con permiso de publicación.
Esta web bloquea la cámara y el micrófono para todas sus páginas; por eso el ejercicio parte de puntos ya calculados. Si llevas esto a producción, mantenlo en el dispositivo: un vídeo de manos es un dato personal, y no hace falta que salga de la pantalla.
Hazlo en tu máquina
Con Python y NumPy, sobre el JSON de puntos de este ejercicio (CC BY 4.0):
curl -O https://vorluxai.com/data/labs/gestos-landmarks.json
python3 -c "
import json, numpy as np
hands = json.load(open('gestos-landmarks.json'))
for name, h in hands.items():
if name == 'about': continue
lm = np.array(h['landmarks'])[:, :2]
d = lambda i, j: np.linalg.norm(lm[i] - lm[j])
up = [bool(d(4, 0) > 1.1 * d(0, 9))] + [bool(d(t, 0) > d(p, 0)) for t, p in [(8, 6), (12, 10), (16, 14), (20, 18)]]
print(name, up)
" Para profundizar: la referencia de MediaPipe (en inglés) →
¿Esto en producción, con tus datos? Hablemos 15 minutos →