
本项目基于PaddleHub内的hand_pose_localization进行手部关键点检测,通过自定义手势计算,实现包有"fist"、"five"、"gun"、"love"、"one"、"six"、"three"、"thumbUp"、"two"等9类手势的判别
首先进行PaddleHub、scikit-image、hand_pose_localization的安装,完成基础环境配置。



这一步主要是调用关键点检测API,得到21个关键点在图中的坐标数据,列表内位次对应各点编号。

21个关键点分布图:


keypoints存储上一步中得到的关键点坐标数据
connections存储各关键点(即坐标)连接规则,属于同一小列表内的数字对应的关键点为可以相互连接的,各关键点连接后可得到手掌走势图。

加载图像部分,由于cv.imread()读出来的格式是BGR,跟最常见的RGB格式颜色有所差别,所以先将其转为RGB再继续。
然后,根据keypoints内关键点坐标信息,在图像上对应点绘制绿色圆点,而后根据先前定义的connections绘制连接关键点的蓝色线条,最后显示绘制了关键点及线条的图像并保存
本部分定义了三个函数,用于计算手部关键点之间的角度,并根据这些角度确定手势
vector_2d_angle()

该函数通过向量的点积和模长公式来计算两个二维向量之间的角度,如果在计算阶段遇到数学上的异常情况,会将角度设置为表示该角度无效的值——65535°。如果计算得出的值大于180也会将其无效化,以免影响后续对手势的判断。
hand_angle()

该函数接收存储了关键点坐标数据的列表,使用上一个函数计算手掌和每个手指之间的角度,各手指用于计算角度的向量为下图所标注的蓝线与紫线。每个手指的角度计算完毕后存于列表angle_list中

h_gesture()

函数根据angle_list中的角度数据来判断手势。定义了几个阈值,如thr_angle、thr_angle_thumb和thr_angle_s,用于区分不同的手势,如果角度列表中包含65535度,则表示角度信息无效,不进行手势识别。否则,根据角度和阈值的比较结果,函数会返回一个代表特定手势的字符串,如fist、five、gun等


最后,将先前的程序整合到一个函数下运作,最后输出绘制好关键节点、线条及识别出的手势名称的图像。
输入图片:

输出图片:
