opencv之(多)手势识别

目录

一、开发环境

二、手势识别的概述

三、Hand Landmark模型

四、工具和依赖库安装

4.1 python下载及安装:

4.2 pycharm 安装

五、多手势识别源码

5.1 源码使用注意事项

5.2 运行效果展示


扫描二维码关注公众号,回复: 15493077 查看本文章

一、开发环境

1、pycharm

2、python3.9

3、opencv-python

4、mdiapipe-0.8.3

二、手势识别的概述

感知手的形状和运动的能力是改善各种技术领域和平台的用户体验的重要组成部分。例如,它可以形成手语理解和手势控制的基础,还可以在增强现实中实现数字内容和信息在物理世界之上的叠加。
MediaPipe Hands是一款高保真的手和手指跟踪解决方案。它使用机器学习(ML)从单个帧中推断出21个手的3D地标。当前最先进的方法主要依赖于强大的桌面环境进行推理,并且在移动电话上实现了实时性能,甚至可以扩展到多手。

三、Hand Landmark模型

在整个图像上进行手掌检测之后,Hand Landmark模型通过回归对检测到的手区域内的21个3D手关节坐标进行精确的关键点定位,即直接坐标预测。
为了获得训练的真实数据,使用了21个3D坐标手动标注了约30K幅真实的图像,如下所示(如果它存在于对应的坐标中,从图像中获取Z值)。为了更好地覆盖手部姿势,并提供对手部几何特性的额外监督,我们还可以在各种背景上渲染高质量的合成手部模型,并将其映射到相应的3D坐标。

 

四、工具和依赖库安装

4.1 python下载及安装:

  • 下载后双击运行,记得先勾选 “Add Python 3.9 to PATH ”,再点击 “Install Now” 安装

4.2 pycharm 安装

五、多手势识别源码

import cv2
import mediapipe as mp
import time

class handDetector():
    def __init__(self, mode=False, maxHands=2, complexity=1, detectionCon=0.5, trackCon=0.5):
        # 初始化类的参数
        self.mode = mode
        self.maxHands = maxHands
        self.complexity = complexity
        self.detectionCon = detectionCon
        self.trackCon = trackCon

        # 初始化手跟踪模块
        self.mpHands = mp.solutions.hands
        # mediapipe version: 0.8.11
        # self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.complexity,
        #                                 self.detectionCon, self.trackCon)
        # mediapipe version: 0.8.3
        self.hands = self.mpHands.Hands(self.mode, self.maxHands,
                                        self.detectionCon, self.trackCon)
        self.mpDraw = mp.solutions.drawing_utils

    # 跟踪手关节点位置
    def findHands(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)

        if self.results.multi_hand_landmarks:
            for handLms in self.results.multi_hand_landmarks:
                if draw:
                    self.mpDraw.draw_landmarks(img, handLms,
                                               self.mpHands.HAND_CONNECTIONS)
        return img

    # 对手关节点绘制圆圈
    def findPostion(self, img, handNo=0, draw=True):
        lmList = []
        if self.results.multi_hand_landmarks:
            for myHand in self.results.multi_hand_landmarks:
                for id, lm in enumerate(myHand.landmark):
                    h, w, c = img.shape
                    cx, cy = int(lm.x * w), int(lm.y * h)
                    lmList.append([id, cx, cy])
                    if draw:
                        cv2.circle(img, (cx, cy), 12, (255, 0, 255), cv2.FILLED)
        return lmList


def main():
    pTime = 0
    cTime = 0

    # 打开摄像机Camera0
    cap = cv2.VideoCapture(0)

    # 实例化类对象
    detector = handDetector()

    while True:
        # 读取摄像机的视频图像
        success, img = cap.read()

        # 跟踪关节点位置
        img = detector.findHands(img)

        # 对手关节点绘制圆圈
        lmList = detector.findPostion(img)

        # 计算实时帧率
        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        # 显示实时帧率
        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 2,
                    (255, 0, 255), 2)

        # 显示视频图像
        cv2.imshow("Image", img)
        cv2.waitKey(1)


if __name__ == "__main__":
    main()

5.1 源码使用注意事项

  • 本例程是基于 mediapipe-0.8.3 版本实现的 ,同时也兼容了 0.8.11 版本的代码实现。
  • 如果你已安装了 mediapipe-0.8.11 版本,可将已注释掉的代码打开,并将 0.8.3 版本相关的实现代码注释掉即可。
  • 0.8.11 比 0.8.3 版本多了一个 complexity 参数,同时手掌标识号的顺序也存在差异。

5.2 运行效果展示

猜你喜欢

转载自blog.csdn.net/m0_37383484/article/details/127616886