当前位置: 首页 > news >正文

计算机视觉(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 mpif __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.dtcms.com/a/487508.html

相关文章:

  • Spring ApplicationEventPublisher 异步处理与消息队列全面解析
  • 站长网站被跳转怎么办WordPress怎么去掉主题也没
  • 自定义View —> 项目中遇到的复杂UI
  • 网站中信息更新怎么做的烟台建网站
  • IIS发版各接口慢排查
  • 【操作系统核心详解】段式存储与页式存储:区别、碎片及虚拟内存的本质
  • 网站导航图怎么做网站建设邀标比选
  • 杭州网站建设出名企业网站推广技巧有哪些
  • 优质中药饮片供应是什么?主要涵盖哪些关键质量标准?
  • 代码随想录第36天第37天 | 01背包应用 及 完全背包⭐
  • 【GUI自动化测试】Python logging 日志模块与 Allure 测试报告实战指南
  • 两阶段随机规划为电力市场注入智慧
  • 公路工程项目管理软件选型指南
  • 潍坊高端网站设计官网搭建平台
  • 电商网站 开发费用山东建设网站首页
  • JDK 8u5 Windows 64位安装教程(详解,含环境变量配置)​
  • 四川城市建设住建厅网站百度官网认证入口
  • 黑马商城day3-微服务01
  • Flutter---两种带输入框的对话框
  • 自己做的网站怎么在移动端访问网站引导插件
  • 做网站的核验单 是下载的吗网站开发和网络设计有什么区别
  • AR模型(自回归模型)
  • 分布式系统相关知识总结
  • 越南k线历史数据、IPO新股股票数据接口文档
  • JavaScript的书写位置和注释
  • 【Java零基础·第6章】面向对象(二):构造器、封装、对象数组
  • 网站 系统设置建筑工程包括哪些项目
  • 重庆专业网站推广报价怎么做刷会员的网站
  • QT-基础
  • 网页设计图片之间空隙北京seo如何排名