使用 Mediapipe 生成人体骨骼角度数据集(Python 代码)
以下是一个示例代码,可以根据文件夹中的图像生成人体骨骼角度数据集,并将其保存为 CSV 文件。
import os
import csv
import mediapipe as mp
import cv2
# 初始化 Mediapipe 的人体姿态估计模型
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(static_image_mode=True, min_detection_confidence=0.5)
# 定义图像文件夹路径和 CSV 文件路径
image_folder_path = 'path/to/image/folder'
csv_file_path = 'path/to/csv/file.csv'
# 获取图像文件夹中所有图像的文件名
image_files = os.listdir(image_folder_path)
# 创建 CSV 文件并写入表头
with open(csv_file_path, mode='w', newline='') as csv_file:
fieldnames = ['image_name', 'nose_angle', 'left_shoulder_angle', 'right_shoulder_angle', 'left_elbow_angle', 'right_elbow_angle']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
# 循环处理每个图像文件
for image_file in image_files:
# 读取图像
image_path = os.path.join(image_folder_path, image_file)
image = cv2.imread(image_path)
# 进行人体姿态估计
results = pose.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 计算骨骼角度
if results.pose_landmarks is not None:
# 计算鼻子、左肩、右肩的角度
nose_angle = mp_pose.angle(
results.pose_landmarks.landmark[mp_pose.PoseLandmark.NOSE],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER]
)
left_shoulder_angle = mp_pose.angle(
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST]
)
right_shoulder_angle = mp_pose.angle(
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_ELBOW],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]
)
# 计算左肘、右肘的角度
left_elbow_angle = mp_pose.angle(
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST]
)
right_elbow_angle = mp_pose.angle(
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_ELBOW],
results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]
)
# 将角度写入 CSV 文件
writer.writerow({
'image_name': image_file,
'nose_angle': nose_angle,
'left_shoulder_angle': left_shoulder_angle,
'right_shoulder_angle': right_shoulder_angle,
'left_elbow_angle': left_elbow_angle,
'right_elbow_angle': right_elbow_angle
})
else:
print(f'No pose landmarks detected in {image_file}')
# 释放资源
pose.close()
在上面的代码中,我们首先初始化了 Mediapipe 的人体姿态估计模型,然后定义了图像文件夹路径和 CSV 文件路径。接下来,我们循环处理每个图像文件,读取图像并进行人体姿态估计。如果有姿态估计结果,我们就计算骨骼角度,并将它们写入 CSV 文件。最后,我们释放了资源。
请注意,上面的代码只是一个示例,您需要根据自己的需求进行修改和优化。例如,您可能需要添加异常处理来处理无法处理的图像文件,或者添加更多的骨骼角度计算。
原文地址: http://www.cveoy.top/t/topic/gnT0 著作权归作者所有。请勿转载和采集!