William Zhang2026-09-28

Juego de puzzle 3×3 con pellizco a una mano y MediaPipe Hand Landmarker

Detección en tiempo real de 21 puntos clave de la mano y el estado de pellizco de una sola mano con el modelo MediaPipe Tasks Hand Landmarker. "Pellizco de pulgar + índice" se asigna directamente a la semántica de "arrastrar / soltar": el jugador dibuja el ROI y completa las acciones del puzzle mediante gestos de pellizco frente a la cámara; toda la cadena de interacción funciona sin teclado, ratón ni pantalla táctil.

CVHand TrackingGithub

Juego de puzzle con pellizco a una mano basado en reComputer-RK / Docker / RKNN / YOLO

https://github.com/doublelf/puzzle_game


Descripción del proyecto

Este proyecto es un puzzle puro de 217 líneas: gesture.py detecta el pellizco → drawing.RectDrawer recoge dos rectángulos → puzzle_game.PuzzleGame los mezcla en un 3×3 → la misma máquina de estados usa el pellizco para arrastrar el puzzle.


Inicio rápido

1. Clonar el repositorio y entrar al directorio

bash
git clone https://github.com/doublelf/puzzle_game 
cd puzzle_game

2. Instalar dependencias

bash
pip install -r requirements.txt

requirements.txt fija cuatro dependencias:

text
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.0

3. Iniciar el juego

bash
python main.py                  # cámara 0 por defecto, volteo horizontal activado
python main.py --cam 1          # usa la 2.ª cámara
python main.py --no-flip        # desactiva el volteo horizontal
python main.py --no-landmarks   # desactiva la superposición de puntos clave (activada por defecto)
python main.py --hide-trails    # desactiva los rastros de gestos (activados por defecto)

Al iniciar verás primero la pantalla de menú "Pinch-Puzzle"; pulsa cualquier tecla para entrar al juego.

4. Controles

FaseEntrada del jugadorRespuesta del programa
DRAWPellizco de pulgar + índice arrastrando → soltar, dibuja el primer rectánguloRectángulo relleno verde semitransparente, esquina superior izquierda Draw rectangles: 1/2
DRAWRepetir una vez para dibujar el segundo rectángulo2/2 → READY - generating puzzle..., pasa automáticamente a PLAY
PLAYPellizco para seleccionar la pieza del puzzle más cercana (borde dorado pulsante)Toast Tile #N selected + sugerencia drag toward blank tile
PLAYArrastrar la punta del dedo cerca de una casilla en blanco adyacenteAmbas piezas parpadean en verde + Toast SWAP!, moves se incrementa
PLAYLas 9 piezas en su sitioEstallido central de 80 partículas arcoíris + Toast grande SOLVED!
En cualquier momentoR reinicia el puzzle actualVuelve a la fase DRAW, rectángulos borrados
En cualquier momentoM vuelve al menúLa cámara sigue capturando, solo se cierra el bucle del juego
En cualquier momentoESC saleLibera la cámara, cierra MediaPipe, destruye la ventana

Ejecución sin cámara

El recomputer-rk3576-devkit se distribuye sin una cámara USB conectada por defecto. Este proyecto incluye tres utilidades para poder ejecutarlo de extremo a extremo incluso sin cámara:

tools/verify_all.py — suite de verificación de 8 pasos

bash
cd /home/seeed/hand/puzzle_game
python3 -m tools.verify_all

Imprime cada uno:

  • Importación de módulos (gesture / drawing / puzzle_game / overlay / utils)
  • Funciones geométricas y de texto de utils
  • RectDrawer.update(None) no lanza excepciones
  • shuffle_solvable produce un tablero válido
  • MediaPipe Hand Landmarker real cargado en aarch64 (XNNPACK delegate, ~110 ms de calentamiento)
  • HandOverlay.add_event + renderizado
  • La pipeline sintética de 60 fotogramas se ejecuta sin errores

tools/run_synthetic.py — renderizado sin conexión a PNG

bash
python3 -m tools.run_synthetic --frames 180 --out /tmp/puzzle_demo
ls /tmp/puzzle_demo | wc -l      # → 180

Mueve la pipeline completa de PuzzleGame + HandOverlay y escribe cada fotograma en out/puzzle_XXXX.png. En un entorno sin cámara, revisa las imágenes con feh / eog / un visor de imágenes, o ensambla los PNG en un mp4 con ffmpeg:

bash
ffmpeg -framerate 30 -i /tmp/puzzle_demo/puzzle_%04d.png -c:v libx264 -pix_fmt yuv420p puzzle.mp4

tools/synthetic_source.py + tools/fake_tracker.py

Una fuente de vídeo sintética y un HandTracker sintético equivalentes en interfaz a cv2.VideoCapture / gesture.HandTracker. Para pasar a una cámara real más adelante, basta con sustituir estas dos líneas:

python
cap = cv2.VideoCapture(args.cam)               # reemplaza SyntheticHandSource
tracker = HandTracker(num_hands=2)              # reemplaza SyntheticHandTracker

Con esto, tools/run_synthetic.py se convierte en un script controlador con cámara real.