William Zhang2026-09-27

9-filter beidshands-kneep-demo met MediaPipe Hand Landmarker

Realtime-detectie van 21 hand-keypoints en de kneepstatus van beide handen op de CPU (XNNPACK-versnelling) met het MediaPipe Tasks Hand Landmarker-model. "Beide handen knijpen tegelijk" wordt direct gekoppeld aan een vierhoekige ROI, en 9 beeldfilters worden live toegepast op de pixels binnen de ROI.

CVHand TrackingMediaPipeGithub

Visuele filter-demo gebaseerd op reComputer-RK / Docker / RKNN / YOLO

https://github.com/doublelf/filter_game


Projectoverzicht

Dit project bundelt 9 filters in één FILTER_LIST-woordenboek voor eenvoudige uitbreiding — wat een 191-regelig, louter-filter studio oplevert: gesture.py detecteert beidshands-knijpen → filter_game.FilterGame beheert de vierhoekige hoekpunten → filters.apply_filter verwerkt de ROI-pixels.


Snel starten

1. Repo klonen en map betreden

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

2. Afhankelijkheden installeren

bash
pip install -r requirements.txt

requirements.txt legt vier afhankelijkheden vast:

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

Van de 9 filters worden EMBOSS / CONTOUR / POSTERIZE geleverd door Pillow; INVERT / NEON / GRAY / SEPIA / HUE_SHIFT / PIXELATE zijn geïmplementeerd met OpenCV + NumPy en werken ook zonder Pillow (ze geven dan het originele frame terug, zie filters.py:36 _pil_filter_safe).

3. Spel starten

bash
python main.py                  # standaard camera 0, horizontale spiegeling ingeschakeld
python main.py --cam 1          # gebruik de 2e camera
python main.py --no-flip        # horizontale spiegeling uitschakelen
python main.py --no-landmarks   # keypoint-overlay uitschakelen (standaard aan)
python main.py --hide-trails    # gebaarsporen uitschakelen (standaard aan)

Na het starten ziet u eerst het menuscherm "Filter Studio"; druk op een willekeurige toets om het spel te betreden.

4. Besturing

ActieSpelerinputProgrammareactie
Eénhandige kneepWillekeurige hand begint te knijpenGoudkleurige spreidingsring aan de wijsvingertop
Beidshands kneepBeide handen knijpen tegelijkSpreidingsring op het middelpunt tussen de twee ankers + Toast CONNECTED
Kneep vasthouden + bewegenBeide handen slepenVierhoek (anchor_l, anchor_r, current_l, current_r), met het huidige filter toegepast op de binnenste pixels
Een hand loslatenEén hand loslatenVierhoek verdwijnt, terug naar IDLE
Horizontale veeg voor filterwisselMet een willekeurige niet-knijpende hand over het scherm vegenSwipeIndicator-zijgradiëntband + Toast Filter N/9 NAME
Filterwissel via toetsenbord1–9 directe sprong / [ ] of , . volgende/vorigeToast Filter N/9 NAME
AltijdM terug naar menuCamera blijft opnemen, alleen de gamslus wordt afgesloten
AltijdESC afsluitenCamera vrijgeven, MediaPipe sluiten, venster vernietigen

Werking zonder camera

recomputer-rk3576-devkit wordt standaard zonder aangesloten USB-camera geleverd. Dit project bundelt drie hulpmiddelen zodat het ook zonder camera end-to-end kan draaien:

tools/verify_all.py — 8-staps verificatiesuite

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

Print elke stap:

  • Module-imports (gesture / filter_game / filters / overlay / utils)
  • utils geometrie- en tekst-helpers
  • Alle 9 filters geven correcte shape en dtype terug
  • FilterGame-toestandsmachine + SwipeTracker horizontale-veegdetectie
  • Echte MediaPipe Hand Landmarker geladen op aarch64 (XNNPACK-delegate, ~110 ms opwarmtijd)
  • HandOverlay.add_event + rendering (both_connected / filter_switch / swipe)
  • Gesynthetiseerde beidshands-pipeline draait 120 frames, en FilterGame heeft BOTH_PINCH minstens één keer bereikt

tools/run_synthetic.py — offline renderen naar PNG

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

Drijft de volledige FilterGame + HandOverlay-pipeline aan en print:

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

Schrijft elk frame naar out/filter_XXXX.png. In een camera-loze omgeving de PNG's met ffmpeg tot een mp4 samenvoegen:

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

Een gesynthetiseerde videobron en een gesynthetiseerde HandTracker die interface-equivalent zijn aan cv2.VideoCapture / gesture.HandTracker. Om later op een echte camera over te schakelen, vervangt u eenvoudigweg deze twee regels:

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

Vervolgens is tools/run_synthetic.py opgewaardeerd tot een echt camerastuurprogramma-script.