top of page
アンカー 1

一、前言

前面我们介绍了手势检测以及手势识别,今天要说的是姿势检测及识别。

因为我个人有运动的习惯,所以就以最基础的俯卧撑为例,实现以下三个目标:

1.检测到俯卧撑姿势

2.俯卧撑计数

3.检测结果输出。(push-up:计数)


二、算法原理

1.俯卧撑姿势检测

我么还是沿用谷歌的mediapipe模块来获取身体各个部位的三维坐标。mediapipe会给我们返回以下内容。

如图所示,返回值总共有33个点的信息,每个点包含了该点的横轴,纵轴以及深度信息,也就是该点三维信息。有了这些点的信息我们就可以设计算法来对姿势进行识别。

俯卧撑姿势很明显的特点就是身体处于水平状态,也就是腰部弯曲度接近于180,并且腰,肩,膝盖大约处于同一个水平度。基于这个特征我们就可以按照以下算法来判定是否为俯卧撑姿势:

①肩,腰以及膝盖组成的三角形中,腰部的夹角是否接近于180度(参考上一节三维空间坐标夹角算法)

②根据肩,腰以及膝盖的水平高度的标准偏差来判定姿势是否属于平卧状态。

※标准偏差(Std Dev,Standard Deviation) -统计学名词。一种度量数据分布的分散程度之标准,用以衡量数据值偏离算术平均值的程度。标准偏差越小,这些值偏离平均值就越少,反之亦然。标准偏差的大小可通过标准偏差与平均值的倍率关系来衡量。


2.俯卧撑计数

标准俯卧撑必然是一个手肘关节不断弯曲伸直的过程。在顶点时肘部弯曲度约为180度,最低点时肘部小于90度(根据个人力量不同会有偏差)。所以我的思路是

①比较当前帧图像和前一帧图像的手肘弯曲度,如果前后两帧图像的肘部弯曲度分别处于90度两侧,则可以判定为完成了一次俯卧撑。当然这个并不严谨,以后等有时间来再做一个高精度高通用的算法。

②有时候数据会有一些波动,导致连续很短的时间内,肘部弯曲角度在90度左右连续波动,这样子就会误判为多次俯卧撑。为了防止这个问题,设定前后两次俯卧撑动作之间的帧数差阈值,只有大于这个阈值才会计数+1。

③肘部弯曲度依然采用三维空间夹角算法


三、效果视频

效果还不错,完美的检测到姿势并且准确的进行了计数


四、源码

https://www.deepvisionzero.com/download

·图像处理第三弹

bottom of page