William Zhang2026-09-27

9-Filter-Demo für beidhändiges Kneifen mit MediaPipe Hand Landmarker

Echtzeit-Erkennung von 21 Hand-Keypoints und Kneifzustand beider Hände auf der CPU (XNNPACK-beschleunigt) mit dem MediaPipe-Tasks-Hand-Landmarker-Modell. „Beide Hände kneifen gleichzeitig" wird direkt auf eine viereckige ROI abgebildet, und 9 Bildfilter werden live auf die Pixel innerhalb der ROI angewendet.

CVHand TrackingMediaPipeGithub

Visuelle Filter-Demo basierend auf reComputer-RK / Docker / RKNN / YOLO

https://github.com/doublelf/filter_game


Projektübersicht

Dieses Projekt konsolidiert 9 Filter in einem einzigen FILTER_LIST-Wörterbuch für einfache Erweiterung — was ein 191-zeiliges, filterorientiertes Studio ergibt: gesture.py erkennt beidhändiges Kneifen → filter_game.FilterGame verwaltet die Vierecks-Eckpunkte → filters.apply_filter verarbeitet die ROI-Pixel.


Schnellstart

1. Repo klonen und Verzeichnis öffnen

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

2. Abhängigkeiten installieren

bash
pip install -r requirements.txt

requirements.txt legt vier Abhängigkeiten fest:

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

Von den 9 Filtern werden EMBOSS / CONTOUR / POSTERIZE von Pillow bereitgestellt; INVERT / NEON / GRAY / SEPIA / HUE_SHIFT / PIXELATE sind mit OpenCV + NumPy implementiert und funktionieren auch ohne Pillow (sie geben dann das Originalbild zurück, siehe filters.py:36 _pil_filter_safe).

3. Spiel starten

bash
python main.py                  # Standardkamera 0, horizontale Spiegelung aktiviert
python main.py --cam 1          # zweite Kamera verwenden
python main.py --no-flip        # horizontale Spiegelung deaktivieren
python main.py --no-landmarks   # Keypoint-Overlay deaktivieren (standardmäßig aktiv)
python main.py --hide-trails    # Gesten-Trails deaktivieren (standardmäßig aktiv)

Nach dem Start sehen Sie zunächst den Menübildschirm „Filter Studio"; drücken Sie eine beliebige Taste, um das Spiel zu starten.

4. Steuerung

AktionSpielereingabeProgrammreaktion
Einhand kneifenBeliebige Hand beginnt zu kneifenGoldener Spreizring an der Zeigefingerspitze
Beide Hände kneifenBeide Hände kneifen gleichzeitigSpreizring am Mittelpunkt zwischen den beiden Ankerpunkten + Toast CONNECTED
Kneifen halten + bewegenBeide Hände ziehenViereck (anchor_l, anchor_r, current_l, current_r), auf dessen innere Pixel der aktuelle Filter angewendet wird
Beliebige Hand loslassenEine Hand loslassenViereck verschwindet, Rückkehr zu IDLE
Horizontaler Streichzug zum FilterwechselMit einer beliebigen nicht kneifenden Hand über den Bildschirm streichenSwipeIndicator-Seitenverlaufsband + Toast Filter N/9 NAME
Filterwechsel per Tastatur1–9 direkt / [ ] oder , . nächstes/vorherigesToast Filter N/9 NAME
JederzeitM zurück zum MenüKamera erfasst weiter, nur die Spiel-Schleife wird beendet
JederzeitESC beendenKamera freigeben, MediaPipe schließen, Fenster zerstören

Betrieb ohne Kamera

recomputer-rk3576-devkit wird werkseitig ohne angeschlossene USB-Kamera ausgeliefert. Dieses Projekt bündelt drei Werkzeuge, um auch ohne Kamera einen End-to-End-Lauf zu ermöglichen:

tools/verify_all.py — 8-Schritte-Verifikationssuite

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

Druckt jeden Schritt:

  • Modul-Importe (gesture / filter_game / filters / overlay / utils)
  • utils Geometrie- und Text-Helfer
  • Alle 9 Filter geben korrekte Form und dtype aus
  • FilterGame-Zustandsmaschine + SwipeTracker Horizontal-Streichzugserkennung
  • Echter MediaPipe Hand Landmarker auf aarch64 geladen (XNNPACK-Delegate, ca. 110 ms Aufwärmphase)
  • HandOverlay.add_event + Rendering (both_connected / filter_switch / swipe)
  • Synthetische Beidhändig-Pipeline läuft 120 Frames durch, und FilterGame hat BOTH_PINCH mindestens einmal erreicht

tools/run_synthetic.py — Offline-Rendering nach PNG

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

Treibt die vollständige FilterGame + HandOverlay-Pipeline und druckt:

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

Schreibt jeden Frame nach out/filter_XXXX.png. In einer kamerlosen Umgebung mit ffmpeg zu einem mp4 zusammenfügen:

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

Eine synthetische Videoquelle und ein synthetischer HandTracker, die schnittstellenkompatibel zu cv2.VideoCapture / gesture.HandTracker sind. Um später auf eine echte Kamera umzustellen, ersetzen Sie einfach diese zwei Zeilen:

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

Anschließend wird tools/run_synthetic.py zu einem echten Kameratreiber-Skript aufgewertet.