William Zhang2026-09-28

Einhand-Kneif-3×3-Puzzle-Spiel mit MediaPipe Hand Landmarker

Echtzeit-Erkennung von 21 Hand-Keypoints und Kneifzustand einer einzelnen Hand mit dem MediaPipe-Tasks-Hand-Landmarker-Modell. „Daumen + Zeigefinger kneifen" wird direkt auf die Semantik „ziehen / loslassen" abgebildet — der Spieler führt das Zeichnen der ROI und die Puzzle-Operationen per Kneifgeste vor der Kamera aus; die gesamte Interaktionskette kommt ohne Tastatur, Maus oder Touchscreen aus.

CVHand TrackingGithub

Einhand-Kneif-Puzzle-Spiel basierend auf reComputer-RK / Docker / RKNN / YOLO

https://github.com/doublelf/puzzle_game


Projektübersicht

Dieses Projekt ist ein reines Puzzle-Projekt mit 217 Zeilen: gesture.py erkennt das Kneifen → drawing.RectDrawer sammelt zwei Rechtecke → puzzle_game.PuzzleGame mischt sie zu 3×3 → dieselbe Zustandsmaschine nutzt das Kneifen, um das Puzzle zu ziehen.


Schnellstart

1. Repo klonen und Verzeichnis öffnen

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

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 „Pinch-Puzzle"; drücken Sie eine beliebige Taste, um das Spiel zu starten.

4. Steuerung

PhaseSpielereingabeProgrammreaktion
DRAWDaumen+Zeigefinger kneifen, ziehen → loslassen, um das erste Rechteck zu zeichnenRechteck halbtransparent grün gefüllt, oben links Draw rectangles: 1/2
DRAWEinmal wiederholen, um das zweite Rechteck zu zeichnen2/2 → READY - generating puzzle..., automatischer Übergang zu PLAY
PLAYKneifen, um die nächste Puzzle-Kachel auszuwählen (goldener pulsierender Rahmen)Toast Tile #N selected + Hinweis drag toward blank tile
PLAYFingerspitze in die Nähe einer angrenzenden leeren Zelle ziehenBeide Kacheln blinken grün + Toast SWAP!, moves wird hochgezählt
PLAY9 Kacheln an ihrem Platz80 Regenbogenpartikel platzen in der Mitte + großer Toast SOLVED!
JederzeitR setzt das aktuelle Puzzle zurückZurück zur DRAW-Phase, Rechtecke werden gelöscht
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/puzzle_game
python3 -m tools.verify_all

Druckt jeden Schritt:

  • Modul-Importe (gesture / drawing / puzzle_game / overlay / utils)
  • utils Geometrie- und Text-Helfer
  • RectDrawer.update(None) löst keine Ausnahme aus
  • shuffle_solvable erzeugt ein legales Brett
  • Echter MediaPipe Hand Landmarker auf aarch64 geladen (XNNPACK-Delegate, ca. 110 ms Aufwärmphase)
  • HandOverlay.add_event + Rendering
  • Synthetische Pipeline läuft 60 Frames ohne Fehler durch

tools/run_synthetic.py — Offline-Rendering nach PNG

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

Treibt die vollständige PuzzleGame + HandOverlay-Pipeline und schreibt jeden Frame nach out/puzzle_XXXX.png. In einer kamerlosen Umgebung können die Bilder mit feh / eog / einem Bildbetrachter Frame für Frame angesehen oder mit ffmpeg zu einem mp4 zusammengefügt werden:

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

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.