Python 肢体动作追踪项目(基于 MediaPipe + OpenCV)
本文简单介绍一个可直接运行的 Python 肢体动作追踪项目,核心将采用MediaPipe Pose(谷歌开源的高精度姿态估计工具)结合OpenCV(图像/视频处理库)实现,该方案无需训练自定义模型,开箱即用,适合快速落地肢体追踪需求。
一、项目前置准备
1. 安装必要依赖库
打开终端/命令提示符,执行以下安装命令:
# 安装 OpenCV(用于视频捕获、图像渲染)
pip install opencv-python
# 安装 MediaPipe(核心肢体姿态检测引擎)
pip install mediapipe
2. 依赖说明
opencv-python:负责调用摄像头、读取视频文件、绘制追踪结果和显示窗口。mediapipe:内置预训练的 Pose 模型,可检测人体 33 个关键骨骼点(如头部、肩膀、手肘、膝盖等),支持实时追踪。
二、完整项目源码
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, , ),
thickness=,
circle_radius=
)
():
cap = cv2.VideoCapture()
cap.(cv2.CAP_PROP_FRAME_WIDTH, )
cap.(cv2.CAP_PROP_FRAME_HEIGHT, )
cap.isOpened():
()
cap.isOpened():
ret, frame = cap.read()
ret:
()
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame_rgb.flags.writeable =
results = pose.process(frame_rgb)
frame_rgb.flags.writeable =
frame_bgr = cv2.cvtColor(frame_rgb, cv2.COLOR_RGB2BGR)
results.pose_landmarks:
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]
nose_x = (nose_landmark.x * frame_bgr.shape[])
nose_y = (nose_landmark.y * frame_bgr.shape[])
cv2.putText(
frame_bgr,
,
(nose_x + , nose_y),
cv2.FONT_HERSHEY_SIMPLEX,
,
(, , ),
,
cv2.LINE_AA
)
cv2.imshow(, frame_bgr)
cv2.waitKey() & == ():
cap.release()
cv2.destroyAllWindows()
pose.close()
__name__ == :
()
()
body_pose_tracking()
()

