top of page
アンカー 1

一、前言

生活中我们偶尔会用手势来比划数字0-9,比如拳头代表0,拇指代表5,其余每个指头代表1。通过拇指和其余四根手指的配合就可以表示0-9的数字,所以我今天想做的就是识别这10个手势。。

二、算法原理

首先我们介绍下mediapipe模型的返回值

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


因为手指弯曲就代表该手指不计数,伸直才会计数,所以我的想法是通过判定每个手指的弯曲角度,进而来判定这跟手指是否要计数,比如拇指伸直状态,计数5,如果食指也是伸直状态,其余手指都是弯曲状态,那么就是5+1=6。

这样子的话问题就转化为怎么判断手指是否弯曲。因为mediapipe可以返回给我们每个关节点的三维坐标,所以问题又变为了三维空间中两个向量的夹角问题。以食指为例,如果指节(7,8)和指节(7,6)的夹角大约为180°的话,那么说明这两个指节处于伸直状态。数学角度来说的话,就是三维空间中向量(7,8)和(7,6)的夹角约等于180,则为伸直状态。

那么三维空间向量的夹角怎么求?抱歉我自己也忘记了,所以就只能按照自己的方式去计算。首先我们算出(7,8)的长度,也就是三维空间中两个点的距离,再分别算出(6,7)以及(6,8)的长度,这样子点(6,7,8)组成的三角形的三条边长我们都知道了,再通过以下公式算出该夹角的角度

  • 设△ABC的三条边BC=a,AC=b,AB=c,那么三个角的余弦是

  • cosA=(b²+c²-a²)/2bc;

  • cosB=(a²+c²-b²)/2ac;

  • cosC=(a²+b²-c²)/2ab。

补充:三维空间两点距离

  • 设A(x1,y1,z1),B(x2,y2,z2),则A,B之间的距离为

  • d=√[(x1-x2)^2+(y1-y2)^2+(z1-z2)^2]

这应该是初高中数学范畴吧,,,书到用时方恨少。


既然已经可以搞定每个指关节的角度问题,理论上来讲就可以根据关节弯曲程度来判定手势所代表的数字。但是考虑到性能问题,我决定只判定指尖开始第二个关节的角度,这样子就可以仅仅通过五个关节来识别手势。

※如果要高精度的话,可以计算每个关节的弯曲度


三、效果视频



四、源码下载

https://www.deepvisionzero.com/download

1 則留言
bottom of page