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

目录

  • 一、前言
  • 二、环境配置
    • 软件:
    • 环境:
  • 三、全部源码
    • MediapipeHandTracking.py程序结构:
    • MediapipeHandTracking.py源码与注释
  • 四、环境配置
    • 1、在Anaconda3上新建环境Gesture
    • 2、激活Gesture环境并下载opencv-python包
    • 3、下载mediapipe包
    • 4、打开Pycharm完成环境导入项目
  • 五、运行程序:
    • 六、程序应用扩展
      • 1、手部的关键点的位置和次序我们全部已知的特点
      • 2、和其他AL结合
      • 3、全身检测源码

    一、前言 基于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 cv2import mediapipe as mpimport 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一起用于计算视频输入流FPScTime = 0cap = cv2.VideoCapture(0) #打开编号为0的摄像头,这个一般是自带摄像头#第三步:循环读取视频流到img,img输入hands.hands函数得到结果,绘制结果到img并输出while True:ret, img = cap.read()#从cap中读取图片到img,并将读取是否成功的结果保存在retif 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个关键点xyPos = int(lm.y * imgHeight)#第i个关键点ycv2.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 = cTimecv2.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,输入:
    【基于Mediapipe+Opencv实现手势检测功能】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实现手势检测功能
    文章图片


    3、下载mediapipe包
    pip install mediapipe -i https://pypi.tuna.tsinghua.edu.cn/simple/
    基于Mediapipe+Opencv实现手势检测功能
    文章图片


    4、打开Pycharm完成环境导入项目
    配置代码运行环境
    基于Mediapipe+Opencv实现手势检测功能
    文章图片

    基于Mediapipe+Opencv实现手势检测功能
    文章图片


    基于Mediapipe+Opencv实现手势检测功能
    文章图片

    基于Mediapipe+Opencv实现手势检测功能
    文章图片


    五、运行程序: 用Pycharm打开包含hanTracking.py程序的文件夹,并运行
    基于Mediapipe+Opencv实现手势检测功能
    文章图片

    运行结果
    基于Mediapipe+Opencv实现手势检测功能
    文章图片


    六、程序应用扩展
    1、手部的关键点的位置和次序我们全部已知的特点
    基于Mediapipe+Opencv实现手势检测功能
    文章图片

    该功能可用于图片ROI提取截取出图片,然后进行其他一些图片操作。
    该功能可用于手势响应事件。比如约定,食指和大拇指也就是4号和8号触碰时候触发某事件
    ,等等。
    实现AL+操作
    基于Mediapipe+Opencv实现手势检测功能
    文章图片


    2、和其他AL结合
    比如姿态检测AL,能将人识别成一个火柴人,开发空间有不少用处。

    3、全身检测源码
    import cv2import timeimport mediapipe as mpmp_drawing = mp.solutions.drawing_utilsmp_holistic = mp.solutions.holisticholistic = 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"):breakholistic.close()

    运行效果如下:
    晒晒我帅气的舍友
    基于Mediapipe+Opencv实现手势检测功能
    文章图片

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

      推荐阅读