基于人体姿态识别算法的行人抬手分析

前言

使用人体姿态识别算法检测出人体上半身关键点,根据关键点连线的关系判断出行人抬手的动作,并对两个行人抬手动作进行抬手相似度分析。

一、软件操作图

1.加载视频进行抬手动作分析,输出抬手角度,抬手动作时间。
2.横坐标为帧数,纵坐标为抬手角度,抬手角度一阶导数、抬手角度二阶导数,作图。
3.使用动态规划进行曲线相似度分析。

在这里插入图片描述

二、使用步骤

2.输出人体关键点

kp_points, kp_scores, boxes = self.detect_image(frame,threshhold=self.threshhold, detect_person=False)

2.角度计算

def cal_angle(point_1, point_2, point_3):
    """
    根据三点坐标计算夹角
    :param point_1:1坐标
    :param point_2:2坐标
    :param point_3:3坐标
    :return: 返回任意角的夹角值,这里只是返回点2的夹角
    """
    a = math.sqrt(
        (point_2[0] - point_3[0]) * (point_2[0] - point_3[0]) + (point_2[1] - point_3[1]) * (point_2[1] - point_3[1]))
    b = math.sqrt(
        (point_1[0] - point_3[0]) * (point_1[0] - point_3[0]) + (point_1[1] - point_3[1]) * (point_1[1] - point_3[1]))
    c = math.sqrt(
        (point_1[0] - point_2[0]) * (point_1[0] - point_2[0]) + (point_1[1] - point_2[1]) * (point_1[1] - point_2[1]))
    a += 0.0001
    c += 0.0001
    # A = math.degrees(math.acos((a * a - b * b - c * c) / (-2 * b * c)))
    B = math.degrees(math.acos((b * b - a * a - c * c) / (-2 * a * c)))
    # C = math.degrees(math.acos((c * c - a * a - b * b) / (-2 * a * b)))
    return round(B, 2)

3.相似度分析

# DTW计算序列s1,s2的最小距离
def DTW(s1, s2):
    m = len(s1)
    n = len(s2)

    # 构建二位dp矩阵,存储对应每个子问题的最小距离
    dp = [[0] * n for _ in range(m)]

    # 起始条件,计算单个字符与一个序列的距离
    for i in range(m):
        dp[i][0] = distance(s1[i], s2[0])
    for j in range(n):
        dp[0][j] = distance(s1[0], s2[j])

    # 利用递推公式,计算每个子问题的最小距离,矩阵最右下角的元素即位最终两个序列的最小值
    for i in range(1, m):
        for j in range(1, n):
            dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + distance(s1[i], s2[j])

    return dp[-1][-1]

总结

简单demo,仅供娱乐。

猜你喜欢

转载自blog.csdn.net/zengwubbb/article/details/122610526