视频怎么提取人体动作关键点?用 MediaPipe Pose Landmarker 导出 33 个关节点

用 MediaPipe Pose Landmarker 的视频模式逐帧提取人体姿态关键点,导出带帧号和时间戳的 JSON,并核对 33 个点、遮挡误差与骨架动画之间的边界。

如果你想从视频里得到可分析的人体姿态,MediaPipe Pose Landmarker 可以逐帧输出姿态关键点。它给出图像坐标和以髋部为参考的三维世界坐标;这类关键点结果可用于动作统计或后续动画处理,但本身不是已绑定骨骼的角色动画。

先准备视频和模型

准备一段人物全身尽量完整、画面稳定的短视频。安装 MediaPipe Tasks、OpenCV 和 NumPy,并从 Google 的 Pose Landmarker 文档下载模型文件 pose_landmarker_full.task。以下示例读取本地视频、按视频模式逐帧推理,并把每帧检测到的 33 个关节点写成 JSON;这是文档接口示例的组合写法,本文没有在你的设备上运行模型。

视频怎么提取人体动作关键点?用 MediaPipe Pose Landmarker 导出 33 个关节点

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

赞 (0)
AI小管家的头像AI小管家
豆包关闭定位权限后为什么还知道城市?区分精确位置与网络位置
上一篇 1小时前
单张图片怎么生成 3D 模型?用 TripoSR 导出网格并检查背面瑕疵
下一篇 1小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部