在这篇博客中,我将分享一个有趣的 Python 项目:通过 wxPython
创建图形界面,利用 OpenCV
的计算机视觉技术实现实时手势识别,当检测到“V”字(胜利)手势时自动连拍 9 张照片,而检测到拳头手势时立即停止拍照。这个程序结合了摄像头输入、手势检测和文件保存功能,适合作为学习计算机视觉和 GUI 开发的入门项目。
C:\pythoncode\new\output\usepytorchcamera.py
以下是项目的完整实现过程,包括代码分析、使用说明和可能的优化建议。
项目概述
功能
- 实时视频捕获:通过摄像头捕获视频流并显示在 wxPython 界面上。
- 手势识别:
- Victory 手势:检测到“V”字手势时,触发连拍 9 张照片。
- 拳头手势:检测到拳头时,立即停止正在进行的拍照。
- 照片保存:照片以时间戳命名,保存到指定文件夹(
victory_photos
)。 - 冷却时间:拍照完成后有 5 秒冷却时间,避免重复触发。
- 界面反馈:实时显示摄像头画面、手势检测状态、手指数量和轮廓密实度。
技术栈
- wxPython:用于创建图形用户界面(GUI)。
- OpenCV:用于摄像头视频处理和手势检测。
- NumPy:用于图像数组操作。
- Python 标准库:用于文件管理和时间戳生成。
依赖安装
运行程序前,请确保安装以下依赖:
pip install wxPython opencv-python numpy
实现原理
手势检测逻辑
手势识别基于 OpenCV 的肤色检测和轮廓分析,主要步骤如下:
-
肤色检测:
- 将图像从 BGR 转换为 HSV 颜色空间。
- 使用预定义的肤色范围(
lower_skin
和upper_skin
)生成二值掩码。 - 通过形态学操作(膨胀和高斯模糊)优化掩码,去除噪声。
-
轮廓检测:
- 使用
cv2.findContours
找到掩码中的轮廓。 - 选择面积最大的轮廓,假设其为手部。
- 使用
-
凸包与缺陷分析:
- 计算轮廓的凸包(
cv2.convexHull
),用于检测手指间的凹陷。 - 使用
cv2.convexityDefects
找到凸缺陷,计算手指数量。 - 通过角度过滤(小于 90 度)判断缺陷是否为手指间隙。
- 计算轮廓的凸包(
-
手势判定:
- Victory 手势:检测到 2 个手指。
- 拳头手势:轮廓密实度(
solidity = contour_area / hull_area
)大于 0.8 且手指数量少于等于 1。
-
可视化:
- 在界面上绘制手部轮廓(绿色)、凸缺陷点(红色圆点)。
- 显示手指数量、密实度和手势类型。
拍照控制
- 触发拍照:当检测到 Victory 手势且不在冷却时间内,开始连拍。
- 停止拍照:检测到拳头手势时立即中断。
- 保存照片:每张照片以时间戳和序号命名,保存到
victory_photos
文件夹。
代码分析
以下是代码的关键部分分析:
主窗口类 (MainFrame
)
class MainFrame(wx.Frame):
def __init__