如果你想从视频里得到可分析的人体姿态,MediaPipe Pose Landmarker 可以逐帧输出姿态关键点。它给出图像坐标和以髋部为参考的三维世界坐标;这类关键点结果可用于动作统计或后续动画处理,但本身不是已绑定骨骼的角色动画。
先准备视频和模型
准备一段人物全身尽量完整、画面稳定的短视频。安装 MediaPipe Tasks、OpenCV 和 NumPy,并从 Google 的 Pose Landmarker 文档下载模型文件 pose_landmarker_full.task。以下示例读取本地视频、按视频模式逐帧推理,并把每帧检测到的 33 个关节点写成 JSON;这是文档接口示例的组合写法,本文没有在你的设备上运行模型。

pip install mediapipe opencv-python numpy
逐帧提取关键点
import cv2, json
import mediapipe as mp
from mediapipe.tasks.python import BaseOptions
model_path = "pose_landmarker_full.task"
cap = cv2.VideoCapture("input.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
if fps <= 0:
raise ValueError("读取不到有效帧率")
Vision = mp.tasks.vision
options = Vision.PoseLandmarkerOptions(
base_options=BaseOptions(model_asset_path=model_path),
running_mode=Vision.RunningMode.VIDEO,
num_poses=1,
)
rows = []
frame_index = 0
with Vision.PoseLandmarker.create_from_options(options) as landmarker:
while True:
ok, bgr = cap.read()
if not ok:
break
rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb)
timestamp_ms = round(frame_index * 1000 / fps)
result = landmarker.detect_for_video(image, timestamp_ms)
if result.pose_landmarks:
points = result.pose_landmarks[0]
rows.append({"frame": frame_index, "timestamp_ms": timestamp_ms,
"landmarks": [{"x": p.x, "y": p.y, "z": p.z}
for p in points]})
frame_index += 1
cap.release()
with open("pose.json", "w", encoding="utf-8") as f:
json.dump(rows, f, ensure_ascii=False)
视频模式使用 detect_for_video,并为每帧传递毫秒时间戳。把模型文件路径、输入文件名改成自己的文件后再运行;若视频没有可读帧率,先用 FFmpeg 转成常见帧率的 MP4,再试一次。
核对结果,再用于后续动作分析
打开 pose.json,抽查开头、中段和结尾:每条记录的 timestamp_ms 应递增,完整检测到一人时 landmarks 应包含 33 项。MediaPipe 的图像坐标是归一化图像位置;世界坐标是以髋部附近为原点的三维姿态表示,不等同于房间中的绝对位置。遇到空列表通常表示该帧没检测到人,不要把它补成上一帧结果。
如果画面里多人,把 num_poses 调高后还要按每帧的检测结果逐人检查;遮挡、人物转身、画面裁切和运动模糊都会造成关键点跳动。要驱动 Blender 或游戏角色,还需要额外做坐标映射、骨架重定向和动作平滑。Pose Landmarker 能输出身体姿态关键点和世界坐标,不会自动替你完成这些步骤。
官方资料
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32014.html