使用Python+MediaPipe实现人体手部关键点检测

释放双眼,带上耳机,听听看~!
本教程介绍如何使用Python和MediaPipe库实现人体手部关键点的检测,包含相关代码和实例。

前言

大家好,我是阿光。

本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

正在更新中~ ✨

🚨 我的项目环境:

  • 平台:Windows10
  • 语言环境:python3.7
  • 编译器:PyCharm
  • PyTorch版本:1.8.1

💥 项目专栏:【PyTorch深度学习项目实战100例】

使用Python+MediaPipe实现人体手部关键点检测

在这里插入图片描述

「安装所需模块:」

pip install cv2
pip install midiapipe

MediaPipe

MediaPipe 为直播和流媒体提供跨平台、可定制的机器学习解决方案。

  • 端到端加速引擎:内置的快速 ML 推理和处理即使在常见硬件上也能加速
  • 一次构建,任意部署:统一解决方案适用于 Android、iOS、桌面/云、Web 和物联网
  • 即用型解决方案:先进的机器学习解决方案展示了框架的全部功能
  • 免费开源:Apache 2.0下的框架和解决方案,完全可扩展和可定制

使用Python+MediaPipe实现人体手部关键点检测

image-20211205181548455

「MediaPipe主要应用:」

  • 人脸检测
  • 脸部几何
  • 物体检测
  • 即时物体追踪

我们首先构建一个Hand对象,然后创建hands和mpDraw两个对象,分别用于检测手和绘制手指关键点。

「手地标模型:」

使用Python+MediaPipe实现人体手部关键点检测

image-20211205182136432

mpHands = mp.solutions.hands
hands = mpHands.Hands(args.mode, args.maxHands, args.model_complexity, args.detectionCon, args.trackCon)  # 用于检测手
mpDraw = mp.solutions.drawing_utils  # 绘制关键点
results = 0

使用Python+MediaPipe实现人体手部关键点检测

image-20211205182145584

该对象会识别出人手的21个关键点部位,如上图所示,21个关键点分别对应人手的不同关节位置,用于定位手的位置。

def findHands(img, draw=True):
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    global results
    results = hands.process(imgRGB)

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

    return img

该段代码用于检测图像中的手,首先将图片转成RGB图像,然后利用hands对象进行识别,然后再使用mpDrwa在人手上绘制关键点。

# 获取关节点位置
def findPosition(img, draw=True):
    lmLists = []

    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmLists.append([id, cx, cy])
                if draw:
                    cv2.circle(img, (cx, cy), 12, (255, 0, 255), cv2.FILLED)

    return lmLists

如果已经检测到手部,之后会进行检测关键点位置,将其进行返回,返回的是一个包含21个元素的列表,每个元素由为一个列表,内置有不同关键点的相对坐标。

if len(lmList) != 0:
            max_list = [lmList[4][2], lmList[8][2], lmList[12][2], lmList[16][2], lmList[20][2]]  # 每个手指的尖端部位

            count = 0  # 手势数字结果

            # 手势为4
            if max_list[1] < lmList[9][2] and max_list[2] < lmList[9][2] and max_list[3] < lmList[9][2] and max_list[
                4] < 
                    lmList[9][2] and max_list[0] > lmList[9][2] and max_list[0] > lmList[17][2]:
                count = 4
            # 手势为3
            elif max_list[1] < lmList[9][2] and max_list[2] < lmList[9][2] and max_list[3] < lmList[9][2] and 
                    lmList[20][
                        2] > lmList[9][2]:
                count = 3
            # 手势为2
            elif max_list[1] < lmList[9][2] < lmList[16][2] and max_list[2] < lmList[9][2] < lmList[20][2]:
                count = 2
            # 手势为1
            elif max_list[1] < lmList[9][2] < lmList[16][2] and lmList[20][2] > lmList[9][2] and lmList[12][2] > 
                    lmList[9][
                        2]:
                count = 1
            # 手势为5
            else:
                count = 5

该段代码用于进行手势识别,按照21个关键点的相对位置,判断此时图像的手势情况。

使用Python+MediaPipe实现人体手部关键点检测

image-20211205182825010

完整代码

本项目可以使用文件输入和摄像头进行输入,下面代码采用的是文件输入,如果需要使用摄像头作为输入源,只需要将 cap = cv2.VideoCapture("video/finger3.MP4") 内部参数置为0即可,不过还需要调整一下其它位置,这里不做过多叙述。

【PyTorch深度学习项目实战100例】—— Python+OpenCV+MediaPipe手势识别系统 | 第2例_咕 嘟的博客-CSDN博客_python深度学习实战

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

序列到序列模型:NLP领域核心技术

2023-11-27 20:30:14

AI教程

MIT Mathematics and EECS Curriculum Research Controversy: A Detailed Analysis

2023-11-27 20:46:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索