William Zhang2026-09-27

Demo de 9 filtros con pellizco a dos manos y MediaPipe Hand Landmarker

Detección en tiempo real de 21 puntos clave de la mano y el estado de pellizco de ambas manos en CPU (acelerado por XNNPACK) con el modelo MediaPipe Tasks Hand Landmarker. "Ambas manos pellizcando a la vez" se asigna directamente a un ROI cuadrilátero, y se aplican 9 filtros de imagen en vivo a los píxeles dentro del ROI.

CVHand TrackingMediaPipeGithub

Demostración de filtros visuales basada en reComputer-RK / Docker / RKNN / YOLO

https://github.com/doublelf/filter_game


Descripción del proyecto

Este proyecto consolida 9 filtros en un único diccionario FILTER_LIST para facilitar la ampliación — obteniendo un estudio de 191 líneas puramente de filtros: gesture.py detecta los pellizcos a dos manos → filter_game.FilterGame mantiene los vértices del cuadrilátero → filters.apply_filter procesa los píxeles del ROI.


Inicio rápido

1. Clonar el repositorio y entrar al directorio

bash
git clone https://github.com/doublelf/filter_game
cd filter_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

De los 9 filtros, EMBOSS / CONTOUR / POSTERIZE los aporta Pillow; INVERT / NEON / GRAY / SEPIA / HUE_SHIFT / PIXELATE están implementados con OpenCV + NumPy y funcionan también sin Pillow (devolviendo el fotograma original cuando falta Pillow, ver filters.py:36 _pil_filter_safe).

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ú "Filter Studio"; pulsa cualquier tecla para entrar al juego.

4. Controles

AcciónEntrada del jugadorRespuesta del programa
Pellizco con una manoCualquier mano empieza a pellizcarAnillo expansivo dorado en la punta del índice
Pellizco con ambas manosAmbas manos pellizcan a la vezAnillo expansivo en el punto medio entre los dos anclajes + Toast CONNECTED
Mantener pellizco + moverArrastrar ambas manosCuadrilátero (anchor_l, anchor_r, current_l, current_r) con el filtro actual aplicado a sus píxeles internos
Soltar cualquier manoLiberar una manoEl cuadrilátero desaparece, vuelve a IDLE
Deslizar horizontalmente para cambiar filtroDeslizar por la pantalla con cualquier mano que no esté pellizcandoBanda de gradiente lateral de SwipeIndicator + Toast Filter N/9 NAME
Cambio de filtro por teclado1–9 salto directo / [ ] o , . siguiente/anteriorToast Filter N/9 NAME
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/filter_game
python3 -m tools.verify_all

Imprime cada uno:

  • Importación de módulos (gesture / filter_game / filters / overlay / utils)
  • Funciones geométricas y de texto de utils
  • Los 9 filtros generan forma y dtype correctos
  • Máquina de estados de FilterGame + detección de deslizamiento horizontal de SwipeTracker
  • MediaPipe Hand Landmarker real cargado en aarch64 (XNNPACK delegate, ~110 ms de calentamiento)
  • HandOverlay.add_event + renderizado (both_connected / filter_switch / swipe)
  • La pipeline sintética de 120 fotogramas finaliza, y FilterGame ha alcanzado BOTH_PINCH al menos una vez

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

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

Mueve la pipeline completa de FilterGame + HandOverlay e imprime:

Code
events total=N by_type={'both_connected': 1, ...}
BOTH_PINCH frames: 1   DRAG frames: 146

Escribe cada fotograma en out/filter_XXXX.png. En un entorno sin cámara, ensambla los PNG en un mp4 con ffmpeg:

bash
ffmpeg -framerate 30 -i /tmp/filter_demo/filter_%04d.png -c:v libx264 -pix_fmt yuv420p filter.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.