ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于Mediapipe+Opencv实现手势检测

2022-11-06 22:08:46  阅读:227  来源: 互联网

标签:mediapipe opencv Pycharm 上网 源码 配置


基于Mediapipe+Opencv实现手势检测
一、前言
想实现一下姿态识别的时候,感觉手势识别也蛮重要的就过来顺便实现一下。

二、环境配置
软件:
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/

标签:mediapipe,opencv,Pycharm,上网,源码,配置
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有