Python 玩转摄像头:MediaPipe 手势追踪贪吃蛇游戏(含完整环境配置教程)
本文将带你从零开始搭建一个 Python 多功能项目 Project2(https://github.com/WLHSDXN/Project2)。
无论你是想学习计算机视觉、自动化脚本,还是 Web 爬虫 + 邮件通知,这个项目都能给你完整的实践参考。
一、整体项目结构
Project2-main/ ├── README.md# 项目总说明├── SnakeGame/# 摄像头贪吃蛇│ ├── main.py# 游戏主入口│ ├── HandTrackingModule_fixed.py# 手势追踪模块(适配 MediaPipe 0.10+)│ ├── hand_landmarker.task# MediaPipe 手部模型文件│ ├── donut.png# 食物图片│ └── requirements.txt# 依赖清单├── AutomatedScript/# 自动化脚本│ ├── MessageBombing.py# 消息轰炸脚本│ └── README.md └── AutomatedScript_QueryScore/# 成绩监控├── cjcx.py# 核心查询 + 邮件发送└── README.md二、环境准备(通用部分)
2.1 Python 版本
推荐使用 Python 3.8 ~ 3.10。项目依赖中部分库(如 tensorflow2.6.2、mediapipe0.8.3)在高版本 Python 上可能存在兼容性问题。
⚠️ 注意:如果你只需要运行 SnakeGame,不需要 tensorflow,可以跳过安装它。
# 在项目根目录下python-mvenv venv# Windows 激活venv\Scripts\activate# Linux/Mac 激活sourcevenv/bin/activate2.2 创建虚拟环境(推荐)
# 在项目根目录下python-mvenv venv# Windows 激活venv\Scripts\activate# Linux/Mac 激活sourcevenv/bin/activate2.3 安装依赖
SnakeGame 模块提供了 requirements.txt,一键安装:
cdSnakeGame pipinstall-rrequirements.txt其他两个模块依赖较少,单独安装即可:
# AutomatedScriptpipinstallpynput# AutomatedScript_QueryScorepipinstallrequests# smtplib 为 Python 内置库,无需安装三、模块一:SnakeGame(摄像头贪吃蛇)
3.1 项目简介
这是整个项目中最亮眼的模块。通过摄像头捕捉你的手部动作,食指指尖控制蛇的移动方向,实现"隔空玩贪吃蛇"的效果。
###3.2 核心依赖及作用
核心依赖主要为 mediapipe(手势识别)、cv2(摄像头捕捉与画面渲染)、cvzone(简化OpenCV操作),均已包含在 SnakeGame 目录的 requirements.txt 中,一键安装即可。
3.3 关键配置步骤
① 下载 MediaPipe 手部模型文件
项目已内置 hand_landmarker.task 文件在 SnakeGame/ 目录下。如果缺失,可从 MediaPipe 官方(https://ai.google.dev/edge/mediapipe/solutions/vision/hand_landmarker)下载,放置到 SnakeGame/ 目录。
② 确认摄像头可用
运行以下测试代码验证摄像头正常:
importcv2 cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)ret,frame=cap.read()print("摄像头正常"ifretelse"摄像头异常")cap.release()如果提示摄像头异常,检查:
- 是否有其他程序占用摄像头
- 笔记本用户确认隐私设置中允许应用访问摄像头
- 尝试将 0 改为 1 或 2(多摄像头设备)
③ 运行游戏
cdSnakeGame python main.py- 游戏启动后,将手伸到摄像头前,食指指尖即为蛇头位置
- 吃到甜甜圈(食物)得 1 分,蛇身增长
- 蛇身缠绕自身则 Game Over
- 按 R 键重新开始
3.4 核心代码逻辑解析
游戏主循环 (main.py):
# 初始化摄像头 1280x720cap=cv2.VideoCapture(0,cv2.CAP_DSHOW)cap.set(3,1280)# 宽cap.set(4,720)# 高# 初始化手势检测器,只检测一只手,置信度 0.8detector=HandDetector(detectionCon=0.8,maxHands=1)# 主循环whileTrue:success,img=cap.read()img=cv2.flip(img,1)# 水平翻转,镜像效果hands,img=detector.findHands(img,flipType=False)ifhands:lmList=hands[0]['lmList']pointIndex=lmList[8][0:2]# 食指指尖坐标img=game.update(img,pointIndex)cv2.imshow("Image",img)ifcv2.waitKey(1)==ord('r'):game.gameOver=False# 按 R 重开碰撞检测 (SnakeGameClass.update()):
# 将蛇身点(除头部两个点)连成折线pts=np.array(self.points[:-2],np.int32)pts=pts.reshape((-1,1,2))cv2.polylines(imgMain,[pts],False,(0,200,0),3)# 计算蛇头到折线的最短距离minDist=cv2.pointPolygonTest(pts,(cx,cy),True)# 距离接近 0 说明蛇头碰到了身体 → 游戏结束if-1<=minDist<=1:self.gameOver=True3.5 手势追踪模块说明
项目使用了自定义的 HandTrackingModule_fixed.py,专门适配了 MediaPipe 0.10+ 的新 API(旧版 cvzone 的 HandTrackingModule 在新版 MediaPipe 上会报错)。
关键变化:
- 使用 mediapipe.tasks.python.vision.HandLandmarker 替代旧的 mp.solutions.hands
- 需要加载 .task 模型文件
- 输出格式从归一化坐标转换为像素坐标
四、模块二:AutomatedScript(自动化脚本)
该模块包含自动化处理重复任务的脚本,核心文件为MessageBombing.py(消息轰炸脚本),依赖仅需 pynput(用于模拟键盘/鼠标操作)。
运行方式:进入 AutomatedScript 目录,直接执行 python MessageBombing.py,可根据脚本内注释修改轰炸内容、频率等参数。
五、模块三:AutomatedScript_QueryScore(成绩监控)
核心功能:部署在服务器上,实时监测成绩发布情况,一旦有新成绩,立即发送邮件到指定邮箱,核心文件为 cjcx.py。
依赖:requests(用于请求成绩查询接口),smtplib(Python 内置,用于发送邮件)。
使用前需在 cjcx.py 中配置:成绩查询接口地址、个人查询参数、邮箱账号密码、接收邮件地址等,配置完成后直接运行即可实现后台监控。
六、常见问题汇总
Q1:SnakeGame 运行报错 ModuleNotFoundError: No module named ‘cvzone’
解决方案:执行 pip install cvzone 安装依赖。
Q2:摄像头画面是黑的 / 打不开
- 确认摄像头驱动正常
- 检查是否有杀毒软件/隐私设置阻止了摄像头访问
- 尝试把 cv2.VideoCapture(0) 中的 0 改为 1
Q3:MediaPipe 相关报错(如模型加载失败)
解决方案:确认 hand_landmarker.task 文件已放置在 SnakeGame 目录,若缺失,从 MediaPipe 官方地址重新下载。
七、总结
非常适合作为 Python 新手的综合练手项目,每个模块都可以独立运行,互相不耦合,涵盖计算机视觉(MediaPipe 手势识别)、自动化操作、网络请求+邮件通知等常用场景。
项目地址:https://github.com/WLHSDXN/Project2
如果觉得有帮助,欢迎点赞收藏 ⭐~
