有关介绍

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。它同样支持很多的AI功能,我们这里主要用Opencv来进行图像的处理,识别工作则由Mediapipe完成,有关Opencv的函数都在之前的博客上做过说明了。

Mediapipe是谷歌的一个开源的框架,它支持许多种常见的AI功能,比如人脸检测,手势跟踪,人体姿态检测等等,这次我们需要使用到的是Mediapipe的手势模型,它是谷歌官方训练并开源的一个用于手势检测的工具,因此我们就不需要自己训练模型,只需要调用这个工具就可以了。

检测原理

Mediapipe的hands检测模块通过训练好的模型,能够检测出人手上的21个关节节点,并返回它们在图像中的位置(三维),将它们在图像中标注并用线条连起来,就能够得到如下完整的手势,通过计算各点间的距离和深度就可以实现简单的手势判别。

关于环境配置

这里我使用的是pycharm,也可以使用其他开发环境,然后在下载安装mediapipe的时候发现自己用3.9版本安装不了,后来改用了3.7就没问题了(也有可能是其他原因导致的)

程序思路

导入相关的函数包后,捕获笔记本内置的摄像头(当然通过修改参数也可以改为usb连接的摄像头,比如改成1),然后对函数名进行简化(不然太长了),接着调用hands模块配置识别的参数(包括识别严谨程度,追踪信任程度等等,下面有介绍),然后简化一下用来画点和线的函数,接着可以开始设置点和线的颜色及粗细,然后再将两个变量赋值为0(后面要用来计算每秒帧数),接着写一个简单的读取视频的循环(前面的博客中有这个循环,这里不做过多介绍),然后在循环中需要将BGR图像转化为RGB图像,因为mediapipe默认读入的是RGB,而Opencv是BGR,然后将转化过的图像导入模块中进行识别,接着需要得到视频中每一帧图像的高和宽,调用.shape函数即可,然后判断如果进行模块识别之后识别到了手,那么就循环所得到的坐标,调用draw_landmarks函数画出线和点,然后使用enimerate函数列出数据及其下标(这样才能标注出该关节是第几个点),接着需要用得到的坐标乘以前面用.shape得出来的函数求出真正的x,y坐标并转化为整数(这是因为media的landmark返回的是x,y在图像中的百分比坐标,我们需要乘上宽和高才能得出数值坐标),之后我们就可以应用得到的关节坐标,调用函数在关节旁边画出对应的编号,以及打印出实时的关节坐标,接下来我们用time模块写一个小算法就可以得出每秒帧数并将其写在图像上,最后判断一下,如果按下q键,就终止循环,关闭摄像头)。

源码

import cv2
import mediapipe as mp
import time#用于得知当前时间
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)#捕获摄像头,0一般是笔记本的内置摄像头,1,2,3等等则是接在usb口上的摄像头
mpHands = mp.solutions.hands#简化函数名
hands = mpHands.Hands(False,4,1,0.7,0.7)#配置侦测过程中的相关参数
mpDraw = mp.solutions.drawing_utils#画点用的函数
handLmStyle = mpDraw.DrawingSpec(color = (0,0,255),thickness = 5)#点的样式,#线的样式BGR,前一个参数是颜色,后一个是粗细
handConStyle = mpDraw.DrawingSpec(color = (0,255,0),thickness = 10)#线的样式BGR,#线的样式BGR,前一个参数是颜色,后一个是粗细
pTime = 0
cTime = 0
while True:#读取视频的循环ret,img = cap.read()#读入每一帧图像if ret:#如果读取不为空值,则显示画面imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#将BGR图像转化为RGB图像,因为mediapie需要的是RGBresult = hands.process(imgRGB)#导入图像进行识别#print(result.multi_hand_landmarks)imgHeight = img.shape[0]#得到图像的高imgWeight = img.shape[1]#得到图像的宽if result.multi_hand_landmarks:for handLms in result.multi_hand_landmarks:#循环一遍所有的坐标mpDraw.draw_landmarks(img,handLms,mpHands.HAND_CONNECTIONS,handLmStyle,handConStyle)#画出点和线for i,lm in enumerate(handLms.landmark):xPos = int(imgWeight*lm.x)#将坐标转化为整数yPos = int(imgHeight*lm.y)cv2.putText(img,str(i),(xPos-25,yPos+5),cv2.FONT_HERSHEY_PLAIN,1,(0,0,255),2)#将手上对应的点的编号打印在图片上print(i,xPos,yPos)#将坐标打印出来cTime = time.time()#得到当前时间fps = 1/(cTime-pTime)#用1除以播放一帧所用时间就可以得出每秒帧数pTime = cTime#得到这一帧结束时的时间cv2.putText(img,f"FPS:{int(fps)}",(30,50),cv2.FONT_HERSHEY_PLAIN,2,(255,0,0),2)#将得到的帧数信息打印在图片上cv2.imshow("img", img)#展示图片if cv2.waitKey(1) ==ord("q"):#如果按下q键,则终止循环break

函数介绍(不是很准确,详细介绍看官网比较好)

mpHands.Hands(False,4,1,0.7,0.7):配置侦测过程中的相关参数(第六行)

False表示将要识别的不是一张单独的图片,是视频流,需要加上运动跟踪,如果改为True,则是读取单一图片,这里的4意思是最多识别4只手,这个可以自己看情况设置,1则是精准识别模式(会有一点消耗计算性能,但是影响不大,一般都带的动,改为可以降低计算负担,不过会降低精度)而第一个0.7意思是匹配程度需要大于70%,第二个0.7是追踪手部运动时的匹配程度也要大于70%,但是这两个参数设的越高,就需要越长的识别和判断时间,所以需要结合实际情况设置。

mpDraw.draw_landmarks(img,handLms,mpHands.HAND_CONNECTIONS,handLmStyle,handConStyle):画出点和线(第二十二行)

img是传入的要画点和线的图像,handLms是点的坐标,mpHands.HAND_CONNECTIONS是线的类型,这里选的是是手势线条,handLmStyle是点的样式,handConStyle是线的样式。

cv2.putText(img,str(i),(xPos-25,yPos+5),cv2.FONT_HERSHEY_PLAIN,2,(0,0,255),2):将手上对应的点的编号打印在图片上(二十六行)

img是传入的要打印内容的图像,str(i)是要打印的字符内容,cv2.FONT_HERSHEY_PLAIN是一种字体,1是字体的线条粗细,(0,0,255)是颜色设置,2是字体大小

运行效果(放不了视频,就放了截图)

 弯曲手指也能够识别

打印出来的各个关节的实时坐标

 结论:mediapipe提供的识别模块还是比较方便的,同时它也提供了人体躯干,脸部检测等很多其他模块,是一个比较常用到的框架。

												

基于Opencv+Mediapipe实现手势追踪相关推荐

  1. 使用Python基于OpenCV+MediaPipe追踪手势并控制音量

    利用Python基于OpenCV+MediaPipe追踪手势并实现控制音量 写在前面 说明 简介 1.OpenCV简介 2.MediaPipe简介 3.配置环境 开发环境 所需的库 最终效果演示 手部 ...

  2. 基于opencv的BackgroundSubtractorMOG2目标追踪

    基于opencv的BackgroundSubtractorMOG2目标追踪 BackgroundSubtractorMOG2是以高斯混合模型为基础的背景/前景分割算法.它是以2004年和2006年Z. ...

  3. 低成本VR手套Lucid再升级,利用柔性齿条来提升手势追踪

    年初的时候,青亭网曾报道过一款低成本VR力反馈手套开源方案LucidGloves,其制造成本只需要60美元,个人利用市面有售的元件即可DIY,阻力模拟和手势追踪效果足够优秀. LucidGloves的 ...

  4. 基于Opencv和Mediapipe实现手势控制音量

    前言 在先前的博客中已经实现过了手势追踪的基本功能,由于最近项目需要,开始学习封装操作,也为了更简洁的调用手势追踪模块,所以参照了Youtube上一位大佬的教程,把之前的追踪模块整理了一下,将代码封装 ...

  5. OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合

    OpenCV+Mediapipe手势动作捕捉与Unity引擎的结合 前言 Demo演示 认识Mediapipe 项目环境 手势动作捕捉部分 实时动作捕捉 核心代码 完整代码 Hands.py py代码 ...

  6. 基于mediapipe的手势数字识别

    基于mediapipe识别手势所对应的数字(一.二.三.四.五). mediapipe的官网 总体思路:mediapipe可以识别手掌的关键点,我的思路是识别单根手指是否弯曲,然后根据五根手指的弯曲程 ...

  7. 【VR】详解 Facebook Oculus团队的手势追踪系统——MegaTrack

    一.前言 二.论文分析 1.这篇论文讲的啥? 2.MegaTrack和谷歌同类产品的对比: 3.实现过程(共3部分) 3.1.DetNet--检测手部图像 3.2.KeyNet--生成手部关键点(2. ...

  8. 机器视觉 零基础Python+OpenCV+MediaPipe手势识别教程(一)手势识别基础入门

    本文禁止转载,如需转载需征得本人同意. 目录 前言 一.OpenCV及MediaPipe 二.实操步骤 1.下载 1.Pycharm的下载安装 2.Opencv和MediaPipe的下载安装 2.手势 ...

  9. 基于opencv的手势识别

    大家好,我是一名本科生,我的主要学习方向是计算机视觉以及人工智能.按照目前的学习进度来说,我就是一小白,在这里写下自己编写的程序,与大家分享,记录一下自己的成长. 今天与大家分享的是基于OpenCv的 ...

最新文章

  1. RMAN异机复制数据库(不同路径)
  2. 明年去哪里?简历先整理一波!
  3. redis php 守护进程,PHP守护进程利用Redis队列实现业务
  4. 什么是软件开发中的 green field 和 brown field 模式 - 绿地开发和棕地开发
  5. 系统架构图怎么画_简历的项目经历应该怎么写得好看?
  6. 开源项目中经常出现的七种错误
  7. 《转》Java字符串驻留池
  8. 入选 CVPR 2020的旷视论文,到底写了啥?
  9. url安全处理函数+php,php常用的url处理函数汇总
  10. 【Python小程序】第3讲:如何将json数据转换成csv格式?
  11. AIR ANE(本机扩展)使用中的一些问题(Android平台)
  12. 计算机硬件驱动备份,WinXp系统下该怎样备份电脑硬件驱动?【图文教程】
  13. Mac 用命令行彻底卸载VMware Fusion
  14. 2019美联社写作指南为区块链相关术语提供指导
  15. 二叉树的前序序列、中序序列、后序序列、层次序列
  16. 基于MFC的U盘检测与文件拷贝程序
  17. 高质量 Go 进阶图书,它来了
  18. POSCMS 后台自定义链接友情链接增加搜索功能
  19. 年薪120W的架构师简历你见过吗?java程序员该如何达到?
  20. 图灵机器人接口实现自动回复(web版)

热门文章

  1. 淘宝课程学习如何安排太原网络营销师强烈推荐
  2. 关于浏览器兼容性问题
  3. 微信小程序扫普通二维码跳转
  4. 门磁传感器分类与工作原理
  5. Centos7 安装 sftp
  6. html设置悬浮效果,html滑动仿悬浮球菜单效果的实现-电脑自学网
  7. SCA-Soft Composition Analysis软件成分分析
  8. 更可靠的3K画质行车记录仪,还支持AR导航功能,盯盯拍Z40上手
  9. Java从本地扫描文件上传服务器
  10. 手机可以做计算机一级,计算机一级office