效果展示:
原理:基于骨骼点之间得角度计算,进行相关约束。
部分代码展示:
hip = [landmarks[23].x, landmarks[23].y] # 屁股
knee = [landmarks[25].x, landmarks[25].y] # 膝盖
shoulder = [landmarks[11].x, landmarks[11].y] # 肩膀
ankle = [landmarks[27].x, landmarks[27].y] # 脚踝
# 计算角度
leg_angle = calculate_angle(ankle, knee, hip) # 脚踝,膝盖,屁股形成腿的角度
hip_angle = calculate_angle(knee, hip, shoulder) # 假设垂直向量的x坐标与髋关节相同,y坐标为0
# 检测腿部是否在一条直线上并且与身体成90度角
if pre_hip_angle < hip_angle: # 说明在抬腿
stage = 'up'
else:
stage = 'down'
'''
1.判断是否在初始位置
2.上了后才有下 ,上并且导致指定位置,下降导致初始位置才可计算
'''
if leg_angle > 160: # 判断腿是否笔直
is_leg = True
else:
is_leg = False
if 170 < hip_angle and is_leg:
is_open = True
if is_open: # 若开始则可计算
if pre_hip_angle > hip_angle and 85 < hip_angle < 105 and is_leg:
is_up = True # 则算导致指定位
if is_up and hip_angle > 170 and is_leg: # 腿上举过,现在放下来了,并且腿是直的
counter += 1 # 得分
is_open = False # 关闭
is_up = False # 上举结束,重新判断是否上举
pre_hip_angle = hip_angle