基于Mediapipe+Opencv实现手势检测功能

 更新时间:2022年01月08日 12:25:14   作者:风吹落叶花飘荡  
mediaPipe,他就是一个集成好的包括人脸关键位点识别、身体关键位点识别、手部关键位点识别的一个包或者库,直接调用就能够得到它的关键位点信息,本文给大家介绍Mediapipe+Opencv实现手势检测功能,感兴趣的朋友一起看看吧

一、前言

基于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()

运行效果如下:
晒晒我帅气的舍友

请添加图片描述

到此这篇关于基于Mediapipe+Opencv实现手势检测的文章就介绍到这了,更多相关Opencv手势检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python批量重命名同一文件夹下文件的方法

    Python批量重命名同一文件夹下文件的方法

    这篇文章主要介绍了Python批量重命名同一文件夹下文件的方法,涉及Python使用os模块操作文件的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 只用50行Python代码爬取网络美女高清图片

    只用50行Python代码爬取网络美女高清图片

    第一次写文章,技术不成熟之处望各位大神轻喷,今天教大家只用50行Python代码爬取网络美女图片是怎么操作的,文中有非常详细的代码示例,对正在学习python的小伙伴们很有帮助哦,需要的朋友可以参考下
    2021-06-06
  • python编程项目中线上问题排查与解决

    python编程项目中线上问题排查与解决

    因为业务上的设计存在问题,导致数据库表总是被锁,而且是不定期的锁定,导致服务器运行异常,今天就来跟大家说说该如何避免这种问题
    2021-11-11
  • python字符串拼接和列表拼接方式

    python字符串拼接和列表拼接方式

    这篇文章主要介绍了python字符串拼接和列表拼接方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • pandas缺失值np.nan, np.isnan, None, pd.isnull, pd.isna

    pandas缺失值np.nan, np.isnan, None, pd.isnull,&n

    本文主要介绍了pandas缺失值np.nan, np.isnan, None, pd.isnull, pd.isna
    2024-04-04
  • python使用protobufde的过程解析

    python使用protobufde的过程解析

    Google开源的一个序列化框架,类似于xml , json。最大的特点是基于 二进制,比传统的xml表示同样的内容要短小很多。亦可定义一些可选字段,用于服务端与客户端通信
    2021-08-08
  • Python爬虫分析微博热搜关键词的实现代码

    Python爬虫分析微博热搜关键词的实现代码

    这篇文章主要介绍了Python爬虫分析微博热搜关键词的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python入门教程(三十四)Python的文件处理

    Python入门教程(三十四)Python的文件处理

    这篇文章主要介绍了Python入门教程(三十四)Python的文件处理,在Python中处理文件的主要是open()函数,接下来我们就来一起看看open()函数的用法吧,需要的朋友可以参考下
    2023-05-05
  • Django+Uwsgi+Nginx如何实现生产环境部署

    Django+Uwsgi+Nginx如何实现生产环境部署

    这篇文章主要介绍了Django+Uwsgi+Nginx如何实现生产环境部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 教你用Python爬取英雄联盟皮肤原画

    教你用Python爬取英雄联盟皮肤原画

    今天给大家带来的是关于Python的相关知识,文章围绕着用Python爬取英雄联盟皮肤原画展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06

最新评论