如何实现指定图片中的Pose数据CSV输出格式?
姿态识别CSV输出格式修正方案
现有代码的问题
- 错误地将多帧的同一关键点数据聚合到
distance_data[pose]中,导致最终写入时所有帧数据被平铺成一行,完全打乱了单帧对应一行的预期格式。 - 列表推导式的展开逻辑彻底混淆了帧与帧之间的数据边界。
修正后的代码
# 假设 poses 是你要提取的姿态关键点名称列表,dot_suffixes = ['x', 'y', 'z'] if results.pose_landmarks: current_frame_data = [] for pose in poses: landmark_attr = getattr(mp_pose.PoseLandmark, pose) landmark = results.pose_landmarks.landmark[landmark_attr] for suffix in dot_suffixes: val = getattr(landmark, suffix) # 按坐标类型缩放 if suffix in ('x', 'z'): val *= 640 elif suffix == 'y': val *= 320 current_frame_data.append(val) # 写入当前帧数据到CSV with open('distance_pose.csv', 'a', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(current_frame_data)
可选:添加CSV表头
如果需要给每列加上明确的名称(比如NOSE_x、NOSE_y),可以在首次写入文件时添加表头:
import os poses = ['NOSE', 'LEFT_EYE', 'RIGHT_EYE'] # 替换为你的实际关键点列表 dot_suffixes = ['x', 'y', 'z'] # 生成表头 header = [] for pose in poses: for suffix in dot_suffixes: header.append(f"{pose}_{suffix}") # 仅当文件为空或不存在时写入表头 if not os.path.exists('distance_pose.csv') or os.path.getsize('distance_pose.csv') == 0: with open('distance_pose.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(header)
关键说明
- 每处理一帧姿态数据,就生成对应一行的坐标列表,直接写入CSV,严格保证单帧数据的独立性。
- 去掉了多余的多帧数据聚合逻辑,简化代码结构的同时彻底避免数据混乱。
内容的提问来源于stack exchange,提问作者Johanes
相关产品推荐
相关产品推荐

