在开始前,请允许我介绍一下Mediapipe:
MediaPipe是Google开发的一款开源框架,用于构建多模态应用机器学习解决方案,特别适用于处理实时和直播媒体。它提供了一系列预先训练好的模型,如面部检测、手势识别和人体姿态估计等,可以轻松集成到各种应用中。MediaPipe具有跨平台特性,支持包括Android、iOS、Desktop和Web在内的多种平台,能够实现高性能、低延迟的实时处理。
可以使用以下代码来安装mediapipe库
pip install mediapipe
上面两幅图片分别是手部的21个关键点和国际手语姿势表格
我们本次的代码主要就基于国际手语姿势表格来进行判断和编写
以下是函数的解析和示例
-
角度计算 (
get_angle
函数):- 使用向量点积和向量模长计算两个向量
v1
和v2
之间的角度。
- 使用向量点积和向量模长计算两个向量
-
读取摄像头 (
cap = cv2.VideoCapture(0)
):- 初始化一个OpenCV的VideoCapture对象,参数
0
表示默认摄像头。
- 初始化一个OpenCV的VideoCapture对象,参数
-
向量与X轴角度 (
vecter_x_angle
函数):- 计算一个二维向量与X轴的角度,使用arctan函数并转换为度数。
-
手势字符串获取 (
get_str_guester
函数):-
根据手指抬起的数量和手指的位置信息,识别不同的手势。
-
up_fingers
参数是一个列表,包含抬起的手指的ID。 -
list_fingers
参数是一个列表,包含所有手指的关键点坐标。 -
根据不同的条件,函数会返回不同的字符串来代表手势:
- 手指全部放下时,通过比较拇指与食指的距离来判断“E”或“S”。
- 当只有食指抬起时,根据食指关节间的向量角度判断“X”,或根据食指方向判断“Z”、“P”或“D”。
- 当只有一个手指抬起时,进一步判断这个手指是哪一根,然后根据特定条件识别不同的手势。
- 当有两个手指抬起时,根据这两个手指的ID和它们的位置关系,识别更多的手势。
- 当有三个或四个手指抬起时,根据手指ID组合识别手势。
- 当五个手指都抬起时,计算拇指与食指距离,识别“O”或“C”。
- 如果无法识别手势,则返回“recognizing”
-
话不多说,上代码
def get_angle(v1,v2):
angle = np.dot(v1,v2)/(np.sqrt(np.sum(v1*v1))*np.sqrt(np.sum(v2*v2)))
angle = np.arccos(angle)/3.14*180
return angle
cap = cv2.VideoCapture(0)
str_guester = ''
def vecter_x_angle(v):
return np.degrees(np.arctan2(v[1], v[0]))
def get_str_guester(up_fingers,list_fingers):
global str_guester
if len(up_fingers)==0:
if distance(list_fingers[4], list_fingers[15]) < distance(list_fingers[4], list_fingers[14]):