如何将归一化(x,y,z,v)扁平列表转为NormalizedLandmarkList以构建pose_landmarks
解决方案
要从CSV中存储的扁平归一化数值列表重建results.pose_landmarks结构,你需要按照MediaPipe Pose的关键点格式,将扁平数据拆分并组装成对应的PoseLandmarks和PoseLandmark对象,具体步骤如下:
步骤说明
MediaPipe的PoseLandmarks包含33个PoseLandmark元素,每个元素对应一个身体关键点,每个关键点存储x、y、z、visibility四个归一化值。CSV中的一行数据正是这33个关键点的四个值按顺序拼接的扁平列表,因此我们只需按每4个值一组拆分,逐个构建关键点对象即可。
完整代码示例
import mediapipe as mp import csv import cv2 # 1. 读取CSV中的扁平姿态数据 with open('pose_data.csv', 'r') as f: csv_reader = csv.reader(f) # 获取目标行(这里以第一行为例,可根据需求调整) flat_pose_values = next(csv_reader) # 将字符串转为浮点数 flat_pose_values = list(map(float, flat_pose_values)) # 2. 重建PoseLandmarks结构 mp_pose = mp.solutions.pose reconstructed_pose = mp_pose.PoseLandmarks() # 按每4个值为一组,遍历构建每个关键点 for idx in range(0, len(flat_pose_values), 4): landmark = mp_pose.PoseLandmark() landmark.x = flat_pose_values[idx] landmark.y = flat_pose_values[idx+1] landmark.z = flat_pose_values[idx+2] landmark.visibility = flat_pose_values[idx+3] reconstructed_pose.landmarks.append(landmark) # 3. 使用mp_drawing绘制姿态标注 mp_drawing = mp.solutions.drawing_utils # 读取待标注图像 image = cv2.imread('target_image.jpg') image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 绘制关键点和连接线条 mp_drawing.draw_landmarks( image, reconstructed_pose, mp_pose.POSE_CONNECTIONS, # 关键点样式 mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2), # 连接线样式 mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2) ) # 保存或展示结果 cv2.imwrite('annotated_pose.jpg', image) cv2.imshow('Annotated Pose', image) cv2.waitKey(0) cv2.destroyAllWindows()
注意事项
- 确保CSV中的数据顺序与MediaPipe Pose的33个关键点顺序完全一致,否则标注会出现错位(MediaPipe Pose关键点顺序固定,从鼻子、眼睛、耳朵依次到脚部)。
- 验证CSV行的元素数量应为132(33个关键点 × 4个属性),避免数据缺失或冗余导致重建失败。
- 归一化的
x/y值范围为0-1,z值相对关键点深度,visibility值为0-1(1表示关键点可见度高),确保转换后的数值符合该范围。
内容的提问来源于stack exchange,提问作者Sanjeev Singh
相关产品推荐
相关产品推荐

