实用指南:计算机视觉(opencv)——基于 MediaPipe 人体姿态检测

news/2025/11/14 23:06:02/文章来源:https://www.cnblogs.com/ljbguanli/p/19223721

实用指南:计算机视觉(opencv)——基于 MediaPipe 人体姿态检测

用 MediaPipe + OpenCV 做人体姿态估计:原理、代码解析与工程实践

引言

人体姿态估计(Pose Estimation)是计算机视觉中非常实用的模块,常用于动作识别、运动分析、人机交互、增强现实等场景。Google 的 MediaPipe 提供了一套开箱即用、实时性能优良且易用的姿态估计模型,结合 OpenCV 做图像 I/O 与显示,可以快速搭建原型。下面我将基于你给出的代码,从原理、逐行解析、参数与调优、可视化技巧、常见问题、扩展与工程化建议等方面做详尽讲解,帮助你把这段简单示例拓展成工程级代码或学术实验。


环境与依赖(快速提示)

在运行示例前建议保证以下包已安装并版本兼容:

  • Python 3.8+

  • opencv-python(用于图像读写与显示)

  • mediapipe(包含 Pose 模型与绘制工具)
    安装示例:pip install opencv-python mediapipe。在某些系统上,OpenCV 的 GUI 显示(cv2.imshow)可能需要额外的系统依赖(例如在 headless 服务器上不可用),这时可改用文件输出或 Jupyter 显示。


完整示例代码(来自用户、已整合)

import cv2
import mediapipe as mp
if __name__ == '__main__':mp_pose = mp.solutions.posepose = mp_pose.Pose(static_image_mode=True,model_complexity=1,smooth_landmarks=True,# enable_segmentation=True,min_detection_confidence=0.5,min_tracking_confidence=0.5)drawing = mp.solutions.drawing_utils'''mp_pose.Pose()其参数:1)static_image_mode:静态图像还是连续帧视频;2)model_complexity:人体姿态估计模型,0表示速度最快,精度最低(三者之中),1表示速度中间,精度中间(三者之中),2表示速度最慢,精度最高(三者之中);3)smooth_landmarks:是否平滑关键点;4)enable_segmentation:是否对人体进行抠图;5)min_detection_confidence:检测置信度阈值;6)min_tracking_confidence:各帧之间跟踪置信度阈值;'''# read img BGR to RGBimg = cv2.imread("face.jpg")img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)cv2.imshow("input", img)results = pose.process(img)drawing.draw_landmarks(img, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)cv2.imshow("keypoint", img)drawing.plot_landmarks(results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS)cv2.waitKey(0)cv2.destroyAllWindows()

逐行代码解析与原理要点

  1. import cv2import mediapipe as mp
    导入 OpenCV(用于图像 I/O、窗口显示、颜色空间转换)和 MediaPipe(提供姿态估计模型、绘制工具和世界坐标输出)。

  2. mp_pose = mp.solutions.pose
    获取 MediaPipe 中姿态模块的入口。mp.solutions.pose 包含 Pose 类与预定义的连接关系(POSE_CONNECTIONS)。

  3. pose = mp_pose.Pose(...)
    构造 Pose 对象并加载模型。关键参数说明(代码注释中已有,总结如下):

    • static_image_mode=True:适用于单张静态图片。若处理视频或摄像头,应设为 False,以启用帧间跟踪提升性能。

    • model_complexity:0 / 1 / 2 分别代表不同复杂度的模型,数值越高精度越好但速度越慢。选择依据是目标平台(CPU/GPU)和实时性要求。

    • smooth_landmarks=True:对关键点做时间/空间平滑(在视频中可减少抖动)。

    • enable_segmentation:若开启将输出分割掩码(可用于抠图或背景替换)。

    • min_detection_confidencemin_tracking_confidence:用于过滤较低置信度的检测/跟踪结果,通常设 0.3–0.7 范围内试验。

  4. drawing = mp.solutions.drawing_utils
    绘制工具,用于在图像上可视化关键点与骨架连接。MediaPipe 自带美观的绘制风格,但可自定义颜色、线宽等。

  5. 读取与颜色空间转换:

    img = cv2.imread("face.jpg")
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    OpenCV 读入图像为 BGR;MediaPipe 要求输入为 RGB,因此要转换。注意:如果你仅用于显示,最后要把结果再转回 BGR 给 cv2.imshow,不过在这段代码里直接把 RGB 图像传给 imshow,在某些显示中颜色顺序会不正确(但很多情况下看起来也能接受)。更稳妥的做法是在显示前转回 BGR。

  6. results = pose.process(img)
    核心函数:将 RGB 图像传入模型,返回 results,包含 pose_landmarks(归一化像素坐标)与 pose_world_landmarks(以米或相对单位表示的三维坐标,基于摄像头坐标系)等。

  7. drawing.draw_landmarks(img, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
    在图像上绘制 2D 关键点和连接。绘制后即可显示或保存。务必在确认 results.pose_landmarks 不为 None 时再绘制,避免报错。

  8. drawing.plot_landmarks(results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS)
    这是 MediaPipe 内置的简易三维可视化(通常弹出 matplotlib 窗口)。pose_world_landmarks 提供了带深度信息的 3D 关键点,有利于做姿态角度计算或三维动作分析。注意:在 headless 环境或没有 matplotlib 的环境会报错,使用前请确认依赖。

  9. 显示与退出:cv2.waitKey(0)cv2.destroyAllWindows() 保证窗口交互与资源释放。


实务建议与常见改进

颜色空间与显示

  • 推荐流程:读图(BGR)→ 转 RGB → pose.process → 将绘制结果转换回 BGR 后 cv2.imshow。例如:

    img = cv2.imread("face.jpg")
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = pose.process(img_rgb)
    annotated = img.copy()
    drawing.draw_landmarks(annotated, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
    cv2.imshow("keypoint", annotated)

    这样能保证颜色一致性与绘制叠加正确。

处理视频/摄像头

  • 对视频流将 static_image_mode=False,并在循环中维持 pose 不重复初始化以节省开销。示例伪代码:

    cap = cv2.VideoCapture(0)
    with mp_pose.Pose(static_image_mode=False, ...) as pose:while cap.isOpened():ret, frame = cap.read()if not ret: breakframe_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)results = pose.process(frame_rgb)drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)cv2.imshow("webcam", frame)

性能调优

  • 降低 model_complexity 或降低输入分辨率可大幅提高帧率,同时注意精度损失。

  • 在 GPU 环境中可获得更高吞吐;MediaPipe 在某些平台上有针对 GPU 的优化(例如使用 TFLite GPU delegate 或特定后端)。

  • 对于多人体、多摄像头或批量图片处理,可考虑并行化或使用轻量模型做预筛选。

稳健性与异常处理

  • 在使用 results.pose_landmarks 前一定要判空:if results.pose_landmarks is not None: ...。模型在人体被遮挡或未检测到时会返回 None

  • 对置信度低的关键点做过滤或插值处理,尤其在后续做角度/长度计算时。


应用举例与工程化思路

1. 运动动作分析

利用 pose_world_landmarks 计算关节角度(例如膝角、肘角),配合时间序列可以评估动作标准度、重复次数、姿势偏差等。常见实现流程:

  • 用关键点计算肢体向量与夹角;

  • 平滑角度时间序列(例如卡尔曼滤波或指数移动平均);

  • 根据阈值或机器学习模型判断动作是否标准。

2. 行为识别与安全监测

结合时间窗口与分类器(如 LSTM、Temporal Conv),将姿态时序转换为动作类别,应用于跌倒检测、异常行为告警等。

3. 虚拟试衣 / AR 应用

enable_segmentation=True 与掩码输出,可用于实时抠图,再叠加衣物或道具,实现试衣与 AR 效果。

4. 多摄协同与三维重建

单摄像头提供相对 3D 粗略坐标。若需真实尺度与高精度三维重建,需多摄标定与三角测量,或使用深度相机配合 MediaPipe。


实验设计与评估指标(研究/竞赛方向)

  • 检测率(Recall):检测到人体帧的比例。

  • 关键点精度(PCK / MPJPE):常用的 2D / 3D 关键点误差度量,衡量关键点与标注点距离(归一化或以米为单位)。

  • 鲁棒性测试:不同光照、遮挡、服饰、摄像头角度下模型表现。

  • 实时性(FPS)与资源占用:目标平台上测量实际帧率与内存/CPU/GPU 使用。

设计实验时,建议固定数据集(或自建带标注集),并记录不同 model_complexity、输入分辨率、置信度阈值下的指标曲线,以便权衡精度与速度。


常见问题(FAQ)

  • Q:显示颜色怪异?
    A:通常是 RGB/BGR 未转换一致导致,显示前把图像转回 BGR。

  • Q:results.pose_landmarksNone
    A:说明模型未检测到人体,可能是图像中人体部分遮挡、太小或光照太差。可尝试放大 ROI 或调整检测置信度阈值。

  • Q:如何获得更准确的深度信息?
    A:pose_world_landmarks 提供相对三维坐标,但并非绝对真实深度。要获得绝对尺度需摄像头标定或使用深度摄像头(如深度相机或双摄三角测量)。

  • Q:怎样在服务器/无头环境运行并保存结果?
    A:不要使用 cv2.imshow,改为把带标注图像写入文件 cv2.imwrite 或把关键点信息保存为 JSON 供后续分析。

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

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

相关文章

《团队协作:如何高效进行代码审查》

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。 find_if(begin, end, predicate):查找…

英国留学中介避坑指南:新通/厚仁领跑,G5录取率93%+的靠谱留学机构清单

英国留学中介避坑指南:新通/厚仁领跑,G5录取率93%+的靠谱留学机构清单行业权威榜单发布,优质中介综合测评​ 随着英国G5名校申请竞争的持续升温,专业英国留学中介已成为学子冲刺梦校的核心助力。优质中介不仅能精准…

C# 数据类型与运算符(学习笔记2)

1. 变量 int i = 10; 变量类型+空格+变量名称+空格+初始值。2. 常量const double PI = 3.1415926;固定不变的值用常量表示,只能赋值一次。3.基本数据类型 用C#编程有两套数据类型,一是C#语言自带的,二是.Net Fram…

《移动开发:Flutter与React Native的对比》‌

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value):查找第一个等于 value 的元素,返回迭代器(未找到返回 end)。 find_if(begin, end, predicate):查找…

20232420 2025-2026-1 《网络与系统攻防技术》实验五实验报告

1.实验内容 (1)选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式、该域名对应IP地址、IP地址注册人及联系方式、IP地址所在国家、城市和具体地理位置。 (2)尝试获取QQ中某一好友的IP地址,并查询获取该…

kde neon: 配置国内源

编辑neon的源 # vi /etc/apt/sources.list.d/neon.list内容:// 注释原有内容,新增下面一行 sudo vi /etc/apt/sources.list.d/neon.list deb https://mirrors.bfsu.edu.cn/kde-neon/user noble main 完成后updatesu…

CF1606F Tree Queries

题目大意: 你有一棵 \(n\) 个点的树,你有一种操作,每次选择一个节点,将他的儿子全连向它的夫亲,然后把这个点删掉。 设 \(f_{u,m}\) 表示 \(u\) 这个点操作完 \(m\) 次之后最大的儿子数量,求 \(\max_{1 \le m \l…

2025.11.14总结

pycharm配置镜像源的方法,点击加号可以配置仓库,我这里使用的是清华的,大家也可以选择阿里等仓库

JWT笔记

JWT笔记 一、简单介绍 JWT由三部分组成: header,payload,Signature(头部,载荷,签证) 二、工具类 工具类是一个封装类,将一些对Jwt相关的操作进行整理,以便调用。 1. JwtToken创建 (不同版本,方法或有变动)调用…

2025藤校申请少走弯路!5家权威机构测评,从申请到就业一站式护航

2025藤校申请少走弯路!5家权威机构测评,从申请到就业一站式护航随着全球顶尖教育资源竞争的加剧,藤校申请已进入"精准规划+实力赋能"的新阶段。专业的藤校申请留学机构不仅能精准匹配院校录取偏好,深度挖…

词向量:开启自然语言处理的奇妙之旅 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11.14日学习笔记

类图设计 text +------------------------+ | Computer | +------------------------+ | -memory: Memory | | -cpu: CPU | | -hardDisk: HardDisk | | -os: OS …

[Python刷题记录]-有效的括号-栈-简单

[Python刷题记录]-有效的括号-栈-简单链接:20. 有效的括号 - 力扣(LeetCode) python中list就可以直接当栈用1 class Solution(object):2 def isValid(self, s):3 """4 :type s:…

[KaibaMath]1021 关于[0, 1]与[a, b]等势的证明

两个集合等势(也称基数相等),当且仅当存在从一个集合到另一个集合的双射(既是单射又是满射的映射,即一一映射)。下面给出[0, 1]与[a, b]等势的证明。

超参数调优:Grid Search 和 Random Search 的实战对比

模型训练完能够到达85%的准确率,很多人觉得就差不多了。但是通过超参数优化能让模型释放真正的潜力。最后那3-5个点的提升,往往决定了你的模型是"还行"还是"能打"。这篇文章会把Grid Search和Ra…

征程 6X 常见 kernel panic 问题

1. 概述 kernel panic 包含了多种内核异常类型,包括但不限于:空指针/异常指针、HungTask、RCU Stall、softlockup、hardlockup、OOM、BUG_ON。 下图是各种类型 panic 的路径:2. 通用方法kpanic 类异常均为 kernel 软…

实用指南:26秋招三分钟快速背诵一个八股-Spring中Bean的生命周期

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11.14 —— (VP)2024icpc杭州

沈阳站赛前的最后一把 \(VP\) ,希望能在沈阳站偷到牌子qwq。。。 赛时 \(4\) 题,高罚时,输在 \(E\) 题开出来得太慢了。 \(A,K\) 纯签到。 \(E\): 显然所在楼层越高越有利,那么当前只要我们有免费上升的机会,就可…