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

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
git clone https://github.com/doublelf/filter_game
cd filter_game2. Abhängigkeiten installieren
pip install -r requirements.txtrequirements.txt legt vier Abhängigkeiten fest:
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.0Von 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
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
| Aktion | Spielereingabe | Programmreaktion |
|---|---|---|
| Einhand kneifen | Beliebige Hand beginnt zu kneifen | Goldener Spreizring an der Zeigefingerspitze |
| Beide Hände kneifen | Beide Hände kneifen gleichzeitig | Spreizring am Mittelpunkt zwischen den beiden Ankerpunkten + Toast CONNECTED |
| Kneifen halten + bewegen | Beide Hände ziehen | Viereck (anchor_l, anchor_r, current_l, current_r), auf dessen innere Pixel der aktuelle Filter angewendet wird |
| Beliebige Hand loslassen | Eine Hand loslassen | Viereck verschwindet, Rückkehr zu IDLE |
| Horizontaler Streichzug zum Filterwechsel | Mit einer beliebigen nicht kneifenden Hand über den Bildschirm streichen | SwipeIndicator-Seitenverlaufsband + Toast Filter N/9 NAME |
| Filterwechsel per Tastatur | 1–9 direkt / [ ] oder , . nächstes/vorheriges | Toast Filter N/9 NAME |
| Jederzeit | M zurück zum Menü | Kamera erfasst weiter, nur die Spiel-Schleife wird beendet |
| Jederzeit | ESC beenden | Kamera 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
cd /home/seeed/hand/filter_game
python3 -m tools.verify_allDruckt jeden Schritt:
- Modul-Importe (
gesture/filter_game/filters/overlay/utils) utilsGeometrie- und Text-Helfer- Alle 9 Filter geben korrekte Form und dtype aus
FilterGame-Zustandsmaschine +SwipeTrackerHorizontal-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
python3 -m tools.run_synthetic --frames 200 --out /tmp/filter_demo
ls /tmp/filter_demo | wc -l # → 200Treibt die vollständige FilterGame + HandOverlay-Pipeline und druckt:
events total=N by_type={'both_connected': 1, ...}
BOTH_PINCH frames: 1 DRAG frames: 146Schreibt jeden Frame nach out/filter_XXXX.png. In einer kamerlosen Umgebung mit ffmpeg zu einem mp4 zusammenfügen:
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
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:
cap = cv2.VideoCapture(args.cam) # ersetzt SyntheticHandSource
tracker = HandTracker(num_hands=2) # ersetzt SyntheticHandTrackerAnschließend wird tools/run_synthetic.py zu einem echten Kameratreiber-Skript aufgewertet.