这是一个实时视频流中基于手势识别的智能图像系统,使用 MediaPipe 进行手部识别,支持实时切换 4 种专业图像滤镜效果,并支持通过手势序列进行照片拍摄。
- 🎯 实时手势识别:识别 ONE、TWO、THREE、FOUR 等手指数字手势
- 🎨 4 种专业滤镜:直方图均衡化、流年特效、灰度、怀旧特效
- 📸 手势拍照:通过 PALM→FIST 手势序列触发拍照,延迟 2 秒后自动捕获
- ⚡ 高性能优化:使用 NumPy 向量化加速,所有滤镜 >20 FPS
- 🖼️ 干净保存:保存的照片不包含 UI 文字,仅保留滤镜效果
- 💻 多模式运行:支持实时视频、演示模式、单张图片处理
- Python: 3.10
opencv-python
mediapipe>=0.8
numpy
git clone https://github.com/bugmaker-zzz/Image-Processing-Homework.gitconda create -n gesturefilter python=3.10
conda activate gesturefilterpip install -r requirements.txtpython main.py系统将启动本地摄像头,使用右手比划手势,实时识别手势并应用滤镜效果。
python main.py --demo依次展示所有 4 种滤镜效果,无需摄像头。
python main.py --mode image --img_path ./data/input/apple.png对指定图片应用指定滤镜并保存到输出目录。
| 手势 | 效果 | 说明 |
|---|---|---|
| ONE (1) | 🎯 直方图均衡化 | 提高对比度,增强图像细节 |
| TWO (2) | ✨ 流年特效 | 复古怀旧风格,B 通道增强 |
| THREE (3) | ⚫ 灰度 | 经典黑白效果 |
| FOUR (4) | 🟤 怀旧特效 | 棕褐色复古风格 |
| 手势 | 功能 |
|---|---|
| FIST (握拳) | 保持当前滤镜不变 |
| PALM (张开手掌) | 保持当前滤镜不变 |
| PALM → FIST | 触发拍照,延迟 2 秒后自动捕获 |
| 双手同时出现 | 取消滤镜 |
| 按键 | 功能 |
|---|---|
| Q / ESC | 退出程序 |
| Space | 立即保存当前帧(无延迟) |
your_workspace/
├── main.py # 主程序入口
├── README.md
├── requirements.txt # 依赖列表
│
├── utils/
│ ├── __init__.py
│ ├── gesturedetector.py # 手势识别模块(MediaPipe)
│ └── imagefilter.py # 图像滤镜模块
│
└── data/
├── input/ # 输入图片目录
│ ├── apple.png
└── output/ # 输出照片目录(自动创建)
├── photo_20240115_120530_histogram_equalization.jpg
└── screenshot_20240115_120545_sepia.jpg
═══════════════════════════════════════════════════════════════
基于手势识别的智能图像滤镜系统
═══════════════════════════════════════════════════════════════
手势映射关系:
ONE (1) → 直方图均衡化
TWO (2) → 流年特效
THREE (3) → 灰度特效
FOUR (4) → 怀旧特效
特殊功能:
PALM → FIST → 延迟2秒后拍照保存
✓ 摄像头已打开,系统开始运行...
- 上方左侧:当前识别的手势和滤镜名称
- 上方右侧:FPS 和帧计数
- 拍照倒计时:PALM→FIST 后显示 "Photo in X.Xs"
- 下方:快捷键帮助提示
各滤镜在实时视频中的处理速度:
| 滤镜 | FPS | 优化方案 |
|---|---|---|
| 原图 | 252 | 直接复制 |
| 直方图均衡化 | 65 | OpenCV 优化库 |
| 流年特效 | 39 | NumPy 向量化 |
| 灰度 | 223 | OpenCV 色彩空间转换 |
| 怀旧特效 | 22 | NumPy 矩阵乘法 |
- 原理:独立对每个 BGR 通道进行直方图均衡化
- 效果:增强对比度,使图像细节更清晰
- 适用:光线不足或对比度低的图像
- 原理:对 B 通道进行平方根变换 → 乘以 12
- 效果:复古怀旧风格,蓝色偏向增强
- 适用:创意照片、艺术处理
- 原理:BGR 转灰度,再转回 BGR 三通道
- 效果:经典黑白效果
- 适用:肖像摄影、经典风格
- 原理:应用棕褐色变换矩阵
- 效果:暖色调的复古褐色风格
- 适用:老照片风格、怀旧主题
- 充足光线:确保摄像头能清楚看到你的手
- 适当距离:保持手距摄像头 30-50 厘米
- 清晰手势:手指要完全展开或握紧(避免模糊状态)
- 稳定姿态:快速切换手势时保持稳定
- 先做出 PALM(张开手掌)
- 快速转变为 FIST(握拳)- 需在 0.5 秒内完成
- 系统会自动等待 2 秒后拍照
- 拍照完成后会在
./data/output/目录保存照片
- 多次做同一手势时,第一次切换滤镜,后续重复不会再切换
- 要切换到另一种滤镜,做不同的手势数字
- FIST 和 PALM 不会改变滤镜
A: 检查:
- 摄像头是否被其他程序占用
- 权限设置是否允许程序访问摄像头
- 系统设备管理器中摄像头状态
A: 尝试:
- 增加光线亮度
- 调整摄像头角度
- 做手势时动作更清晰明显
- 稍微靠近摄像头
A: 首次运行会自动下载 hand_landmarker.task (27MB),可以:
- 检查网络连接
- 手动下载后放到
./model/目录 - 耐心等待下载完成
A: 检查:
- 是否成功识别手势(左上角显示手势类型)
- 当前激活的滤镜名称(左上方显示)
- 尝试在不同光线条件下测试
命名格式:photo_YYYYMMDD_HHMMSS_滤镜名.jpg
示例:
photo_20240115_143025_flowing_years.jpg
photo_20240115_143027_grayscale.jpg
命名格式:screenshot_YYYYMMDD_HHMMSS_滤镜名.jpg
位置:./data/output/ 目录
- 手势识别:MediaPipe Hand Landmarker (v0.10.31)
- 图像处理:OpenCV (cv2)
- 数值计算:NumPy (向量化)
- 视频捕捉:OpenCV VideoCapture
本项目为学习项目,可自由使用和修改。
项目完成日期:2026 年 1 月
核心优化:
- ✅ MediaPipe 0.10.31 Tasks API 集成
- ✅ 手势状态持久化逻辑
- ✅ NumPy 向量化性能优化 (39+ FPS)
- ✅ 双管道架构 (display + save)
- ✅ 无 UI 干净图像保存
如有任何问题或建议,欢迎反馈!
可能的改进方向:
- 支持更多滤镜效果
- 实时滤镜参数调整
- 视频录制功能
- 多手势组合识别
- 批量图片处理