You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可通过Plotly绘制Mediapipe人体姿态关键点与连接的动态3D散点图?

实现可行性说明

完全可以实现你需要的效果,既可以1:1对齐Mediapipe内置mp_draw.plot_landmarks()的姿态显示效果,又能保留Plotly的3D交互能力和动画时间轴控制功能,具体实现方案如下:

核心实现步骤
  • 提取逐帧关键点坐标:遍历Mediapipe姿态检测输出的results.pose_landmarks.landmark,按帧存储所有33个关键点的x/y/z三维坐标,统一处理为按帧分组的坐标列表即可。
  • 复用内置骨骼连接规则:直接调用Mediapipe预定义的mp.solutions.pose.POSE_CONNECTIONS常量,该常量已经标注了所有需要绘制的骨骼连接对,无需手动配置即可对齐原生工具的骨骼连接逻辑。
  • 封装Plotly动画帧:用3D散点图绘制关键点、3D线图绘制骨骼连接,将每帧的点和线数据封装为Plotly的动画帧对象,再配置时间轴滑块和播放控制组件即可。
核心代码示例
import mediapipe as mp
import plotly.graph_objects as go

# 初始化Mediapipe姿态检测模块
mp_pose = mp.solutions.pose
pose_detector = mp_pose.Pose(static_image_mode=False)
bone_connections = mp_pose.POSE_CONNECTIONS

# 这里假设你已经预处理得到所有帧的关键点集合all_frame_landmarks
# all_frame_landmarks的每个元素对应一帧的关键点,格式为[[x1,y1,z1], [x2,y2,z2], ..., [x33,y33,z3]]
animation_frames = []
for single_frame_landmarks in all_frame_landmarks:
    # 绘制当前帧的关键点散点
    landmark_scatter = go.Scatter3d(
        x=[point[0] for point in single_frame_landmarks],
        y=[point[1] for point in single_frame_landmarks],
        z=[point[2] for point in single_frame_landmarks],
        mode='markers',
        marker=dict(size=5, color='red')
    )
    # 绘制当前帧的所有骨骼连接线
    bone_lines = []
    for conn in bone_connections:
        start_idx, end_idx = conn
        line = go.Scatter3d(
            x=[single_frame_landmarks[start_idx][0], single_frame_landmarks[end_idx][0]],
            y=[single_frame_landmarks[start_idx][1], single_frame_landmarks[end_idx][1]],
            z=[single_frame_landmarks[start_idx][2], single_frame_landmarks[end_idx][2]],
            mode='lines',
            line=dict(width=2, color='blue')
        )
        bone_lines.append(line)
    # 组装为动画帧
    animation_frames.append(go.Frame(data=[landmark_scatter] + bone_lines))

# 初始化动画画布
fig = go.Figure(
    data=animation_frames[0].data,
    frames=animation_frames
)
# 配置播放控件与时间轴
fig.update_layout(
    updatemenus=[dict(
        type="buttons",
        buttons=[dict(label="播放", method="animate", args=[None])]
    )],
    sliders=[dict(
        steps=[dict(method='animate', args=[[f'{i}']]) for i in range(len(animation_frames))]
    )],
    # 对齐原生工具的3D显示比例,避免骨骼变形
    scene=dict(
        aspectmode='data',
        xaxis_title='X轴',
        yaxis_title='Y轴',
        zaxis_title='Z轴'
    )
)

# 展示交互图
fig.show()
效果对齐说明
  • 视觉效果对齐:你可以自由调整散点的大小、颜色,连接线的粗细、颜色,完全可以和Mediapipe原生绘图的视觉效果保持一致。
  • 视角调整:通过修改scene下的camera参数,可以将3D视角调整为和原生工具完全相同的观测角度,aspectmode='data'可以保证骨骼比例不会出现拉伸变形。
  • 交互能力:生成的图像支持自由旋转、缩放、平移3D视角,拖动时间轴滑块可以直接跳转到任意帧,播放过程中也可以随时暂停调整视角,完全满足你的需求。

内容的提问来源于stack exchange,提问作者Atharva Katre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:48:02