前言
使用人体姿态识别算法检测出人体上半身关键点,根据关键点连线的关系判断出行人抬手的动作,并对两个行人抬手动作进行抬手相似度分析。
一、软件操作图
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,仅供娱乐。