MediaPipe 人体关键点夹角分析 - 动作识别数据提取
使用 MediaPipe 分析图像中的人体关键点夹角并保存数据
本代码使用 MediaPipe 库分析每个文件夹中的图片,计算图像中人体关键点之间的夹角,并将每个文件夹(代表一个动作)的夹角信息存储到 1.svc 文件中。
1. 安装依赖库
import mediapipe as mp
import cv2
import math
import os
2. 计算夹角函数
def calculate_angle(a, b):
# 计算向量 a 和 b 的点积
dot_product = a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
# 计算向量 a 和 b 的模长
a_length = math.sqrt(a[0] ** 2 + a[1] ** 2 + a[2] ** 2)
b_length = math.sqrt(b[0] ** 2 + b[1] ** 2 + b[2] ** 2)
# 计算夹角的余弦值
cos_angle = dot_product / (a_length * b_length)
# 计算夹角的弧度值
angle = math.acos(cos_angle)
# 将弧度转换为角度
angle_degrees = math.degrees(angle)
return angle_degrees
3. 分析图像函数
def analyze_image(image_path):
# 加载图片
image = cv2.imread(image_path)
# 创建一个 MediaPipe Hands 模型
hands = mp.solutions.hands.Hands(static_image_mode=True)
# 分析图片并获取人体关键点信息
results = hands.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# 如果没有检测到人体关键点,则返回空列表
if not results.multi_hand_landmarks:
return []
# 获取第一个检测到的手的关键点列表
hand_landmarks = results.multi_hand_landmarks[0]
# 定义一个空列表,用于存储每个关键点的坐标
landmarks = []
# 遍历每个关键点,并将其坐标添加到列表中
for landmark in hand_landmarks.landmark:
landmarks.append((landmark.x, landmark.y, landmark.z))
# 计算每个关键点之间的夹角,并将其添加到夹角列表中
angles = []
for i in range(len(landmarks)):
for j in range(i + 1, len(landmarks)):
for k in range(j + 1, len(landmarks)):
a = landmarks[i]
b = landmarks[j]
c = landmarks[k]
angle = calculate_angle((a[0]-b[0], a[1]-b[1], a[2]-b[2]), (c[0]-b[0], c[1]-b[1], c[2]-b[2]))
angles.append(angle)
# 返回夹角列表
return angles
4. 遍历文件夹并保存数据
# 定义文件夹列表
folders = ['folder1', 'folder2', 'folder3']
# 创建1.svc文件
with open('1.svc', 'w') as f:
# 遍历每个文件夹
for folder in folders:
# 获取文件夹中的所有图片文件
image_files = os.listdir(folder)
# 定义一个空列表,用于存储每个图片的夹角信息
angles_list = []
# 遍历每个图片文件
for image_file in image_files:
# 构造图片文件的完整路径
image_path = os.path.join(folder, image_file)
# 分析图片并获取夹角信息
angles = analyze_image(image_path)
# 将夹角信息添加到列表中
angles_list.append(angles)
# 将夹角信息写入1.svc文件中
f.write(folder + '\n')
for angles in angles_list:
f.write(','.join(str(angle) for angle in angles) + '\n')
代码说明
- 代码首先定义了三个函数:
calculate_angle()用于计算两个向量之间的夹角,analyze_image()用于分析一张图片并返回人体关键点夹角信息,以及main()函数用于遍历文件夹并保存数据。 - 在
analyze_image()函数中,我们使用 MediaPipe 的 Hands 模型来检测人体关键点,然后计算每个关键点之间的夹角。 - 在
main()函数中,我们遍历每个文件夹,并使用analyze_image()函数分析每个文件夹中的所有图片。然后,将每个图片的夹角信息写入 1.svc 文件中,并以文件夹名称作为标记,方便后续读取和分析。
注意事项
- 确保安装了 MediaPipe 库,并已将图片放置在指定的文件夹中。
- 可以根据需要调整代码中的文件夹列表和输出文件名。
- 本代码只分析了第一个检测到的人手,如果需要分析多个手,可以修改代码逻辑。
- 由于本代码只计算了每个关键点之间的夹角,实际应用中可能需要根据具体情况选择其他的特征进行分析。
应用场景
该代码可以用于以下场景:
- 动作识别:通过分析不同动作的夹角信息,可以训练模型来识别不同的动作。
- 姿势评估:通过分析不同姿势的夹角信息,可以评估不同姿势的优劣。
- 人机交互:通过分析人体关键点信息,可以实现更加自然的人机交互。
进一步优化
- 可以使用更强大的机器学习模型来分析和识别动作。
- 可以添加更多特征,例如关键点的速度和加速度。
- 可以使用深度学习模型来识别更复杂的动作。
原文地址: https://www.cveoy.top/t/topic/j9Xt 著作权归作者所有。请勿转载和采集!