计算机视觉之手势、面部、姿势捕捉以Python Mediapipe为工具

计算机视觉之手势、面部、姿势捕捉以 Python Mediapipe为工具

文章目录

  • 1.`Mediapipe`库概述
  • 2.手势捕捉(`hands`)
  • 3.面部捕捉(`face`)
  • 4.姿势捕捉(`pose`)

1.Mediapipe库概述

Mediapipe是一个开源且强大的Python库,由Google开发和维护。它提供了丰富的工具和功能,用于处理实时多媒体数据。它可以帮助开发者快速构建各种视觉和音频处理应用,并允许他们灵活地定制和扩展库的功能。

Mediapipe库的主要功能包括:

  1. 视觉处理:Mediapipe可以进行人脸检测、姿势估计、手部跟踪等。它通过使用预训练的模型和算法来分析图像或视频,并提供相应的结果。这使得开发者能够轻松地实现各种视觉处理任务。
  2. 音频处理:Mediapipe还可以进行音频信号的处理,例如语音识别、音频增强、语音转换等。它提供了一些内置的音频处理模块,开发者可以使用这些模块来快速构建自己的音频处理流水线。
  3. 数据流处理:Mediapipe库还提供了一套用于处理数据流的工具。开发者可以使用这些工具来构建复杂的数据处理流程,包括数据的输入、输出、转换和合并等。这使得开发者能够更方便地处理实时多媒体数据流。

本期博客,作者将分享使用Mediapipe库实现手势、面部、动作识别的方法。
    在这里插入图片描述


2.手势捕捉(hands)

该段代码使用OpenCVMediaPipe库来检测摄像头视频中的手部,并在图像上绘制关键点和连接线。

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()

效果展示:
      在这里插入图片描述


关于代码,具体解释如下:

  1. 导入所需的库:

    • cv2:用于处理图像和视频的OpenCV库。
    • time:用于计算帧率的Python标准库。
    • mediapipe as mp:MediaPipe库,用于手部检测和姿态估计。
  2. 创建视频捕获对象:

    • 使用cv2.VideoCapture(0)创建一个视频捕获对象,参数0表示使用默认摄像头。
  3. 初始化MediaPipe手部检测器:

    • 使用mp.solutions.hands.Hands()创建一个手部检测器对象。
    • hands.process(imgRGB)将每个视频帧传递给检测器进行处理,并返回检测结果。
  4. 处理每个视频帧:

    • 使用capture.read()读取视频帧,并将返回的结果存储在retvalimg变量中。
    • 使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。
    • 使用hands.process(imgRGB)对图像进行手部检测,返回结果保存在results变量中。
  5. 绘制检测结果:

    • 使用results.multi_hand_landmarks判断是否检测到了手部。
    • 对于每个检测到的手部,使用handLms.landmark遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。
    • 使用cv2.circle()在图像中绘制关键点圆圈。
    • 使用mpDraw.draw_landmarks()在图像中绘制手部关键点和连接线。
  6. 计算帧率:

    • 使用time.time()获取当前时间戳,计算时间间隔以确定帧率。
    • 使用cv2.putText()在图像上显示帧率。
  7. 显示图像并等待按键:

    • 使用cv2.imshow()显示处理后的图像。
    • 使用cv2.waitKey(1)等待用户按键,参数1表示等待1毫秒。
  8. 释放资源:

    • 在循环结束后,使用capture.release()释放视频捕获对象。
    • 使用cv2.destroyAllWindows()关闭所有窗口。
  9. 退出程序:

    • 按下空格键(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()

以电影情节画面替代摄像头画面,代码效果展示如下:
在这里插入图片描述


以下是代码的解释:

  1. 导入所需的库:

    • cv2:用于处理图像和视频的OpenCV库。
    • time:用于计算帧率的标准Python库。
    • mediapipe as mp:MediaPipe库,用于人脸检测和特征点估计。
  2. 创建视频捕获对象:

    • 使用cv2.VideoCapture(0)创建一个视频捕获对象,参数0表示使用默认摄像头。
  3. 初始化MediaPipe人脸检测器:

    • 使用mp.solutions.face_mesh.FaceMesh()创建一个人脸检测器对象。
    • faceMesh.process(imgRGB)将每个视频帧传递给检测器进行处理,并返回检测结果。
  4. 处理每个视频帧:

    • 使用capture.read()读取视频帧,并将返回的结果存储在retvalimg变量中。
    • 使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。
    • 使用faceMesh.process(imgRGB)对图像进行人脸检测,返回结果保存在results变量中。
  5. 绘制检测结果:

    • 使用results.multi_face_landmarks判断是否检测到了人脸。
    • 对于每个检测到的人脸,使用faceLms.landmark遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。
    • 使用mpDraw.draw_landmarks()在图像中绘制人脸关键点和轮廓。
  6. 计算帧率:

    • 使用time.time()获取当前时间戳,计算时间间隔以确定帧率。
    • 使用cv2.putText()在图像上显示帧率。
  7. 显示图像并等待按键:

    • 使用cv2.imshow()显示处理后的图像。
    • 使用cv2.waitKey(1)等待用户按键,参数1表示等待1毫秒。
  8. 释放资源:

    • 在循环结束后,使用capture.release()释放视频捕获对象。
    • 使用cv2.destroyAllWindows()关闭所有窗口。
  9. 退出程序:

    • 按下空格键(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()

效果展示:

        在这里插入图片描述


以下是代码的解释:

  1. 导入所需的库:

    • cv2:用于处理图像和视频的OpenCV库。
    • time:用于计算帧率的标准Python库。
    • mediapipe as mp:MediaPipe库,用于人体姿势检测。
  2. 创建视频捕获对象:

    • 使用cv2.VideoCapture(0)创建一个视频捕获对象,参数0表示使用默认摄像头。
  3. 初始化MediaPipe人体姿势检测器:

    • 使用mp.solutions.pose.Pose()创建一个人体姿势检测器对象。
    • pose.process(imgRGB)将每个视频帧传递给检测器进行处理,并返回检测结果。
  4. 处理每个视频帧:

    • 使用video.read()读取视频帧,并将返回的结果存储在retvalimg变量中。
    • 使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)将图像从BGR格式转换为RGB格式,以便与MediaPipe兼容。
    • 使用pose.process(imgRGB)对图像进行人体姿势检测,返回结果保存在results变量中。
  5. 绘制检测结果:

    • 使用results.pose_landmarks判断是否检测到了人体姿势。
    • 对于每个检测到的关键点,使用landmark遍历所有关键点,并将其坐标从归一化坐标转换为图像上的实际坐标。
    • 使用cv2.circle()在图像中绘制关键点圆圈。
    • 使用mpDraw.draw_landmarks()在图像中绘制人体姿势关键点和连接线。
  6. 计算帧率:

    • 使用time.time()获取当前时间戳,计算时间间隔以确定帧率。
    • 使用cv2.putText()在图像上显示帧率。
  7. 显示图像并等待按键:

    • 使用cv2.imshow()显示处理后的图像。
    • 使用cv2.waitKey(10)等待用户按键,参数10表示等待10毫秒。
  8. 释放资源:

    • 在循环结束后,使用video.release()释放视频捕获对象。
    • 使用cv2.destroyAllWindows()关闭所有窗口。
  9. 退出程序:

    • 按下空格键(32)可以退出程序。

附:侯小啾Python基础领航计划专栏已上线,特价专栏只需9.9即可扫清入门路上一切障碍。
跟着小啾,入门无忧!无论是系统化学习,还是碎片化学习都是很好的选择,点击下方链接即可订阅:
https://blog.csdn.net/weixin_48964486/category_12510091.html
更多精彩内容敬请期待,作者侯小啾持续为您推出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/210525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用K-means把人群分类

1.前言 K-mean 是无监督的聚类算法 算法分类: 2.实现步骤 1.数据加工:把数据转为全数字(比如性别男女,转换为0 和 1) 2.模型训练 fit 3.预测 3.代码 原数据类似这样(source:http:img-blog.csdnimg.cn…

Chat-GPT原理

Chat-GPT原理核心:基于Transformer 架构 ​ 以下是参考文献的部分截图原文说明: ​ Transformers are based on the “attention mechanism,” which allows the model to pay more attention to some inputs than others, regardless of where they show up in t…

vite初识

Vite是伴随着Vue3正式版一起发布的,最开始Vite 1.0的版本是为Vue3服务的,并不是跨框架的。之后半年时间左右,出现了Vite 2.0版本,Vite 2.0真正脱离了和Vue3的强关联,以插件的方式,可以集成到目前流行的主流…

技巧-GPU显存和利用率如何提高和batch_size/num_works等参数的实验测试

目录 简介实验测试显存占用问题GPU占用率波动问题num_work不是越大越好 总结 本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送 简介 在PyTorch中使用多个GPU进行模型训练时,各个参数和指标之间存在一定的关系…

SpringBoot3-快速体验

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新

写 Unity Shader的时候&#xff0c;只有播放状态下的 Game 面板能看到Shader 顺畅的动态效果&#xff0c;不方便。 想要带有动态效果的 Shader 在 Scene 面板持续更新动画&#xff0c;只需要打开一个开关就能让 Scene 持续刷新动画了。 感谢大家的观看&#xff0c;您的点赞和关…

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

1 项目内容及要求 本项目通过设计一个抽象向量类模板&#xff0c;以及一个通用的向量类模板和一个字符串类作为其派生类&#xff0c;以满足各种应用场景中的数据存储和处理需求。 项目内容&#xff1a; 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…

1.1配置开发环境

一、虚拟机 虚拟机可以安装vmware社区板&#xff0c;再在Ubuntu系统下载https://cn.ubuntu.com/download 下载Ubuntu操作系统&#xff0c;在vm中安装&#xff0c;具体可以参考&#xff08;感谢这名作者&#xff09;VMware虚拟机安装Ubuntu与配置Ubuntu&#xff08;超详细教程&…

12.5 作业

1&#xff0c; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有…

制作一个RISC-V的操作系统二-RISC-V ISA介绍

文章目录 ISA的基本介绍啥是ISA为什么要设计ISACISCvsRISCISA的宽度知名ISA介绍 RISC-V历史和特点RISC-V发展RISC-V ISA 命名规范模块化的ISA通用寄存器Hart特权级别Control and Status Register&#xff08;CSR&#xff09;内存管理与保护异常和中断 ISA的基本介绍 啥是ISA …

Java集合常见问题

目录 Java集合 1.前言2.集合3.Collection接口类3.1 List接口3.1.1 ArrayList&#xff08;常用&#xff09;3.1.2 LinkedList&#xff08;常用&#xff09;3.1.3 Vector&#xff08;不常用&#xff09; 3.2 Set接口3.2.1 HashSet&#xff08;常用&#xff09;3.2.2 LinkedHash…

万兆光模块:单模光纤和多模光纤的选择指南

随着网络技术的不断发展&#xff0c;数据传输的速度也越来越快。在这样的背景下&#xff0c;万兆光模块逐渐成为了数据中心和网络设备的必备组件。而在选择万兆光模块时&#xff0c;用户通常会面临一个难题&#xff1a;选择单模还是多模&#xff1f;本文易天光通信将为您解析。…

Web端功能测试的测试方向有哪些?

一、功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征&#xff0c;主要是用于页面之间切换跳转&#xff0c;指导用户去一些不知道地址的页面的主要手段&#xff0c;链接测试一般关注三点&#xff1a; 1&#xff09;链接是否按照既定指示那样&#xff0c;确实链接到…

多模块项目打包lib成aar

首先 我们要理解原理lib和app的gradle配置区别 plugins { id com.android.application } plugins { id "com.android.library" } assembleDebug&#xff08;assembleRelease&#xff09;两者分别生成是apk 和aar 对于app来说有包名、有版本号而library没有。 接…

WordPress免费插件大全清单【2023最新】

WordPress已经成为全球范围内最受欢迎的网站建设平台之一。要让您的WordPress网站更具功能性、效率性&#xff0c;并提供卓越的用户体验&#xff0c;插件的选择与使用变得至关重要。 WordPress插件的作用 我们先理解一下插件在WordPress生态系统中的作用。插件是一种能够为Wo…

【shell】

shell 一、shell简介二、shell脚本的执行方式三、shell变量3.1 shell变量介绍3.2 shell变量的定义3.1.1 基本语法3.2.2 定义变量的规则3.2.3 将命令的返回值赋予变量 四、环境变量的设置4.1 基本语法&#xff1a; 五、位置参数变量5.1 基本介绍5.2 基本语法 六、预定义变量6.1 …

C++ Primer 第十六章 模板与泛型编程 重点解读

文章目录 1 定义模板1.1 类模板成员函数的实例化&#xff1a;1.2 在类代码内简化模板类名的使用&#xff1a;1.3 令模板自己的类型参数成为友元&#xff08;C11&#xff09;1.4 模板类型别名1.4.1 typedef1.4.2 为模板定义类型别名(C11) 1.5 函数模板与类模板的区别1.6 使用类的…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Rocky Linux 9.3 为 PowerPC 64 位带回云和容器镜像

RHEL 克隆版 Rocky Linux 9.3 今天发布了&#xff0c;作为红帽企业 Linux 发行版 CentOS Stream 和 Red Hat Enterprise Linux 的免费替代版本&#xff0c;现在可供下载。 Rocky Linux 9.3 是在 Rocky Linux 9.2 发布 6 个月之后发布的&#xff0c;它带回了 PowerPC 64 位 Lit…