Python 肢体动作追踪项目(基于 MediaPipe + OpenCV)

Python 肢体动作追踪项目(基于MediaPipe + OpenCV)

本文简单介绍一个可直接运行的Python肢体动作追踪项目,核心将采用MediaPipe Pose (谷歌开源的高精度姿态估计工具)结合OpenCV(图像/视频处理库)实现,该方案无需训练自定义模型,开箱即用,适合快速落地肢体追踪需求。

一、项目前置准备

1. 安装必要依赖库

打开终端/命令提示符,执行以下安装命令:

bash 复制代码
# 安装OpenCV(用于视频捕获、图像渲染)
pip install opencv-python
# 安装MediaPipe(核心肢体姿态检测引擎)
pip install mediapipe

2. 依赖说明

  • opencv-python:负责调用摄像头、读取视频文件、绘制追踪结果和显示窗口。
  • mediapipe:内置预训练的Pose模型,可检测人体33个关键骨骼点(如头部、肩膀、手肘、膝盖等),支持实时追踪。

二、完整项目源码

python 复制代码
import cv2
import mediapipe as mp

# ---------------------- 初始化配置 ----------------------
# 1. 初始化MediaPipe Pose相关组件
mp_pose = mp.solutions.pose
# 创建Pose检测对象(设置静态图像检测/置信度阈值)
# static_image_mode=False:适合视频/实时流(更高效)
# min_detection_confidence:最小检测置信度(0-1,越高越严格)
# min_tracking_confidence:最小追踪置信度(0-1,越高越稳定)
pose = mp_pose.Pose(
    static_image_mode=False,
    model_complexity=1,  # 模型复杂度(0/1/2,越高精度越高、速度越慢)
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5
)

# 2. 初始化MediaPipe绘图工具(用于绘制骨骼点和连接线)
mp_drawing = mp.solutions.drawing_utils
# 定义骨骼点和连接线的绘制样式(可选,默认样式也可满足需求)
drawing_spec_landmark = mp_drawing.DrawingSpec(
    color=(0, 255, 0),  # 骨骼点颜色:绿色
    thickness=5,        # 骨骼点大小
    circle_radius=3
)
drawing_spec_connection = mp_drawing.DrawingSpec(
    color=(255, 0, 0),  # 连接线颜色:蓝色
    thickness=3,        # 连接线粗细
    circle_radius=2
)

# ---------------------- 核心追踪逻辑 ----------------------
def body_pose_tracking():
    # 1. 打开摄像头(参数0:默认内置摄像头,若外接摄像头可改为1/2等)
    cap = cv2.VideoCapture(0)
    # 设置摄像头分辨率(可选,根据硬件调整)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

    if not cap.isOpened():
        print("错误:无法打开摄像头!")
        return

    # 2. 循环读取视频帧并进行姿态追踪
    while cap.isOpened():
        # 读取一帧图像
        ret, frame = cap.read()
        if not ret:
            print("警告:无法读取摄像头帧,退出循环!")
            break

        # ---------------------- 关键处理步骤 ----------------------
        # a. 图像格式转换:OpenCV读取的是BGR格式,MediaPipe需要RGB格式
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        # b. 禁用图像写入(提升处理速度)
        frame_rgb.flags.writeable = False
        # c. 传入Pose模型进行姿态检测
        results = pose.process(frame_rgb)
        # d. 重新启用图像写入(用于绘制结果)
        frame_rgb.flags.writeable = True
        # e. 格式转换回BGR(用于OpenCV显示)
        frame_bgr = cv2.cvtColor(frame_rgb, cv2.COLOR_RGB2BGR)

        # 3. 绘制肢体追踪结果(骨骼点+连接线)
        if results.pose_landmarks:
            # 绘制33个骨骼点和对应的连接线
            mp_drawing.draw_landmarks(
                image=frame_bgr,
                landmark_list=results.pose_landmarks,
                connections=mp_pose.POSE_CONNECTIONS,
                landmark_drawing_spec=drawing_spec_landmark,
                connection_drawing_spec=drawing_spec_connection
            )

            # (可选)获取某个骨骼点的坐标(示例:获取鼻子的坐标)
            nose_landmark = results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE]
            # 转换为像素坐标(frame_bgr.shape[1]:宽度,frame_bgr.shape[0]:高度)
            nose_x = int(nose_landmark.x * frame_bgr.shape[1])
            nose_y = int(nose_landmark.y * frame_bgr.shape[0])
            # 在图像上标注鼻子坐标
            cv2.putText(
                frame_bgr,
                f"Nose: ({nose_x}, {nose_y})",
                (nose_x + 10, nose_y),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.5,
                (0, 255, 255),
                1,
                cv2.LINE_AA
            )

        # 4. 显示追踪窗口
        cv2.imshow("Body Pose Tracking (Press 'q' to quit)", frame_bgr)

        # 5. 退出条件:按下'q'键关闭窗口
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    # 6. 释放资源
    cap.release()
    cv2.destroyAllWindows()
    pose.close()

# ---------------------- 运行项目 ----------------------
if __name__ == "__main__":
    print("正在启动肢体动作追踪...")
    print("提示:按下'q'键可退出程序")
    body_pose_tracking()
    print("肢体动作追踪已结束")

三、项目运行说明

1. 运行步骤

  1. 确保已安装所有依赖库(opencv-pythonmediapipe)。
  2. 将上述源码保存为body_pose_tracking.py文件。
  3. 终端进入文件所在目录,执行命令:python body_pose_tracking.py
  4. 程序启动后,会自动调用电脑内置摄像头,弹出追踪窗口显示肢体骨骼追踪结果。
  5. 按下键盘q键,即可退出程序并释放摄像头资源。

2. 运行效果

  • 窗口中实时显示你的肢体动作,绿色圆点 为人体33个关键骨骼点,蓝色线条为骨骼连接线。
  • 鼻子位置会标注其像素坐标(可选功能,可扩展其他骨骼点的坐标获取)。
  • 支持实时跟随肢体移动,无明显延迟(取决于电脑性能和摄像头帧率)。

四、核心功能解析

  1. MediaPipe Pose 初始化:配置模型复杂度、检测/追踪置信度,平衡精度和运行速度。
  2. 摄像头数据读取 :通过cv2.VideoCapture获取实时视频帧,处理摄像头打开失败的异常。
  3. 图像格式转换:MediaPipe仅支持RGB格式图像,而OpenCV默认读取BGR格式,需进行格式互转。
  4. 姿态检测与结果绘制 :调用pose.process()得到骨骼点数据,通过draw_landmarks()绘制追踪结果。
  5. 资源释放:程序退出时释放摄像头、关闭窗口、关闭Pose模型,避免资源泄露。

五、扩展方向(可选)

  1. 视频文件追踪 :将cv2.VideoCapture(0)改为cv2.VideoCapture("your_video.mp4"),即可对本地视频文件进行肢体追踪。
  2. 骨骼点坐标保存 :将检测到的骨骼点坐标写入csv文件,用于后续动作分析、机器学习训练。
  3. 自定义动作识别:通过判断特定骨骼点的相对位置(如手肘是否弯曲、膝盖是否抬起),实现自定义动作(如举手、深蹲)的识别。
  4. 提升模型精度 :将model_complexity改为2,模型精度更高,但对电脑性能要求更高(适合高性能设备)。

六、常见问题排查

  1. 摄像头无法打开 :检查摄像头是否被其他程序占用,外接摄像头需确认连接正常,将cv2.VideoCapture(0)改为1尝试。
  2. 运行卡顿 :降低模型复杂度(model_complexity=0)、降低摄像头分辨率,或关闭其他占用性能的程序。
  3. 无骨骼点绘制 :确保环境光线充足(避免过暗/过曝),人体处于摄像头画面中央,提高min_detection_confidence阈值(如0.7)。
  4. 依赖安装失败 :升级pippython -m pip install --upgrade pip),再重新安装依赖库,国内用户可使用镜像源加速安装。
  5. AttributeError: module 'mediapipe' has no attribute 'solutions':检查安装的mediapipe的版本,可以通过安装低版本解决此问题。

总结

  1. 该项目基于MediaPipe PoseOpenCV实现,无需自定义训练,快速实现实时肢体动作追踪。
  2. 核心流程:摄像头取帧→格式转换→姿态检测→结果绘制→窗口显示,逻辑清晰且易于扩展。
  3. 运行关键:安装对应依赖、确保摄像头可用、按下q键正常退出释放资源。
相关推荐
智驱力人工智能2 小时前
守护矿山动脉 矿山皮带跑偏AI识别系统的工程化实践与价值 皮带偏离检测 皮带状态异常检测 多模态皮带偏离监测系统
大数据·人工智能·opencv·算法·安全·yolo·边缘计算
智驱力人工智能2 小时前
构筑安全红线 发电站旋转设备停机合规监测的视觉分析技术与应用 旋转设备停机检测 旋转设备异常检测 设备停机AI行为建模
人工智能·opencv·算法·安全·目标检测·计算机视觉·边缘计算
程序员杰哥2 小时前
2026软件测试面试宝典(含答案+文档)
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
寻星探路2 小时前
【算法进阶】滑动窗口与前缀和:从“和为 K”到“最小覆盖子串”的极限挑战
java·开发语言·c++·人工智能·python·算法·ai
木木木一2 小时前
Rust学习记录--C10 泛型,Trait,生命周期
python·学习·rust
WangYaolove13142 小时前
基于深度学习的身份证识别考勤系统(源码+文档)
python·mysql·django·毕业设计·源码
weixin_445054722 小时前
力扣热题53
开发语言·python
Jerryhut2 小时前
光流估计从原理到实战:基于 Lucas-Kanade 算法与 OpenCV 实现
人工智能·opencv·算法
数据大魔方2 小时前
【期货量化实战】豆粕期货量化交易策略(Python完整代码)
开发语言·数据库·python·算法·github·程序员创富