Mediapipe-姿态估计实例

Mediapipe简介

Mediapipe 是由 Google Research 开发的一款开源框架,旨在帮助开发者轻松地构建、测试和部署复杂的多模态、多任务的机器学习模型。它特别擅长于实时处理和分析音频、视频等多媒体数据。以下是 Mediapipe 的一些关键特点和组件:

关键特点

  1. 多平台支持:Mediapipe 支持在多个平台上运行,包括桌面、移动设备和网页。这使得开发者可以轻松地将模型部署到不同的平台上。

  2. 高效的实时处理:Mediapipe 具有高度优化的性能,能够在资源受限的设备上进行实时处理。这使其特别适合于移动设备和嵌入式系统。

  3. 模块化设计:Mediapipe 使用图表(graph)来组织和连接不同的处理模块。这种设计使得开发者可以灵活地组合和复用不同的处理组件。

  4. 丰富的预构建解决方案:Mediapipe 提供了许多预构建的解决方案,如人脸检测、手部追踪、姿态估计等,开发者可以直接使用这些解决方案来快速构建应用。

主要组件

  1. 图表(Graph):Mediapipe 的核心是其图表结构,图表定义了数据流和处理模块的连接方式。每个图表由一系列节点(nodes)和边(edges)组成,节点表示具体的处理模块,边表示数据在节点之间的流动。

  2. 节点(Nodes):节点是图表的基本单元,表示具体的处理操作。Mediapipe 提供了许多内置的节点,如数据输入输出节点、图像处理节点、机器学习推理节点等。

  3. 数据包(Packets):数据包是图表中传输的数据单元,节点之间通过发送和接收数据包来通信。数据包可以包含各种类型的数据,如图像帧、音频信号、检测结果等。

  4. 计算机视觉解决方案:Mediapipe 提供了许多预构建的计算机视觉解决方案,这些解决方案已经高度优化,能够在实时应用中使用。常见的解决方案包括人脸检测、手部追踪、姿态估计、对象检测等。

常见使用场景

  1. 姿态估计(Pose Estimation):Mediapipe 可以实时检测和追踪人体的关键点(如肩膀、肘部、膝盖等),并估计人体的姿态。这对于体育训练、动作捕捉、增强现实等应用非常有用。

  2. 手部追踪(Hand Tracking):Mediapipe 能够检测和追踪手部的关键点,提供手势识别和手部动作分析的能力。这在手势控制、虚拟现实、手写输入等应用中有广泛的应用。

  3. 人脸检测(Face Detection):Mediapipe 提供了高效的人脸检测和关键点追踪功能,可以用于面部识别、表情分析、虚拟化妆等场景。

  4. 对象检测(Object Detection):Mediapipe 还提供了实时的对象检测解决方案,可以用于监控、无人驾驶、智能家居等领域。

示例代码

以下是一个使用 Mediapipe 进行姿态估计的简单示例:

import cv2
import mediapipe as mp# Initialize mediapipe pose class.
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# Initialize mediapipe drawing class, useful for annotation.
mp_drawing = mp.solutions.drawing_utils# Load the video file or start webcam capture.
cap = cv2.VideoCapture(0)  # Use 0 for webcam, or provide video file pathwhile cap.isOpened():ret, frame = cap.read()if not ret:break# Convert the BGR image to RGB.image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# Process the image and detect the pose.result = pose.process(image_rgb)# Draw the pose annotation on the image.if result.pose_landmarks:mp_drawing.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)# Display the frame with pose landmarks.cv2.imshow('Pose Estimation', frame)# Break the loop if 'q' is pressed.if cv2.waitKey(10) & 0xFF == ord('q'):break# Release the video capture object and close display window.
cap.release()
cv2.destroyAllWindows()

这段代码使用 Mediapipe 的姿态估计功能,读取视频流并实时绘制人体的关键点。你可以使用摄像头实时捕捉人体姿态,也可以处理预录制的视频文件。

实例1-读取视频流并进行骨骼点绘制:

import cv2
import mediapipe as mp# Initialize mediapipe pose class.
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# Initialize mediapipe drawing class, useful for annotation.
mp_drawing = mp.solutions.drawing_utils# Load the video file.
cap = cv2.VideoCapture('D:/basketball.mp4')# Check if the video is opened successfully.
if not cap.isOpened():print("Error: Could not open video.")exit()while cap.isOpened():ret, frame = cap.read()if not ret:print("Reached the end of the video.")break# Convert the BGR image to RGB.image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# Process the image and detect the pose.result = pose.process(image_rgb)# Draw the pose annotation on the image.if result.pose_landmarks:mp_drawing.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)# Display the frame with pose landmarks.cv2.imshow('Pose Estimation', frame)# Break the loop if 'q' is pressed.if cv2.waitKey(10) & 0xFF == ord('q'):break# Release the video capture object and close display window.
cap.release()
cv2.destroyAllWindows()

效果如下:
在这里插入图片描述

实例2-读取视频流中姿态估计与3D绘制:

代码如下:

import cv2
import mediapipe as mp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib.animation import FuncAnimation# Initialize mediapipe pose class.
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# Initialize mediapipe drawing class, useful for annotation.
mp_drawing = mp.solutions.drawing_utils# Load the video file.
cap = cv2.VideoCapture('D:/basketball.mp4')# Check if the video is opened successfully.
if not cap.isOpened():print("Error: Could not open video.")exit()fig = plt.figure(figsize=(10, 5))
ax2d = fig.add_subplot(121)
ax3d = fig.add_subplot(122, projection='3d')def update(frame_number):ret, frame = cap.read()if not ret:print("Reached the end of the video.")return# Convert the BGR image to RGB.image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# Process the image and detect the pose.result = pose.process(image_rgb)# Clear the previous plotsax2d.clear()ax3d.clear()# Draw the pose annotation on the image.if result.pose_landmarks:mp_drawing.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)# Extract the landmark points.landmarks = result.pose_landmarks.landmarkxs = [landmark.x for landmark in landmarks]ys = [landmark.y for landmark in landmarks]zs = [landmark.z for landmark in landmarks]# Plot 2D imageax2d.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))ax2d.set_title('Pose Estimation')ax2d.axis('off')# Plot 3D landmarksax3d.scatter(xs, ys, zs, c='blue', marker='o')ax3d.set_xlim([0, 1])ax3d.set_ylim([0, 1])ax3d.set_zlim([-1, 1])ax3d.set_xlabel('X')ax3d.set_ylabel('Y')ax3d.set_zlabel('Z')ax3d.set_title('3D Pose Landmarks')ani = FuncAnimation(fig, update, interval=10)plt.show()cap.release()
cv2.destroyAllWindows()

效果如下:
在这里插入图片描述
为了将三维骨骼点连接起来,可以使用 mpl_toolkits.mplot3d.art3d.Line3DCollection 来绘制骨骼连接。你需要定义这些连接的点对,并在三维图中使用它们来绘制线条。以下是更新后的代码:

import cv2
import mediapipe as mp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Line3DCollection
import numpy as np
from matplotlib.animation import FuncAnimation# Initialize mediapipe pose class.
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# Initialize mediapipe drawing class, useful for annotation.
mp_drawing = mp.solutions.drawing_utils# Load the video file.
cap = cv2.VideoCapture('D:/basketball.mp4')# Check if the video is opened successfully.
if not cap.isOpened():print("Error: Could not open video.")exit()fig = plt.figure(figsize=(10, 5))
ax2d = fig.add_subplot(121)
ax3d = fig.add_subplot(122, projection='3d')def update(frame_number):ret, frame = cap.read()if not ret:print("Reached the end of the video.")return# Convert the BGR image to RGB.image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# Process the image and detect the pose.result = pose.process(image_rgb)# Clear the previous plotsax2d.clear()ax3d.clear()# Draw the pose annotation on the image.if result.pose_landmarks:mp_drawing.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)# Extract the landmark points.landmarks = result.pose_landmarks.landmarkxs = [landmark.x for landmark in landmarks]ys = [landmark.y for landmark in landmarks]zs = [landmark.z for landmark in landmarks]# Define the connections between landmarksconnections = [(0, 1), (1, 2), (2, 3), (3, 7), (0, 4), (4, 5), (5, 6), (6, 8),(9, 10), (11, 12), (11, 13), (13, 15), (15, 17), (15, 19), (15, 21),(17, 19), (12, 14), (14, 16), (16, 18), (16, 20), (16, 22), (18, 20),(11, 23), (12, 24), (23, 24), (23, 25), (24, 26), (25, 27), (26, 28),(27, 29), (28, 30), (29, 31), (30, 32)]# Create a list of 3D lineslines = [[(xs[start], ys[start], zs[start]), (xs[end], ys[end], zs[end])] for start, end in connections]# Plot 2D imageax2d.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))ax2d.set_title('Pose Estimation')ax2d.axis('off')# Plot 3D landmarks and connectionsax3d.scatter(xs, ys, zs, c='blue', marker='o')ax3d.add_collection3d(Line3DCollection(lines, colors='blue', linewidths=2))ax3d.set_xlim([0, 1])ax3d.set_ylim([0, 1])ax3d.set_zlim([-1, 1])ax3d.set_xlabel('X')ax3d.set_ylabel('Y')ax3d.set_zlabel('Z')ax3d.set_title('3D Pose Landmarks')ani = FuncAnimation(fig, update, interval=10)plt.show()cap.release()
cv2.destroyAllWindows()

在这个代码中,我们定义了 connections 列表,它包含了骨骼点之间的连接对。然后我们创建了一个 lines 列表,用于存储这些连接的三维线段,并使用 ax3d.add_collection3d(Line3DCollection(lines, colors='blue', linewidths=2)) 方法将这些线段添加到三维图中。

运行这个脚本后,三维图中不仅会显示骨骼点,还会将这些点连起来,形成完整的骨骼结构。
效果如下:
在这里插入图片描述
上面的代码看似三维图的骨骼是倒立的,你可以调整三维图的坐标显示,以使得骨骼结构显示为正常的人体姿态。可以通过设置三维图的坐标轴范围和方向来调整显示效果。以下是修改后的代码,调整了坐标轴的范围和方向,以使骨骼结构正常显示:

import cv2
import mediapipe as mp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Line3DCollection
import numpy as np
from matplotlib.animation import FuncAnimation# Initialize mediapipe pose class.
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# Initialize mediapipe drawing class, useful for annotation.
mp_drawing = mp.solutions.drawing_utils# Load the video file.
cap = cv2.VideoCapture('D:/basketball.mp4')# Check if the video is opened successfully.
if not cap.isOpened():print("Error: Could not open video.")exit()fig = plt.figure(figsize=(10, 5))
ax2d = fig.add_subplot(121)
ax3d = fig.add_subplot(122, projection='3d')def update(frame_number):ret, frame = cap.read()if not ret:print("Reached the end of the video.")return# Convert the BGR image to RGB.image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# Process the image and detect the pose.result = pose.process(image_rgb)# Clear the previous plotsax2d.clear()ax3d.clear()# Draw the pose annotation on the image.if result.pose_landmarks:mp_drawing.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)# Extract the landmark points.landmarks = result.pose_landmarks.landmarkxs = [landmark.x for landmark in landmarks]ys = [landmark.y for landmark in landmarks]zs = [-landmark.z for landmark in landmarks]  # Negate the z-axis for better visualization# Define the connections between landmarksconnections = [(0, 1), (1, 2), (2, 3), (3, 7), (0, 4), (4, 5), (5, 6), (6, 8),(9, 10), (11, 12), (11, 13), (13, 15), (15, 17), (15, 19), (15, 21),(17, 19), (12, 14), (14, 16), (16, 18), (16, 20), (16, 22), (18, 20),(11, 23), (12, 24), (23, 24), (23, 25), (24, 26), (25, 27), (26, 28),(27, 29), (28, 30), (29, 31), (30, 32)]# Create a list of 3D lineslines = [[(xs[start], ys[start], zs[start]), (xs[end], ys[end], zs[end])] for start, end in connections]# Plot 2D imageax2d.imshow(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))ax2d.set_title('Pose Estimation')ax2d.axis('off')# Plot 3D landmarks and connectionsax3d.scatter(xs, ys, zs, c='blue', marker='o')ax3d.add_collection3d(Line3DCollection(lines, colors='blue', linewidths=2))ax3d.set_xlim([0, 1])ax3d.set_ylim([1, 0])  # Flip the y-axis for better visualizationax3d.set_zlim([1, -1])ax3d.set_xlabel('X')ax3d.set_ylabel('Y')ax3d.set_zlabel('Z')ax3d.set_title('3D Pose Landmarks')ani = FuncAnimation(fig, update, interval=10)plt.show()cap.release()
cv2.destroyAllWindows()

在这个代码中:

  1. 通过取反 zs 坐标 (zs = [-landmark.z for landmark in landmarks]),使得骨骼点的 Z 轴方向与预期一致。
  2. 通过设置 ax3d.set_ylim([1, 0]) 来翻转 Y 轴的方向,以便更符合常见的视觉习惯。

运行这个脚本后,三维图中的骨骼结构应会显示为正常的人体姿态。
显示效果如下:
在这里插入图片描述

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

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

相关文章

基于微信小程序的音乐播放平台

基于微信小程序的音乐播放平台 音乐播放小程序项目简介技术栈功能模块项目流程系统E-R图项目页面 音乐播放小程序 项目简介 微信音乐小程序旨在提供一个简洁高效的音乐播放平台,用户可以方便地搜索、播放和收藏自己喜欢的音乐。整个项目采用前后端分离的架构&…

WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

环境: Win10 专业版 DELL7080 问题描述: WIN10开机突然,过一会就自动重启蓝屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解决方案: 1.找到MEMORY.DMP文件内容,分析一下 Microsoft (R) Windows Debugger Version 10…

主机安全-开源HIDS字节跳动Elkeid安装使用

目录 概述什么是HIDSHIDS与NIDS的区别EDR、XDR是啥? Elkeid架构Elkeid Agent && Agent centerElkeid DriverElkeid RASPElkeid HUBService DiscoveryManager安装数据采集规则&告警 参考 概述 什么是HIDS HIDS( host-based intrusion detec…

使用Gitee仓库镜像管理功能实现Gitee与Github 双向同步

进入你所需要同步的仓库,点击「管理」->「镜像仓库管理」,点击「添加镜像」选项; 如果你的Gitee账号还没有绑定过 GitHub 帐号,先根据弹窗的提示绑定 GitHub 帐号; 添加镜像时候,在「镜像方向」中选择…

二次开发源码 借贷系统uniapp/借贷认证系统/小额信贷系统/工薪贷APP/资金贷系统h5

前端:UNIAPP 后端:ThinkPHP 数据库: Mysql 前端使用的uniapp 可以打包APP H5 小程序 系统提供了完善的网络借贷体系,为金融中介平台提供从获客到贷后管理全流程服务,解决了借贷手续繁琐、流程缓慢等问题 此源码为运营…

管理Linux本地用户和组

什么是用户 用户账户在可以运行命令的不同人员和程序之间提供安全界限。 在Linux系统中,系统通过分配唯一的标识号(用户ID或UID)来区分不同的用户帐户。 在Linux系统中,用户帐户有以下三种主要类型: 超级用户 负责…

分布式一致性算法:Raft学习

分布式一致性算法:Raft学习 1 什么是分布式系统? 分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。这些节点可能位于不同的物理位置,但它们协同工作以提供一个统一的计算平台或服务。分布式系统…

Unity中一键生成具有身体感知的虚拟人物动作

在虚拟现实(VR)和增强现实(AR)的浪潮中,如何让虚拟人物的动作更加自然、真实,已经成为一个重要课题。AI4Animation项目,一个由 Sebastian Starke 主导的开源框架,为Unity开发者提供了强大的工具集,以实现这一目标。本文…

OrangePi AIpro在安防领域的深思和实战(旷视科技CNN模型ShuffleNetV1开发案例测试)

一、前言 公司最近有个项目是安防领域的,主要用在边缘结点,虽然已做成形,但是还是存在一些缺陷,例如:算力问题,开发板的成熟问题,已经各种技术的解决方案落地问题。目前我们集成了很多功能&…

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架,支持所有主要操作系统,包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写,包括计算机视觉、几何、媒体处理、网络和渲染&#x…

实现多层感知机

目录 多层感知机: 介绍: 代码实现: 运行结果: 问题答疑: 线性变换与非线性变换 参数含义 为什么清除梯度? 反向传播的作用 为什么更新权重? 多层感知机: 介绍:…

taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)

前言 CVE-2021-44983 是一个影响 taoCMS 3.0.1 的远程代码执行(RCE)漏洞。该漏洞允许攻击者通过上传恶意文件并在服务器上执行任意代码来利用这一安全缺陷。 漏洞描述 taoCMS 是一个内容管理系统(CMS),用于创建和管…

【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow

一、项目介绍 眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练(‘白内障’, ‘糖尿病性视网膜病变’, ‘青光眼’, ‘正常’&…

jenkins系列-05-jenkins构建golang程序

下载go1.20.2.linux-arm64.tar.gz 并存放到jenkins home目录: 写一个golang demo程序:静态文件服务器:https://gitee.com/jelex/jenkins_golang package mainimport ("encoding/base64""flag""fmt""lo…

window下安装go环境

一、go官网下载安装包 官网地址如下:https://golang.google.cn/dl/ 选择对应系统的安装包,这里是window系统,可以选择zip包,下载完解压就可以使用 二、配置环境变量 这里的截图配置以win11为例 我的文件解压目录是 D:\Software…

力扣32.最长有效括号

力扣32.最长有效括号 class Solution {public:int longestValidParentheses(string s) {int n s.size();int res0;int start -1;vector<int> st;for(int i0;i<n;i){if(s[i] ()st.push_back(i);else{//前面没有( , (开启下一段)下一段的开始更新为当前下标if(st.emp…

机器学习和人工智能在农业的应用——案例分析

作者主页: 知孤云出岫 目录 引言机器学习和人工智能在农业的应用1. 精准农业作物健康监测土壤分析 2. 作物产量预测3. 农业机器人自动化播种和收割智能灌溉 4. 农业市场分析价格预测需求预测 机器学习和人工智能带来的变革1. 提高生产效率2. 降低生产成本3. 提升作物产量和质量…

探索JT808协议在车辆远程视频监控系统中的应用

一、部标JT808协议概述 随着物联网技术的迅猛发展&#xff0c;智能交通系统&#xff08;ITS&#xff09;已成为现代交通领域的重要组成部分。其中&#xff0c;车辆远程监控与管理技术作为ITS的核心技术之一&#xff0c;对于提升交通管理效率、保障道路安全具有重要意义。 JT8…

TensorBoard ,PIL 和 OpenCV 在深度学习中的应用

重要工具介绍 TensorBoard&#xff1a; 是一个TensorFlow提供的强大工具&#xff0c;用于可视化和理解深度学习模型的训练过程和结果。下面我将介绍TensorBoard的相关知识和使用方法。 TensorBoard 简介 TensorBoard是TensorFlow提供的一个可视化工具&#xff0c;用于&#x…

尚品汇-(十七)

目录&#xff1a; &#xff08;1&#xff09;获取价格信息 &#xff08;2&#xff09;获取销售信息 前面的表&#xff1a; &#xff08;1&#xff09;获取价格信息 继续编写接口&#xff1a;ManagerService /*** 获取sku价格* param skuId* return*/ BigDecimal getSkuPrice…