是否可通过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
相关产品推荐
相关产品推荐

