使用 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 库,并已将图片放置在指定的文件夹中。
  • 可以根据需要调整代码中的文件夹列表和输出文件名。
  • 本代码只分析了第一个检测到的人手,如果需要分析多个手,可以修改代码逻辑。
  • 由于本代码只计算了每个关键点之间的夹角,实际应用中可能需要根据具体情况选择其他的特征进行分析。

应用场景

该代码可以用于以下场景:

  • 动作识别:通过分析不同动作的夹角信息,可以训练模型来识别不同的动作。
  • 姿势评估:通过分析不同姿势的夹角信息,可以评估不同姿势的优劣。
  • 人机交互:通过分析人体关键点信息,可以实现更加自然的人机交互。

进一步优化

  • 可以使用更强大的机器学习模型来分析和识别动作。
  • 可以添加更多特征,例如关键点的速度和加速度。
  • 可以使用深度学习模型来识别更复杂的动作。
MediaPipe 人体关键点夹角分析 -  动作识别数据提取

原文地址: https://www.cveoy.top/t/topic/j9Xt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录