Python+OpenCV手势识别Mediapipe(基础篇)

2023-10-27

前言

本篇文章适合刚入门OpenCV的同学们。文章将介绍如何使用Python利用OpenCV图像捕捉,配合强大的Mediapipe库来实现手势检测与识别;本系列后续还会继续更新Mediapipe手势的各种衍生项目,还请多多关注!

项目效果图

视频捕捉帧数稳定在(25-30)
在这里插入图片描述

认识Mediapipe

项目的实现,核心是强大的Mediapipe ,它是google的一个开源项目:

功能 详细
人脸检测 FaceMesh 从图像/视频中重建出人脸的3D Mesh
人像分离 从图像/视频中把人分离出来
手势跟踪 21个关键点的3D坐标
人体3D识别 33个关键点的3D坐标
物体颜色识别 可以把头发检测出来,并图上颜色

Mediapipe Dev
在这里插入图片描述
以上是Mediapipe的几个常用功能 ,这几个功能我们会在后续一一讲解实现
Python安装Mediapipe

pip install mediapipe==0.8.9.1

也可以用 setup.py 安装
https://github.com/google/mediapipe

项目环境

Python 3.7
Mediapipe 0.8.9.1
Numpy 1.21.6
OpenCV-Python 4.5.5.64
OpenCV-contrib-Python 4.5.5.64

在这里插入图片描述
实测也支持Python3.8-3.9

代码

核心代码

OpenCV摄像头捕捉部分

import cv2

cap = cv2.VideoCapture(0)       #OpenCV摄像头调用:0=内置摄像头(笔记本)   1=USB摄像头-1  2=USB摄像头-2

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)       #cv2图像初始化
    cv2.imshow("HandsImage", img)       #CV2窗体
    cv2.waitKey(1)      #关闭窗体

mediapipe 手势识别与绘制

#定义并引用mediapipe中的hands模块
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)       #cv2图像初始化
    results = hands.process(imgRGB)
    # print(results.multi_hand_landmarks)
    
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                # print(id, lm)
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                print(id, cx, cy)
                # if id == 4:
                cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
            
            #绘制手部特征点:
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)

视频帧率计算

import time

#帧率时间计算
pTime = 0
cTime = 0

while True
cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime

    cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                (255, 0, 255), 3)       #FPS的字号,颜色等设置

完整代码

# Coding BIGBOSSyifi
# Datatime:2022/4/24 21:41
# Filename:HandsDetector.py
# Toolby: PyCharm

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture(0)       #OpenCV摄像头调用:0=内置摄像头(笔记本)   1=USB摄像头-1  2=USB摄像头-2

#定义并引用mediapipe中的hands模块
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

#帧率时间计算
pTime = 0
cTime = 0

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)       #cv2图像初始化
    results = hands.process(imgRGB)
    # print(results.multi_hand_landmarks)
    
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                # print(id, lm)
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                print(id, cx, cy)
                # if id == 4:
                cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
            
            #绘制手部特征点:
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
    '''''
    视频FPS计算
       '''
    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime

    cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                (255, 0, 255), 3)       #FPS的字号,颜色等设置

    cv2.imshow("HandsImage", img)       #CV2窗体
    cv2.waitKey(1)      #关闭窗体

项目输出

在这里插入图片描述

结语

以此篇文章技术为基础,后续会更新利用此篇基础技术实现的手势控制:音量,鼠标
项目下载地址https://github.com/BIGBOSS-dedsec/HandsDetection_Python

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+OpenCV手势识别Mediapipe(基础篇) 的相关文章

随机推荐

  • 如何制作网站?如何制作网站教程

    如果公司企业想要知道如何制作网站 那么需要了解一些相关的内容 本文将介绍如何制作网站教程 希望对大家有所帮助 首先我们做好一些准备 域名 建站工具 图文素材 营业执照等资质 步骤一 创建站点 进入建站工具 24 fkw com 后 在工具中
  • 前端Vue自定义精美商品分类组件category 可用于电商应用分类页面

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • 贝叶斯分类

    贝叶斯分类 贝叶斯分类是一类分类算法的总称 这类算法均以贝叶斯定理为基础 故统称为贝叶斯分类 本文作为分类算法的第一篇 将首先介绍分类问题 对分类问题进行一个正式的定义 然后 介绍贝叶斯分类算法的基础 贝叶斯定理 最后 通过实例讨论贝叶斯分
  • [Cmake]源码编译安装Cmake

    源码编译安装Cmake 获取cmake软件包 解压并进入软件包目录 执行配置 编译和安装命令 设置环境变量 执行如下命令验证是否安装成功 获取cmake软件包 wget https cmake org files v3 18 cmake 3
  • PTA 7-3 求整数序列中出现次数最多的数 (10 分)

    本题要求统计一个整型序列中出现次数最多的整数及其出现次数 输入格式 输入在一行中给出序列中整数个数N 0
  • ELF文件头结构

    转自 https blog csdn net tangyuesb article details 54630787 ELF文件头结构定义在 usr include elf h 头文件下 ELF文件有32位版本和64位版本 故其头文件结构也有
  • 进度条教程【github.com/cheggaaa/pb】

    进度条 学习目标 学习内容 前置说明 一个简单的进度条案列 多个进度条的联合使用 进度条在文件Copy IO流的运行 学习总结 学习目标 了解进度条运行原理 掌握github com cheggaaa pb第三方依赖的函数 实践一个进度条
  • 【基础知识】什么是哈希冲突?

    1 什么是哈希表 哈希表 Hash Table 是一种数据结构 它可以快速地在大量数据中查找 插入和删除时数据 哈希表通过使用哈希函数将键 Key 映射到一个位置 然后在该位置存储或查找数据 哈希函数的作用是 将键转换为一个整数 这个整数通
  • linux下服务get请求发生400的问题

    今天遇到个郁闷的问题 平时在windows系统一直跑得好好的服务 在linux下图片请求出问题了 报了个莫名其妙的400问题 虽然我也怀疑问题出在params 22cols 22 22 22id 22 6 22 参数上 但把引号怎么改都改不
  • 【笔记】QString中替换掉指定字符串

    首先使用正则表达式QRegExp匹配指定字符串 然后使用QString的replace方法进行替换 QString originText KobeBryantGigiAitch QString searchText Bryant QStri
  • ubuntu下samba 安装与配置

    为了实现在windows与Linux之间资源共享 Linux操作系统提供了samba服务 samba服务为两种不同的操作系统架起一座桥梁 使Linux系统和windows系统之间可以互相通信 下面简单介绍如何在linux上添加和配置samb
  • 算法---分治策略(快排)

    分治策略之快速排序 快速排序是对冒泡排序算法的一种改进 快速排序在面试过程中被提到的概率还是很大的 本文章我将介绍一下有关快速排序的一些问题 算法思想 1 指定一个定界值 通过该值会将数组分成两部分 2 将大于定界值的数据都放在右边 小于等
  • LeetCode 3. 无重复字符的最长子串

    LeetCode 第三题 无重复字符的最长子串 难度中等 给定一个字符串 s 请你找出其中不含有重复字符的 最长子串 的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例
  • mysql中如何统计某字段里某个字符的个数

    如我的表order里有一个字段order num 里面存的是一些订单号 形式如 od 135484315315431541541 现在我要统计这个订单号有多少个8 如出现4个8就算中奖 请问如何把这些数据查找出来 select length
  • 查看Redis信息和状态

    redis cli连接服务器后 使用info命令查看Redis信息和状态 info 其中memory段显示了redis的内存使用状态 INFO section 以一种易于解释 parse 且易于阅读的格式 返回关于 Redis 服务器的各种
  • ESP32 模拟键盘的简单操作 (ESP32 for Arduino)

    本来是以前做过的ESP32项目 但是想拿来用在别的项目上时发现找不到了 所以重新写一下这个项目 记录一下 首先说明 使用ArduinoIDE 模块型号为esp32 wroom 32 库文件链接 https github com T vK E
  • 4sum

    基本的 穷举前面的数的组合 后两个数夹逼法的算法 O n 3 1 排序 2 主循环穷举前两个数的组合 保证数组至少剩下2个数 i 0 i
  • ssm毕设项目动态个人网站8j9pz(java+VUE+Mybatis+Maven+Mysql+sprnig)

    ssm毕设项目动态个人网站8j9pz java VUE Mybatis Maven Mysql sprnig 项目运行 环境配置 Jdk1 8 Tomcat8 5 Mysql HBuilderX Webstorm也行 Eclispe Int
  • 2022年国内十大低代码平台盘点,哪个值得一试?

    编者按 火爆的低代码平台究竟是什么 它有什么特殊的魅力一直吸引着大众的注意 本文将带你走近低代码 盘点国内典型的十大低代码平台 概要 1 什么是低代码平台 2 国内的低代码平台盘点 3 选型低代码平台时需要注意什么 什么是低代码平台 低代码
  • Python+OpenCV手势识别Mediapipe(基础篇)

    Python OpenCV手势识别Mediapipe 新手入门 前言 项目效果图 认识Mediapipe 项目环境 代码 核心代码 视频帧率计算 完整代码 项目输出 结语 前言 本篇文章适合刚入门OpenCV的同学们 文章将介绍如何使用Py