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

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
git clone https://github.com/doublelf/filter_game
cd filter_game2. Instalar dependencias
pip install -r requirements.txtrequirements.txt fija cuatro dependencias:
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.0De 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
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ón | Entrada del jugador | Respuesta del programa |
|---|---|---|
| Pellizco con una mano | Cualquier mano empieza a pellizcar | Anillo expansivo dorado en la punta del índice |
| Pellizco con ambas manos | Ambas manos pellizcan a la vez | Anillo expansivo en el punto medio entre los dos anclajes + Toast CONNECTED |
| Mantener pellizco + mover | Arrastrar ambas manos | Cuadrilátero (anchor_l, anchor_r, current_l, current_r) con el filtro actual aplicado a sus píxeles internos |
| Soltar cualquier mano | Liberar una mano | El cuadrilátero desaparece, vuelve a IDLE |
| Deslizar horizontalmente para cambiar filtro | Deslizar por la pantalla con cualquier mano que no esté pellizcando | Banda de gradiente lateral de SwipeIndicator + Toast Filter N/9 NAME |
| Cambio de filtro por teclado | 1–9 salto directo / [ ] o , . siguiente/anterior | Toast Filter N/9 NAME |
| En cualquier momento | M vuelve al menú | La cámara sigue capturando, solo se cierra el bucle del juego |
| En cualquier momento | ESC sale | Libera 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
cd /home/seeed/hand/filter_game
python3 -m tools.verify_allImprime 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 deSwipeTracker - 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
python3 -m tools.run_synthetic --frames 200 --out /tmp/filter_demo
ls /tmp/filter_demo | wc -l # → 200Mueve la pipeline completa de FilterGame + HandOverlay e imprime:
events total=N by_type={'both_connected': 1, ...}
BOTH_PINCH frames: 1 DRAG frames: 146Escribe cada fotograma en out/filter_XXXX.png. En un entorno sin cámara, ensambla los PNG en un mp4 con ffmpeg:
ffmpeg -framerate 30 -i /tmp/filter_demo/filter_%04d.png -c:v libx264 -pix_fmt yuv420p filter.mp4tools/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:
cap = cv2.VideoCapture(args.cam) # reemplaza SyntheticHandSource
tracker = HandTracker(num_hands=2) # reemplaza SyntheticHandTrackerCon esto, tools/run_synthetic.py se convierte en un script controlador con cámara real.