William Zhang2026-09-28

3×3-puzzelspel met éénhandige kneep en MediaPipe Hand Landmarker

Realtime-detectie van 21 hand-keypoints en de kneepstatus van één hand met het MediaPipe Tasks Hand Landmarker-model. "Kneep van duim + wijsvinger" wordt direct gekoppeld aan de semantiek van "slepen / loslaten" — de speler tekent de ROI en voert de puzzelbewerkingen uit met kneepgebaren vóór de camera; de volledige interactieketen werkt zonder toetsenbord, muis of touchscreen.

CVHand TrackingGithub

Eénhandig kneep-puzzelspel gebaseerd op reComputer-RK / Docker / RKNN / YOLO

https://github.com/doublelf/puzzle_game


Projectoverzicht

Dit project is een pure puzzel van 217 regels: gesture.py detecteert het knijpen → drawing.RectDrawer verzamelt twee rechthoeken → puzzle_game.PuzzleGame schudt ze tot 3×3 → dezelfde toestandsmachine gebruikt het knijpen om de puzzel te slepen.


Snel starten

1. Repo klonen en map betreden

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

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 "Pinch-Puzzle"; druk op een willekeurige toets om het spel te betreden.

4. Besturing

FaseSpelerinputProgrammareactie
DRAWDuim + wijsvinger knijpen, slepen → loslaten om de eerste rechthoek te tekenenRechthoek halftransparant groen gevuld, linksboven Draw rectangles: 1/2
DRAWHerhaal één keer om de tweede rechthoek te tekenen2/2 → READY - generating puzzle..., gaat automatisch naar PLAY
PLAYKnijpen om de dichtstbijzijnde puzzeltegel te selecteren (gouden pulserende rand)Toast Tile #N selected + hint drag toward blank tile
PLAYVingertop naar een aangrenzende lege tegel slepenBeide tegels knipperen groen + Toast SWAP!, moves wordt verhoogd
PLAY9 tegels op hun plaats80 regenboogdeeltjes spatten uiteen in het midden + grote Toast SOLVED!
AltijdR herstelt de huidige puzzelTerug naar de DRAW-fase, rechthoeken gewist
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/puzzle_game
python3 -m tools.verify_all

Print elke stap:

  • Module-imports (gesture / drawing / puzzle_game / overlay / utils)
  • utils geometrie- en tekst-helpers
  • RectDrawer.update(None) gooit geen uitzondering
  • shuffle_solvable levert een geldig bord
  • Echte MediaPipe Hand Landmarker geladen op aarch64 (XNNPACK-delegate, ~110 ms opwarmtijd)
  • HandOverlay.add_event + rendering
  • Gesynthetiseerde pipeline draait 60 frames zonder fouten

tools/run_synthetic.py — offline renderen naar PNG

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

Drijft de volledige PuzzleGame + HandOverlay-pipeline aan en schrijft elk frame naar out/puzzle_XXXX.png. In een camera-loze omgeving de afbeeldingen frame voor frame bekijken met feh / eog / een afbeeldingsviewer, of de PNG's met ffmpeg tot een mp4 samenvoegen:

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