基于Mediapipe+Opencv实现手势检测功能
作者:风吹落叶花飘荡 发布时间:2023-09-18 13:11:52
一、前言
基于Mediapipe+Opencv实现手势检测,想实现一下姿态识别的时候,感觉手势识别也蛮重要的就过来顺便实现一下。
下面是一些国内的pip源,有需要可自取
阿里云 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完成环境导入项目
配置代码运行环境
五、运行程序:
用Pycharm打开包含hanTracking.py程序的文件夹,并运行
运行结果
六、程序应用扩展
1、手部的关键点的位置和次序我们全部已知的特点
该功能可用于图片ROI提取截取出图片,然后进行其他一些图片操作。
该功能可用于手势响应事件。比如约定,食指和大拇指也就是4号和8号触碰时候触发某事件
,等等。
实现AL+操作
2、和其他AL结合
比如姿态检测AL,能将人识别成一个火柴人,开发空间有不少用处。
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()
运行效果如下:
晒晒我帅气的舍友
来源:https://blog.csdn.net/qq_51116518/article/details/122370844


猜你喜欢
- 本文实例讲述了Python中str.join()简单用法。分享给大家供大家参考,具体如下:Python join() 方法用于将序列中的元素
- 我就废话不多说,直接上代码吧!from PIL import ImageGrabimport timeimport scheduleimpo
- 1. python三维图表绘制方法简介python三维图表的绘制算是二维图表的一个进阶版本,本质上和二维图表的绘制并无差别,唯一的区别在于使
- 前言工作中,Git的使用越来越频繁。。除了最常用的clone,add,commit,push,pull等命令;还有回退命令reset。这一篇
- 看过数据库的备份与还原。大多数都是用组件来完成的。其实可通过sql语句来完成。 由于时间关系,未对参数进行验证和界面美化。代码
- <input name="a" type="checkbox"
- 如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模
- 本文实例讲述了python实现给微信公众号发送消息的方法。分享给大家供大家参考,具体如下:现在通过发微信公众号信息来做消息通知和告警已经很普
- 前言众所周知,appsetting.json 配置文件是.Net 的重大革新之心,抛开了以前繁杂的xml文件,使用了更简洁易懂的json方式
- 三种解决方法: 1、改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mys
- 如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解
- Windows版mysql 8.0.28安装图解,供大家参考,具体内容如下1.官网下载最新版第一步双击打开 选择server only(因为
- ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写 的,主要用于创建前端用户界面,是一个与后台技术无关的
- 一,用临时表作为数组 create function f_split(@c varchar(2000),@split varchar(2))
- 备注1:解决连接MySQL数据库很慢的问题vim /etc/my.cnf添加内容:skip-name-resolve,重启数据库。
- 1.简介map 是 Golang 中的方便而强大的内建数据结构,是一个同种类型元素的无序组,元素通过另一类型唯一的键进行索引。其键可以是任何
- 最近要做一个侧边目录的功能,没有找到类似的组件,索性自己写了一个供大家参考vue-side-catalog一个基于vue的侧边目录组件。源码
- mmh3安装方法哈希方法主要有MD、SHA、Murmur、CityHash、MAC等几种方法。mmh3全程murmurhash3,是一种非加
- python的注释方式和C语言、C++、java有所不同python语言中,使用‘#' 来进行注释,其次还有使用 三个引号来进行注释
- 前言最近公司服务器到期,需要进行数据迁移,而数据库属于多而繁琐,通过图形化界面一个一个备份所需时间成本很大,所以想着写一个sql脚本来执行。