基于Mediapipe与OpenCV的手势识别实现指南
本文详细介绍如何利用Mediapipe和OpenCV库在Python环境中实现实时手势检测。内容涵盖Anaconda环境配置、依赖包安装、核心代码逻辑解析及运行结果展示,并进一步探讨了手势识别在ROI提取、事件触发及全身姿态检测中的应用扩展。
一、前言
在尝试实现姿态识别的过程中,作者意识到手势识别同样具有重要价值,因此决定同步开发这一功能。
以下列出部分国内可用的Python包镜像源,用户可根据网络情况自行选择配置。
阿里云镜像地址:http://mirrors.aliyun.com/pypi/simple/
中国科学技术大学镜像地址:https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban)镜像地址:http://pypi.douban.com/simple/
清华大学镜像地址:https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学镜像地址:http://pypi.mirrors.ustc.edu.cn/simple/
二、环境配置
所需软件工具:
ANACONDA3配合Pycharm2019开发环境。
核心依赖库及版本要求:
- opencv-python>=4.5.5
- mediapipe>=0.8.9.1
注意:安装过程中请务必关闭代理软件(科学上网),以免导致下载失败或版本冲突。
三、全部源码
由于代码量较少且仅包含单个源文件MediapipeHandTracking.py,此处直接展示完整代码。
MediapipeHandTracking.py程序主要结构如下:
- 第一步:导入mediapipe相关模块,将手势识别解决方案分别赋值给mpHands、hands和mpDraw变量。
- 第二步:设定关键参数,包括置信度阈值及绘图样式。
- 第三步:进入循环,实时读取视频流至img变量,将img传入hands.hands函数获取识别结果,随后在img上绘制识别结果并输出画面。
MediapipeHandTracking.py源码与详细注释:
import cv2
import mediapipe as mp
import time
#第一步:保存mediapipe中的手势识别解决方案到mpHands,hands,mpDraw中
mpHands = mp.solutions.hands #以下三个是mediapipe 中的API调用模板了
hands = mpHands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5)#最小检测置信度,最小追踪置信度
mpDraw = mp.solutions.drawing_utils #获取mediapipe解决方案的绘画工具包
#第二步:参数设定
handLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=3)#绘制手部关键点的颜色与粗细
handConStyle = mpDraw.DrawingSpec(color=(0, 255, 0), thickness=5)#绘制手部线条的颜色与粗细
pTime = 0 #和下面的cTime一起用于计算视频输入流FPS
cTime = 0
cap = cv2.VideoCapture(0) #打开编号为0的摄像头,这个一般是自带摄像头
#第三步:循环读取视频流到img,img输入hands.hands函数得到结果,绘制结果到img并输出
while True:
ret, img = cap.read() #从cap中读取图片到img,并将读取是否成功的结果保存在ret
if ret:
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #模型训练的时候是使用RGB训练,对于这个类型识别精度和速度比较高
result = hands.process(imgRGB) #将RGB图片输入手部模型将结果保存在result
# print(result.multi_hand_landmarks) #打印result.multi_hand_landmarks内容,可以去掉试一下
imgHeight = img.shape[0] #获取摄像机图片的高
imgWidth = img.shape[1] #获取摄像机图片的宽
if result.multi_hand_landmarks:#如果multi_hand_landmarks不为空进入循环
for handLms in result.multi_hand_landmarks: #遍历multi_hand_landmarks内每一个hand_landmark(手部关键点),相对于遍历图片中每一个手
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle) #调用mediapipe内绘画工具包绘画手部关键点
for i, lm in enumerate(handLms.landmark): #i保存第几个手部关键点,lm保存该点在图中的归一化值
xPos = int(lm.x * imgWidth) #第i个关键点x
yPos = int(lm.y * imgHeight)#第i个关键点y
cv2.putText(img, str(i), (xPos-25, yPos+5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)#绘制关键点在,关键点左边靠下一点
if i == 8:#当画到第八个关键点时
cv2.circle(img, (xPos, yPos), 10, (166, 0, 0), cv2.FILLED)#画一个圆
#print(i, xPos, yPos) #打印绘制这个点时候的坐标
cTime = time.time()
fps = 1/(cTime-pTime)
pTime = cTime
cv2.putText(img, f"FPS : {int(fps)}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3) #绘制FSP到图中
cv2.imshow('img', img) #输出图片
if cv2.waitKey(1) == ord('q'):#点击视频,输入q退出
break
四、环境配置
1、在Anaconda3中新建名为Gesture的虚拟环境。
打开Anaconda Prompt命令行工具,执行以下命令:
conda create -n Gesture python=3.8
2、激活Gesture环境并安装opencv-python包。
激活环境命令:conda activate Gesture 安装opencv-python包命令:pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/

3、下载并安装mediapipe包。
pip install mediapipe -i https://pypi.tuna.tsinghua.edu.cn/simple/

4、在Pycharm中完成环境导入及项目配置。
确保代码运行环境指向刚才创建的Gesture环境。




五、运行程序:
使用Pycharm打开包含hanTracking.py程序的文件夹,直接运行脚本。

运行结果展示:

六、程序应用扩展
1、利用手部关键点的位置和已知次序特性:

该功能可用于从图片中提取ROI区域(感兴趣区域),进而执行其他图像处理操作。此外,还可用于手势响应事件触发,例如约定当食指(4号点)和大拇指(8号点)触碰时触发特定事件,或实现AL+相关操作。

2、与其他AI模型结合使用:
例如结合姿态检测AI模型,将人体识别为火柴人骨架,这种组合在开发中具有不少实用价值。
3、全身检测源码:
import cv2
import time
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_holistic = mp.solutions.holistic
holistic = mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5)
handLmsStyle = mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=0)#绘制手部关键点的颜色与粗细
handConStyle = mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=4)#绘制手部线条的颜色与粗细
cap = cv2.VideoCapture(0)
while True:
ret,image=cap.read()
if ret:
image = cv2.flip(image, 1)
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
results = holistic.process(image)
if results.pose_landmarks:
mp_drawing.draw_landmarks(image, results.face_landmarks, mp_holistic.FACEMESH_CONTOURS,handLmsStyle,handConStyle)
mp_drawing.draw_landmarks(image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_holistic.POSE_CONNECTIONS)
cv2.imshow("img",image)
if cv2.waitKey(1)==ord("q"):
break
holistic.close()运行效果如下: 晒晒我帅气的舍友

到此这篇关于基于Mediapipe+Opencv实现手势检测的文章就介绍到这了,更多相关Opencv手势检测内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













