
基于 reComputer-RK / Docker / RKNN / YOLO 的单手捏合拼图游戏
项目简介
本项目构建一个 217 行的纯拼图项目:gesture.py 检测捏合 → drawing.RectDrawer 收两个矩形 → puzzle_game.PuzzleGame 打乱成 3×3 → 同状态机用捏合拖动拼图。

快速开始
1. 获取并进入项目目录
bash
git clone https://github.com/doublelf/puzzle_game
cd puzzle_game2. 安装依赖
bash
pip install -r requirements.txtrequirements.txt 固定四个依赖:
text
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.03. 启动游戏
bash
python main.py # 默认摄像头 0,水平镜像开启
python main.py --cam 1 # 使用第 2 个摄像头
python main.py --no-flip # 关闭水平镜像
python main.py --no-landmarks # 关闭关键点叠加层(默认开启)
python main.py --hide-trails # 关闭手势拖尾(默认开启)启动后会先看到「Pinch-Puzzle」菜单画面,按任意键进入游戏。
4. 操作说明
| 阶段 | 玩家动作 | 程序反馈 |
|---|---|---|
| DRAW | 拇指+食指捏合拖动 → 松开,绘制第一个矩形 | 矩形填充半透明绿色,左上角 Draw rectangles: 1/2 |
| DRAW | 重复一次,绘制第二个矩形 | 2/2 → READY - generating puzzle...,自动进入 PLAY |
| PLAY | 捏合吸附最近拼图块(金色脉冲边框) | Toast Tile #N selected + drag toward blank tile 提示 |
| PLAY | 拖动指尖至邻接空白格附近 | 两块同时绿色闪光 + Toast SWAP!,moves 自增 |
| PLAY | 9 块归位 | 中央爆裂 80 颗彩虹粒子 + 大字 Toast SOLVED! |
| 全程 | R 重置当前拼图 | 回到 DRAW 阶段,矩形清空 |
| 全程 | M 返回菜单 | 摄像头持续采集,仅关掉游戏循环 |
| 全程 | ESC 退出 | 释放摄像头、关闭 MediaPipe、销毁窗口 |
无摄像头环境运行
recomputer-rk3576-devkit 出厂默认没有 USB 摄像头插入;本项目附带三个工具保证在无摄像头下也能端到端跑通:
tools/verify_all.py —— 8 步验证套件
bash
cd /home/seeed/hand/puzzle_game
python3 -m tools.verify_all逐项打印:
- 模块导入(
gesture/drawing/puzzle_game/overlay/utils) utils几何 + 文本函数RectDrawer.update(None)不抛异常shuffle_solvable产出合法棋盘- 真实 MediaPipe Hand Landmarker 在 aarch64 上加载模型(XNNPACK delegate,约 110 ms 预热)
HandOverlay.add_event+ 渲染- 合成 pipeline 60 帧跑完不出错
tools/run_synthetic.py —— 离线渲染到 PNG
bash
python3 -m tools.run_synthetic --frames 180 --out /tmp/puzzle_demo
ls /tmp/puzzle_demo | wc -l # → 180驱动完整的 PuzzleGame + HandOverlay,把每一帧写到 out/puzzle_XXXX.png。在无摄像头场景下用 feh / eog / 图片浏览器逐帧查看,或用 ffmpeg 拼成 mp4:
bash
ffmpeg -framerate 30 -i /tmp/puzzle_demo/puzzle_%04d.png -c:v libx264 -pix_fmt yuv420p puzzle.mp4tools/synthetic_source.py + tools/fake_tracker.py
合成视频源与合成 HandTracker,以接口完全等价于 cv2.VideoCapture / gesture.HandTracker 的形式存在;如果未来要接入真实摄像头,只需把这两行替换为:
python
cap = cv2.VideoCapture(args.cam) # 替换 SyntheticHandSource
tracker = HandTracker(num_hands=2) # 替换 SyntheticHandTracker即可让 tools/run_synthetic.py 升级为真实摄像头驱动脚本。