Mediapipe手势识别

这篇具有很好参考价值的文章主要介绍了Mediapipe手势识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mediapipe手势识别

代码:

import cv2
import mediapipe as mp
import time

mp_drawing = mp.solutions.drawing_utils  # 画线函数
mp_hands = mp.solutions.hands
drawing_spec = mp_drawing.DrawingSpec(thickness=2, circle_radius=1)
drawing_spec1 = mp_drawing.DrawingSpec(thickness=2, circle_radius=1, color=(255, 255, 255))

hands = mp_hands.Hands(
    min_detection_confidence=0.7, min_tracking_confidence=0.5
)
'''
Hands是一个类,他有四个初始化参数,
static_image_mode:是静态图片还是视频帧
max_num_hands:最多检测几只手
min_detection_confidence:置信度阈值
min_tracking_confidence:追踪阈值
'''
cap = cv2.VideoCapture(0)  # 获取视频对象,0是摄像头,也可以输入视频路径
time.sleep(2)

while cap.isOpened():
    success, image = cap.read()  # success是一个bool类型的,表示是否读取成功,image表示每一帧的图像(BGR存储)
    if not success:
        print("Ignoring empty camera frame.")
        continue
    image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)  # 将图片进行水平反转,并由原来的色彩空间转换成RGB
    image.flags.writeable = False
    results = hands.process(image)  # 处理图片
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)  # 再将图片转化为BGR

    if results.multi_hand_landmarks:  # 该变量非空,表示检测到了手,并且存放了检测到的手的个数
        for hand_landmarks in results.multi_hand_landmarks:
            '''
            如果有两只手,则每一次遍历获得的是每只手经过处理的21个关节点坐标的信息,也可以这么写:hand_0 = 
            results.multi_hand_landmarks[0] 
            '''
            mp_drawing.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS,
                                      landmark_drawing_spec=drawing_spec, connection_drawing_spec=drawing_spec1)  # 画线
    cv2.imshow('MediaPipe Hands', image)  # 将图片展示出来
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break
hands.close()
cap.release()

它训练的时候是使用了两个模型,第一个是手掌检测,第二个是在手掌范围内进行关节点的检测。这里面的三维坐标中的Z轴并不是绝对意义上的Z轴,而是相对于手腕的位置,正值说明在手腕的前方,负值在手腕的后方。x和y都是0~1之间的数字(经过归一化后的数字,用这个数字乘图像的长度和宽度就得到了绝对的位置坐标)。各个关节点的索引:

Mediapipe手势识别

设计一个合理的根据Z轴数值计算画线半径的函数,可以得到距离摄像头越近,关节点越大,否则关节点越小的效果,还可以设计不同的颜色,增加可玩性。

**思考:**result.multi_hand_landmarks中包含了检测到的所有手的关节点的坐标信息,可以将这些信息当作另外一个模型的输入,或者先将输出保存下来,制作数据集,然后进行下游任务训练。而且mediapipe这个工具底层是使用C++语言编写的,而且进行了加速优化,速度非常快,完全可以用它进行数据获取。

MediaPipe原文献:“MediaPipe Hands: On-device Real-time Hand Tracking论文阅读”

论文主要贡献:
  1. 提出了一个高效的实时的两阶段手部姿势追踪工作流。
  2. 通过输入彩色图像,可以获得一个2.5D的手部关节点。(深度是手部与手腕的深度,并且是猜出来的,并不是真实距离)
  3. 开箱即用的手部追踪工作流,并且支持多个平台,包括IOS、安卓、Web,桌面PC。
模型结构:

包含了两个机器学习工作流,第一个是手掌检测器,输出的是手掌的bounding box(包含了手掌的位置区域)。第二个是手部关节点检测的模型,输入是手掌的bounding box的图像,返回的是高质量的2.5D的21个关节点的坐标。

对于实时的关节点检测,它是从上一帧的关节点提取出来一个bounding box作为下一帧的输入,所以不需要重复进行手掌检测。什么时候进行手掌检测?第一帧以及画面中没有检测到手的时候。这样大大节省了时间,提升了效率。

手掌检测模型结构:

Mediapipe手势识别
第一,训练了一个手掌检测器代替手检测器。因为手掌或者拳头有着更加简单的形状相比于手指。

第二,使用了一个encoder-decoder的特征提取器,类似于FPN。

第三,损失函数使用了focal loss。

关节点检测模型:

Mediapipe手势识别

把刚刚提取到的手掌提取器框,输入到关节点检测模型中,得到21个关节点的2.5D坐标。

由于得到的是数值,因此是一个回归问题。该模型有三个输出:

  1. x、y、z坐标
  2. 手的置信度
  3. 左手还是右手

x,y的坐标是通过真实世界的手的照片进行标注得到的,也有一部分电脑生成的假手的图像。

z坐标是只通过电脑生成的图像进行训练的。(真实世界无法获得相对深度信息)

为了防止错误,还设置了一个置信度,如果置信度低于某个阈值,则手掌检测器会被重新启动。

对于左手和右手的判断对AR/VR有着极其重要的作用,

数据集

构建了三个子数据集:

  1. 真实世界的照片:包含六千张,不包含手的复杂动作。
  2. 实验室的数据集:特定条件下拍的,包含一万张。
  3. 电脑三维模型生成的图片,可以知道深度的标签。使用模型生成视频,再截取十万张图片。
MediaPipe的实现

Mediapipe手势识别
摄像机获取一张图片先送给HandDetection,检测到手掌之后裁剪出来,再送给HandLandmark,这个部分生成一个新的手掌区域送给下一帧,同时输出这一帧的结果。如果某一帧置信度低于某个阈值(检测不到手的存在),则重新使用摄像机捕捉。文章来源地址https://www.toymoban.com/news/detail-450126.html

到了这里,关于Mediapipe手势识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mediapipe 手势节点识别自动控制音量

    参考:https://www.computervision.zone/topic/volumehandcontrol-py/ 主函数: VolumeHandControl.py

    2024年02月11日
    浏览(28)
  • 基于opencv-mediapipe的手势识别

    上一篇文章介绍了基于opencv的手势识别,如果大家运行了我的代码,会发现代码中找出手部轮廓的效果不是很理想。当时我在网上找寻解决的办法,刚好找到了mediapip库,然后我就利用opencv和mediapipe这两个库重新进行了手势识别的代码编写。效果还不错,写篇文章记录一下。

    2024年02月09日
    浏览(37)
  • 基于python+opencv+mediapipe实现手势识别详细讲解

    目录 运行环境: 一、opencv 二、meidapipe配置 三、实现手部的识别并标注 1、参数分析 1.multi_hand_landmarks  2.multi_hand_world_landmarks 3.multi_handedness 2.绘制信息点和连线 python3.9.7  opencv-python4.6.0.66  mediapipe0.8.11 运行之前先要安装opencv-python、opencv-contrib-python、mediapipe 项目可能对版本的

    2024年01月25日
    浏览(35)
  • 使用MediaPipe和OpenCV的Python实现手势识别

    手势识别技术是一种非常有用的技术,它可以将人类的手势转化为计算机可以理解的形式,从而实现更加自然、快速和直观的交互方式。本文将介绍一种基于MediaPipe和OpenCV的手势识别技术,可以实现对手势的实时识别和分析。 MediaPipe是一种开源的机器学习框架,可以用于构建

    2024年02月14日
    浏览(37)
  • MediaPipe+OpenCV 实现实时手势识别(附Python源码)

    MediaPipe官网:https://developers.google.com/mediapipe MediaPipe仓库:https://github.com/google/mediapipe MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架,用于构建视觉和感知应用程序。它提供了一系列预训练的机器学习模型和工具,使开发者能够轻松地构建基于计算机视觉和机器学习的

    2024年02月07日
    浏览(34)
  • python+opencv+mediapipe实现手势检测上下左右(含完整代码)

    应用场景:ai换脸,根据左右手势选择图片,上下则表示选中。 版本号:python3.7(一开始是3.6,但是mediapipe最低就是3.7 因为网上检测的都不太准,所以我在判断的时候加入了如果70次里55次检测的是左才返回左,测试完之后效果还可以,蛮准的。判断方法想的头都要秃了。 实

    2024年04月11日
    浏览(36)
  • 姿态识别、手势识别(附代码)

    姿态识别技术是一种基于计算机视觉的人体姿态分析方法,可以通过分析人体的姿态,提取出人体的关键点和骨架信息,并对人体的姿态进行建模和识别。随着深度学习技术的发展,近年来姿态识别技术得到了广泛的应用和研究,其中Pose是一种基于深度学习的姿态识别工具包

    2023年04月25日
    浏览(33)
  • 手势识别MATLAB代码

    手势识别是智能设备常用的需求, 下面我们用MATLAB来识别手部的形态: 主程序main.m clc;clear all;close all;%清除命令行和窗口 im=imread(\\\'DSC05815.JPG\\\'); [skin,bwycbcr,w,h] = hand_segmentation(im); im1=bwycbcr; %  se = strel(\\\'ball\\\',[1 1 1;1 1 1;1 1 1]);  im1 = imdilate(im1,[1 1 1;1 1 1;1 1 1]);  figure;  imshow(im1);  titl

    2024年01月24日
    浏览(66)
  • MediaPipe上手案例,手部骨架识别,用视频替换代码摄像头采集

    在做 MediaPipe 项目的时候,经常需要唤醒摄像头进行视频采集,学习的时候可以使用视频替换摄像头采集动作,这就是本篇博客的的由来。 为了便于学习,我们先直接展示入门案例,然后查看从代码角度进行讲解。 为了让代码跑起来,需要提前安装 opencv-python 库和 mediapipe 库

    2023年04月17日
    浏览(25)
  • [ Python+OpenCV+Mediapipe ] 实现手势控制音量

    目录 一、写在前面 二、本文内容 三、开发环境  四、代码实现 4.1引入所需包 4.2 定义一个类并初始化 4.3 定义绘制一界面并实现音量控制的主方法 五、看一看实际效果吧 六、完整代码 七、小结  八、感谢        本文所用例子为个人学习的小结,如有不足之处请各位多多

    2024年02月22日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包