计算机视觉之手势、面部、姿势捕捉以Python Mediapipe为工具
计算机视觉之手势、面部、姿势捕捉以 Python Mediapipe为工具
文章目录
- 1.`Mediapipe`库概述
- 2.手势捕捉(`hands`)
- 3.面部捕捉(`face`)
- 4.姿势捕捉(`pose`)
1.Mediapipe
库概述
Mediapipe
是一个开源且强大的Python库,由Google开发和维护。它提供了丰富的工具和功能,用于处理实时多媒体数据。它可以帮助开发者快速构建各种视觉和音频处理应用,并允许他们灵活地定制和扩展库的功能。
Mediapipe库的主要功能包括:
- 视觉处理:Mediapipe可以进行人脸检测、姿势估计、手部跟踪等。它通过使用预训练的模型和算法来分析图像或视频,并提供相应的结果。这使得开发者能够轻松地实现各种视觉处理任务。
- 音频处理:Mediapipe还可以进行音频信号的处理,例如语音识别、音频增强、语音转换等。它提供了一些内置的音频处理模块,开发者可以使用这些模块来快速构建自己的音频处理流水线。
- 数据流处理:Mediapipe库还提供了一套用于处理数据流的工具。开发者可以使用这些工具来构建复杂的数据处理流程,包括数据的输入、输出、转换和合并等。这使得开发者能够更方便地处理实时多媒体数据流。
本期博客,作者将分享使用Mediapipe
库实现手势、面部、动作识别的方法。
2.手势捕捉(hands
)
该段代码使用OpenCV
和MediaPipe
库来检测摄像头视频中的手部,并在图像上绘制关键点和连接线。
import cv2
import time
import mediapipe as mpcapture = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0while (capture.isOpened()):retval, img = capture.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = hands.process(imgRGB)if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:for id, lm in enumerate(handLms.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:"+str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 2,(0, 0, 255), 2)cv2.imshow("Video", img) key = cv2.waitKey(1)if key == 32:breakcapture.release()
cv2.destroyAllWindows()
效果展示:
关于代码,具体解释如下:
-
导入所需的库:
- cv2:用于处理图像和视频的
OpenCV
库。 - time:用于计算帧率的
Python
标准库。 - mediapipe as mp:
MediaPipe
库,用于手部检测和姿态估计。
- cv2:用于处理图像和视频的
-
创建视频捕获对象:
- 使用
cv2.VideoCapture(0)
创建一个视频捕获对象,参数0表示使用默认摄像头。
- 使用
-
初始化MediaPipe手部检测器:
- 使用
mp.solutions.hands.Hands()
创建一个手部检测器对象。 hands.process(imgRGB)
将每个视频帧传递给检测器进行处理,并返回检测结果。
- 使用
-
处理每个视频帧:
- 使用
capture.read()
读取视频帧,并将返回的结果存储在retval
和img
变量中。 - 使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。 - 使用
hands.process(imgRGB)
对图像进行手部检测,返回结果保存在results
变量中。
- 使用
-
绘制检测结果:
- 使用
results.multi_hand_landmarks
判断是否检测到了手部。 - 对于每个检测到的手部,使用
handLms.landmark
遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。 - 使用
cv2.circle()
在图像中绘制关键点圆圈。 - 使用
mpDraw.draw_landmarks()
在图像中绘制手部关键点和连接线。
- 使用
-
计算帧率:
- 使用
time.time()
获取当前时间戳,计算时间间隔以确定帧率。 - 使用
cv2.putText()
在图像上显示帧率。
- 使用
-
显示图像并等待按键:
- 使用
cv2.imshow()
显示处理后的图像。 - 使用
cv2.waitKey(1)
等待用户按键,参数1表示等待1毫秒。
- 使用
-
释放资源:
- 在循环结束后,使用
capture.release()
释放视频捕获对象。 - 使用
cv2.destroyAllWindows()
关闭所有窗口。
- 在循环结束后,使用
-
退出程序:
- 按下空格键(32)可以退出程序。
3.面部捕捉(face
)
该段代码使用OpenCV和MediaPipe库来检测摄像头视频中的人脸,并在图像上绘制人脸关键点和轮廓。
import cv2
import time
import mediapipe as mpcapture = cv2.VideoCapture(0)mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh()
mpDraw = mp.solutions.drawing_utilspTime = 0 # 上一帧的时间
cTime = 0 # 下一帧的时间while (capture.isOpened()):retval, img = capture.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = faceMesh.process(imgRGB)if results.multi_face_landmarks:for faceLms in results.multi_face_landmarks:for id, lm in enumerate(faceLms.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)# cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)cv2.imshow("Video", img)key = cv2.waitKey(1)if key == 32:breakcapture.release()
cv2.destroyAllWindows()
以电影情节画面替代摄像头画面,代码效果展示如下:
以下是代码的解释:
-
导入所需的库:
- cv2:用于处理图像和视频的OpenCV库。
- time:用于计算帧率的标准Python库。
- mediapipe as mp:MediaPipe库,用于人脸检测和特征点估计。
-
创建视频捕获对象:
- 使用
cv2.VideoCapture(0)
创建一个视频捕获对象,参数0表示使用默认摄像头。
- 使用
-
初始化MediaPipe人脸检测器:
- 使用
mp.solutions.face_mesh.FaceMesh()
创建一个人脸检测器对象。 faceMesh.process(imgRGB)
将每个视频帧传递给检测器进行处理,并返回检测结果。
- 使用
-
处理每个视频帧:
- 使用
capture.read()
读取视频帧,并将返回的结果存储在retval
和img
变量中。 - 使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。 - 使用
faceMesh.process(imgRGB)
对图像进行人脸检测,返回结果保存在results
变量中。
- 使用
-
绘制检测结果:
- 使用
results.multi_face_landmarks
判断是否检测到了人脸。 - 对于每个检测到的人脸,使用
faceLms.landmark
遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。 - 使用
mpDraw.draw_landmarks()
在图像中绘制人脸关键点和轮廓。
- 使用
-
计算帧率:
- 使用
time.time()
获取当前时间戳,计算时间间隔以确定帧率。 - 使用
cv2.putText()
在图像上显示帧率。
- 使用
-
显示图像并等待按键:
- 使用
cv2.imshow()
显示处理后的图像。 - 使用
cv2.waitKey(1)
等待用户按键,参数1表示等待1毫秒。
- 使用
-
释放资源:
- 在循环结束后,使用
capture.release()
释放视频捕获对象。 - 使用
cv2.destroyAllWindows()
关闭所有窗口。
- 在循环结束后,使用
-
退出程序:
- 按下空格键(32)可以退出程序。
4.姿势捕捉(pose
)
该段代码使用OpenCV和MediaPipe库来检测摄像头视频中的人体姿势,并在图像上绘制关键点和连接线。
import cv2
import time
import mediapipe as mpvideo = cv2.VideoCapture(0)
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utilspTime = 0 # 上一帧的时间
cTime = 0 # 下一帧的时间while True:retval, img = video.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = pose.process(imgRGB)if results.pose_landmarks:for id, lm in enumerate(results.pose_landmarks.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)cv2.imshow("Video", img)key = cv2.waitKey(10)if key == 32:breakvideo.release()
cv2.destroyAllWindows()
效果展示:
以下是代码的解释:
-
导入所需的库:
- cv2:用于处理图像和视频的OpenCV库。
- time:用于计算帧率的标准Python库。
- mediapipe as mp:MediaPipe库,用于人体姿势检测。
-
创建视频捕获对象:
- 使用
cv2.VideoCapture(0)
创建一个视频捕获对象,参数0表示使用默认摄像头。
- 使用
-
初始化MediaPipe人体姿势检测器:
- 使用
mp.solutions.pose.Pose()
创建一个人体姿势检测器对象。 pose.process(imgRGB)
将每个视频帧传递给检测器进行处理,并返回检测结果。
- 使用
-
处理每个视频帧:
- 使用
video.read()
读取视频帧,并将返回的结果存储在retval
和img
变量中。 - 使用
cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。 - 使用
pose.process(imgRGB)
对图像进行人体姿势检测,返回结果保存在results
变量中。
- 使用
-
绘制检测结果:
- 使用
results.pose_landmarks
判断是否检测到了人体姿势。 - 对于每个检测到的关键点,使用
landmark
遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。 - 使用
cv2.circle()
在图像中绘制关键点圆圈。 - 使用
mpDraw.draw_landmarks()
在图像中绘制人体姿势关键点和连接线。
- 使用
-
计算帧率:
- 使用
time.time()
获取当前时间戳,计算时间间隔以确定帧率。 - 使用
cv2.putText()
在图像上显示帧率。
- 使用
-
显示图像并等待按键:
- 使用
cv2.imshow()
显示处理后的图像。 - 使用
cv2.waitKey(10)
等待用户按键,参数10表示等待10毫秒。
- 使用
-
释放资源:
- 在循环结束后,使用
video.release()
释放视频捕获对象。 - 使用
cv2.destroyAllWindows()
关闭所有窗口。
- 在循环结束后,使用
-
退出程序:
- 按下空格键(32)可以退出程序。
附:侯小啾Python基础领航计划专栏已上线,特价专栏只需9.9即可扫清入门路上一切障碍。
跟着小啾,入门无忧!无论是系统化学习,还是碎片化学习都是很好的选择,点击下方链接即可订阅:
https://blog.csdn.net/weixin_48964486/category_12510091.html
更多精彩内容敬请期待,作者侯小啾持续为您推出!
相关文章:

计算机视觉之手势、面部、姿势捕捉以Python Mediapipe为工具
计算机视觉之手势、面部、姿势捕捉以 Python Mediapipe为工具 文章目录 1.Mediapipe库概述2.手势捕捉(hands)3.面部捕捉(face)4.姿势捕捉(pose) 1.Mediapipe库概述 Mediapipe是一个开源且强大的Python库,由Google开发和维护。它提供了丰富的工具和功能,…...

基于AWS Serverless的Glue服务进行ETL(提取、转换和加载)数据分析(一)——创建Glue
1 通过Athena查询s3中的数据 此实验使用s3作为数据源 ETL: E extract 输入 T transform 转换 L load 输出 大纲 1 通过Athena查询s3中的数据1.1 架构图1.2 创建Glue数据库1.3 创建爬网程序1.4 创建表1.4.1 爬网程序创建表1.4.2 手动创建表 1…...

Vue学习计划-Vue2--VueCLi(二)vuecli脚手架创建的项目内部主要文件分析
1. 文件分析 1. 补充: 什么叫单文件组件? 一个文件中只有一个组件 vue-cli创建的项目中,.vue的文件都是单文件组件,例如App.vue 2. 进入分析 1. package.json: 项目依赖配置文件: 如图,我们说主要的属性…...

spring boot项目如何自定义参数校验规则
spring boot项目对参数进行校验时,比如非空校验,可以直接用validation包里面自带的注解。但是对于一些复杂的参数校验,自带的校验规则无法满足要求,此时需要我们自定义参数校验规则。自定义校验规则和自带的规则实现方式一样&…...

springboot整合xxl-job,通过代码进行调度中心注册开启任务等
背景:由于工作需要,当用户在登录时自动触发定时任务。而不需要我们手动到调度中心管理页面去创建任务。 工程介绍:分为两个项目,第一个是调度中心的项目(xxl-job-admin)。第二个是我们自己的项目࿰…...

k8s集群部分使用gpu资源的pod出现UnexpectedAdmissionError问题
记录一次排查UnexpectedAdmissionError问题的过程 1. 问题 环境 3master节点N个GPU节点 kubelet版本:v1.19.4 kubernetes版本:v1.19.4 生产环境K8S集群,莫名其妙的出现大量UnexpectedAdmissionError状态的Pod,导致部分任务执…...

自定义 el-select 和 el-input 样式
文章目录 需求分析el-select 样式el-input 样式el-table 样式 需求 自定义 选择框的下拉框的样式和输入框 分析 el-select 样式 .select_box{// 默认placeholder:deep .el-input__inner::placeholder {font-size: 14px;font-weight: 500;color: #3E534F;}// 默认框状态样式更…...
解决本地centos虚拟机重启,自动变换 ip 地址的问题
修改网卡配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 原配置: TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no" BOOTPROTO"dhcp" DEFROUTE"yes" IPV4_FAILURE_FATAL"no" IPV6INI…...
pt36项目短信OAth2.0
5、短信验证码 1、注册容联云账号,登录并查看开发文档(以下分析来自接口文档) 2、开发文档【准备1】:请求URL地址1.示例:https://app.cloopen.com:8883/2013-12-26/Accounts/{}/SMS/TemplateSMS?sig{}ACCOUNT SID# s…...

教师们如何一对一私发成绩?
在传统的教育中,老师通常会通过班级群或家长会等方式发布学生的成绩信息。然而,这种公开的方式可能会让一些学生感到尴尬和不安,因为他们可能不愿意让其他人知道他们的成绩情况。为了解决这个问题,今天我就给老师们推荐一款免费的…...

12.11
1.q,w,e亮led1,2,3; a,s,d灭led1,2,3; main.c #include "uar1.h"#include "led.h"void delay(int ms){int i,j;for(i0;i<ms;i){for…...
Spring JdbcTemplate
一、简介 Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多的操作模板类。 针对操作关系型数据: jdbcTemplateHibe…...

力扣编程题算法初阶之双指针算法+代码分析
目录 第一题:复写零 第二题:快乐数: 第三题:盛水最多的容器 第四题:有效三角形的个数 第一题:复写零 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路: 上期…...

实现安装“自由化”!在Windows 11中如何绕过“您尝试安装的应用程序未通过微软验证”
这篇文章描述了如果你不能安装应用程序,而是当你在Windows 11中看到消息“您尝试安装的应用程序未通过微软验证”时该怎么办。完成这些步骤将取消你安装的应用程序必须经过Microsoft验证的要求。 使用设置应用程序 “设置”应用程序提供了绕过此警告消息的最简单方法,以便你…...

【mysql】下一行减去上一行数据、自增序列场景应用
背景 想获取if_yc为1连续账期数据 思路 获取所有if_yc为1的账期数据下一行减去上一行账期,如果为1则为连续,不等于1就为断档获取不等于1的最小账期,就是离当前账期最近连续账期 代码 以下为mysql语法: select acct_month f…...

CLIP在Github上的使用教程
CLIP的github链接:https://github.com/openai/CLIP CLIP Blog,Paper,Model Card,Colab CLIP(对比语言-图像预训练)是一个在各种(图像、文本)对上进行训练的神经网络。可以用自然语…...

入职字节外包一个月,我离职了。。。
有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…...
SpringBoot的web开发
与其明天开始,不如现在行动! 文章目录 web开发1 web场景1.1 自动配置1.2 默认效果 💎总结 web开发 SpringBoot的web开发能力是由SpringMVC提供的 1 web场景 1.1 自动配置 整合web场景 <dependency><groupId>org.springframewo…...
传染病传播速度
题干 R0值是基本传染数的简称,指的是在没有采取任何干预措施的情况下,平均每位感染者在传染期内使易感者个体致病的数量。数字越大说明传播能力越强,控制难度越大。一个人传染的人的数量可以用幂运算来计算。假设奥密克戎的R0为10࿰…...

前端打包环境配置步骤
获取node安装包并解压 获取node安装包 wget https://npmmirror.com/mirrors/node/v16.14.0/node-v16.14.0-linux-x64.tar.xz 解压 tar -xvf node-v16.14.0-linux-x64.tar.xz 创建软链接 sudo ln -s 此文件夹的绝对路径/bin/node /usr/local/bin/node,具体执行如下…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...