KingArthuritus/Slide-Kick
GitHub: KingArthuritus/Slide-Kick
基于网络摄像头与机器学习的实时手臂挥动检测系统,用于无硬件控制幻灯片翻页。
Stars: 0 | Forks: 0
# SlideKick
**用手臂动作控制你的演示文稿 —— 不需要翻页笔、键盘或任何硬件。**
SlideKick 使用你的网络摄像头和机器学习模型实时检测手臂挥动,并将其转化为幻灯片导航命令。向左挥动前进,向右挥动后退。就这么简单。
## 包含内容
```
Slide-Kick/
├── main.py # Launch the app
├── app/
│ ├── session_ui.py # Session tab — live gesture control
│ ├── training_ui.py # Label & Train tab — data labelling
│ ├── training_vision_ui.py# Test Model tab — evaluate & generate data
│ ├── pose_tracker.py # MediaPipe pose tracking + person lock
│ ├── recorder.py # Session video + landmark recorder
│ └── config.py # All tuning constants (edit here)
├── utils/
│ ├── smoothing.py # OneEuro landmark smoother
│ └── one_euro.py
├── swipe_hero/ # Gesture rhythm game
│ ├── game.py # Main game entry point
│ ├── beatmap_editor.py # Create beatmaps for songs
│ ├── beatmaps/ # Song beatmap JSON files
│ └── songs/ # Place .wav / .mp3 / .ogg files here
├── models/ # MediaPipe model (auto-downloaded)
├── recordings/ # Saved session videos + landmark JSON
├── dataset/ # Labelled gesture segments
├── model.pkl # Trained gesture classifier
├── train_model.py # Train the classifier
├── generate_results.py # Evaluate model + k-fold cross validation
├── results_dashboard.py # Visual performance charts
└── comparison_tool.py # Compare ML vs hardcoded detection
```
## 安装说明
**环境要求:** Python 3.10+,网络摄像头
```
# Clone 并 install dependencies
pip install -r requirements.txt
# 下载 MediaMedia pose model(首次运行时自动下载)
# 或者手动将 pose_landmarker_full.task 放置在 models/ 中
# 启动 app
python main.py
```
**核心依赖:**
- `mediapipe` — 姿态关键点提取
- `opencv-python` — 摄像头画面
- `scikit-learn` — 手势分类器
- `joblib` — 模型序列化
- `Pillow` — 在 tkinter 中显示图像
- `pyautogui` — 幻灯片控制按键
- `pygame` — Swipe Hero 游戏
## 如何使用
### 1. 收集训练数据
打开 **Session** 标签页并点击 **START SESSION**。在摄像头前清晰地挥动你的手臂。视频和关键点数据将自动保存到 `recordings/` 目录中。
### 2. 标注数据
打开 **Label & Train** 标签页,加载一段录像,并标记每次挥动的起始和结束帧。为其分配一个手势标签。标记的片段会保存到 `dataset/` 目录中。
**手势标签:**
| 标签 | 含义 |
|-------|---------|
| `left_arm_swipe_left` | 左臂向左挥动 |
| `left_arm_swipe_right` | 左臂向右挥动 |
| `right_arm_swipe_left` | 右臂向左挥动 |
| `right_arm_swipe_right` | 右臂向右挥动 |
| `non_gesture` | 无挥动 —— 背景动作 |
### 3. 训练模型
```
python train_model.py
```
此操作会读取 `dataset/` 中的所有片段,训练一个 Random Forest 分类器,并保存 `model.pkl`。只需几秒钟。
### 4. 评估性能
```
python generate_results.py # runs 5-fold cross validation
python results_dashboard.py # opens visual charts
```
### 5. 控制你的幻灯片
在 **Session** 标签页中,勾选 **Presentation Mode**。将摄像头对准自己,在任意应用程序(如 Google Slides、PowerPoint、Keynote)中打开你的演示文稿,然后挥动手臂:
- **向左挥动**(任意一只手臂) → 下一页幻灯片
- **向右挥动**(任意一只手臂) → 上一页幻灯片
## 调优
所有检测设置都位于 `app/config.py` 中。只需修改一次,即可在全局生效。
```
GESTURE_WINDOW = 3 # frames of history for feature extraction
CONFIDENCE_THRESH = 0.60 # minimum confidence to fire a gesture
COOLDOWN_FRAMES = 5 # frames to ignore after a detection fires
```
**指南:**
- 降低 `CONFIDENCE_THRESH` → 灵敏度更高,但可能会出现误报
- 提高 `CONFIDENCE_THRESH` → 灵敏度更低,减少误报
- 降低 `COOLDOWN_FRAMES` → 可以更快地再次触发
- 提高 `GESTURE_WINDOW` → 更平滑,但会增加少许延迟
## Swipe Hero
这是一款由手势控制的音乐节奏游戏,旨在让手势训练变得有趣,并在游戏过程中生成额外的 ML 训练数据。
```
python swipe_hero/game.py
```
**操作按键:**
| 按键 | 动作 |
|-----|--------|
| `↑ / ↓` | 导航菜单 |
| `← / →` | 切换歌曲 |
| `Enter` | 选择 |
| `A` | 左臂向左挥动 |
| `S` | 左臂向右挥动 |
| `K` | 右臂向左挥动 |
| `L` | 右臂向右挥动 |
| `P / Esc` | 暂停 |
| `F11` | 全屏 |
**添加歌曲:**
1. 将 `.wav`、`.mp3` 或 `.ogg` 文件放入 `swipe_hero/songs/` 目录
2. 运行谱面编辑器:`python swipe_hero/beatmap_editor.py`
3. 输入歌曲名称(必须与音频文件名一致),跟着节拍敲击音符,然后按 Enter 键保存
## 项目结构说明
- `recordings/` — 会话视频命名为 `session_YYYYMMDD_HHMMSS.mp4`,Swipe Hero 录像命名为 `swipe_hero_YYYYMMDD_HHMMSS.mp4`
- `dataset/` — 每个已标注的片段都是一个 `.json` 文件,包含关键点和元数据
- `model.pkl` — 训练好的分类器;每次运行 `train_model.py` 时都会重新生成
- `results.json` — 由 `generate_results.py` 生成;供 `results_dashboard.py` 读取
## 架构
SlideKick 采用包含五层结构的**分层架构** (Layered Architecture):
| 层级 | 组件 |
|-------|-----------|
| 表示层 | Session 标签页,训练界面,Swipe Hero |
| 应用层 | Session 协调器,手势检测器,录像机 |
| 手势识别层 | 姿态追踪器,关键点平滑器,分类器 |
| 幻灯片指令层 | 键盘分发器,演示模式 |
| 硬件层 | 摄像头读取器,文件系统,OS 输入 |
各层之间的通信采用**观察者模式** (Observer Pattern) —— 手势检测器会广播已确认的挥动事件,多个独立的观察者(幻灯片控制器、界面反馈、错误处理器)各自独立进行响应。
## 已知局限性
- 在距离摄像头 2 到 4 米的范围内效果最佳
- 需要合理的照明条件 —— 环境过暗会降低关键点质量
- Swipe Hero 中的双人模式尚未实现
标签:Apex, MediaPipe, 人机交互, 手势识别, 机器学习, 演示工具, 计算机视觉, 逆向工具