如何通过Python编程提取c3d文件中MARKER对应的LABEL标签?
从C3D文件提取标记点标签的Python实现方案
方案1:基于当前使用的c3d库直接提取
你使用的c3d库的Reader实例本身已经内置了标记点标签属性,不需要在帧遍历逻辑中获取,直接访问对应属性即可,标签顺序和读取到的points数组的点顺序一一对应:
import c3d with open('capture.c3d', 'rb') as f: r = c3d.Reader(f) # 提取标记点标签,默认存储会带空白字符,需去除 point_labels = [label.strip() for label in r.point_labels] print("所有标记点标签列表:", point_labels) # 标签和每帧点数据对应示例 for frame_no, points, analog in r.read_frames(): print(f"\n第 {frame_no} 帧数据:") for label, point_info in zip(point_labels, points): x, y, z, residual = point_info print(f"{label}:坐标({x:.2f}, {y:.2f}, {z:.2f}),残差{residual:.2f}")
你还可以通过Reader实例获取其他C3D元信息:
- 标记点总数量:
r.point_count - 运动捕捉采样帧率:
r.point_rate - 模拟通道标签:
r.analog_labels - 文件总帧数:
r.header.last_frame - r.header.first_frame + 1
方案2:使用ezc3d库提取(兼容性更强)
如果遇到部分旧版本C3D格式文件用上述方法读取标签异常,可以换用运动捕捉领域更常用的ezc3d库,对C3D格式的支持覆盖更全面:
- 先安装库:
pip install ezc3d - 读取标签与数据的示例代码:
import ezc3d # 读取C3D文件 c3d_file = ezc3d.c3d('capture.c3d') # 提取标记点标签 point_labels = c3d_file['parameters']['POINT']['LABELS']['value'] print("所有标记点标签列表:", point_labels) # 提取所有帧的点坐标数据,维度为 [标记点数量, 3(x/y/z), 总帧数] point_data = c3d_file['data']['points'][:3, :, :].transpose(1, 0, 2) # 标签与数据对应示例 for label, frame_points in zip(point_labels, point_data): print(f"\n{label} 全帧坐标序列:\n{frame_points}")
内容的提问来源于stack exchange,提问作者RETOTU
相关产品推荐
相关产品推荐

