计算机视觉之手势、面部、姿势捕捉以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.mzph.cn/news/214281.shtml

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

相关文章

ExecuteScalar()方法

ExecuteScalar()方法 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨数据库编程中的一个关键主题——ExecuteScalar()方法&#xff…

stm32学习总结:3、Proteus8+STM32CubeMX+MDK很有搞头

stm32学习总结:3、Proteus8STM32CubeMXMDK很有搞头 文章目录 stm32学习总结:3、Proteus8STM32CubeMXMDK很有搞头一、前言二、资料收集三、实际案例-点灯1、Proteus8安装2、Proteus创建stm32F013C6项目并添加外围LED电路3、STM32CubeMX配置F103C6引脚生成…

12.10_黑马数据结构与算法笔记Java

目录 058 链表 e10 判环算法1 thinking:什么是空指针? 058 链表 e10 判环算法2 059 数组 e01 合并有序数组1 059 数组 e01 合并有序数组2 060 队列 链表实现1 061 队列 链表实现2 062 队列 环形数组实现 方法1-1 063 队列 环形数组实现 方法1-2…

带有 RaspiCam 的 Raspberry Pi 监控和延时摄影摄像机

一、说明 一段时间以来,我一直想构建一个运动激活且具有延时功能的树莓派相机,但从未真正找到我喜欢的案例。我在thingiverse上找到了这个适合树莓派和相机的好案例。它是为特定的鱼眼相机设计的,但从模型来看,我拥有的廉价中国鱼…

【Vulnhub 靶场】【Hackable: III】【简单 - 中等】【20210602】

1、环境介绍 靶场介绍:https://www.vulnhub.com/entry/hackable-iii,720/ 靶场下载:https://download.vulnhub.com/hackable/hackable3.ova 靶场难度:简单 - 中等 发布日期:2021年06月02日 文件大小:1.6 GB 靶场作者&…

k8s常用操作命令

目标 了解 Kubernetes基础命令。对已部署的应用故障排除。 基础命令:create,delete,get,run,expose,set,explain,edit create 命令:根据文件或者输入来创建资源 # 创建…

消融实验:深度学习的关键分析工具

消融实验:深度学习的关键分析工具 在深度学习和机器学习领域,消融实验(Ablation Study)是一种重要的实验方法,用于理解和评估模型的各个组成部分对其整体性能的贡献。通过这种方法,研究人员可以更深入地了…

Docker | 自定义网络

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:Docker系列 ✨特色专栏: MySQL学习 🥭本文内容: Docker | 自定义网络 📚个人知识库: 知识库,欢迎大家访问 1.前言 大家好,我是Leo哥…

当视觉遇到毫米波雷达:自动驾驶的三维目标感知基准

​ 文章:Vision meets mmWave Radar: 3D Object Perception Benchmark for Autonomous Driving 作者: Yizhou Wang, Jen-Hao Cheng, Jui-Te Huang , Sheng-Yao Kuan , Qiqian Fu , Chiming Ni 编辑:点云PCL 欢迎各位加入知识星球,获取PDF…

vector类

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟悉vector库 > 毒鸡汤:从人生低谷…

UVM中的config_db机制传递interface

(1)定义interface interface my_if(input clk, input rst_n);logic [7:0] data;logic valid;endinterface (2)在tb中使用interface 定义了interface后,在top_tb中实例化DUT时,就可以直接使用。 先…

【面试总结】Java面试题目总结(一)

&#xff08;以下仅为个人见解&#xff0c;如果有误&#xff0c;欢迎大家批评并指出错误&#xff0c;谢谢大家&#xff09; 1.项目中的验证码功能是如何实现的&#xff1f; 第一步&#xff1a;在项目的pom.xml文件中导入 EasyCaptcha 的依赖&#xff1b; <dependency>…

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈

SQL命令---修改字段名

介绍 使用sql语句修改字段名。 命令 alter table 表名 change 旧字段名 新字段名 新数据类型;例子 将a表id字段名改为id1 alter table a change id id1 int(12) NOT NULL;

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

[python高级编程]:01-数据结构

此系列主要用于记录Python学习过程中查阅的优秀文章&#xff0c;均为索引方式。其中内容只针对本作者一人&#xff0c;作者熟悉了解的内容不再重复记录。 目录 01-列表推导式 列表推导同filter和map的比较 02-元组 元组拆包 具名元组 01-列表推导式 列表推导同filter和map的比…

实现安装“自由化”!在Windows 11中如何绕过“您尝试安装的应用程序未通过微软验证”

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

Windows10下MySQL5.7.31解压版安装与卸载

一、安装 1进入官网下载MySQL5.7.31解压版&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) 2解压文件 解压目录到D:\developer_tools\MySQL\mysql-5.7.31-winx64&#xff0c;在bin同级目录下创建my.ini文件&#xff0c;写入以下代码&#xff1…

python简易学生管理 + MySQL

数据库表 Python代码部分 import pymysqlclass StMgmt(object):def tips(self):"""提示用户选择的操作"""print("""学生管理系统 1.01.查看所有信息2.查看学生信息3.修改学生信息4.增加学生信息5.退出学生系统"""…

【网络安全技术】传输层安全——SSL/TLS

一、TLS位置及架构 TLS建立在传输层TCP/UDP之上&#xff0c;应用层之下。 所以这可以解决一个问题&#xff0c;那就是为什么抓不到HTTP和SMTP包&#xff0c;因为这两个在TLS之上&#xff0c;消息封上应用层的头&#xff0c;下到TLS层&#xff0c;TLS层对上层消息整个做了加密&…