目录
1、项目简介
2、项目环境配置
3、代码运行
4、代码说明
此项目的核心内容是使用mediapipe库和pyautogui实现使用电脑摄像头进行手势识别,实时控制电脑鼠标完成移动、左右键、上下翻页,以及切换页面的功能。
(1) 首先需要安装anaconda来创建新的环境,具体请参考,执行完第三步即可(python>=3.7.6)
Windows安装Anaconda,创建pytorch环境,pycharm配置环境_无名大学生的博客-CSDN博客_anaconda安装进度条不动
(2)下载项目文件到本地
正在为您运送作品详情
(3)参考(1)链接中的第六步,在pycharm中新建一个工程,并将上一步下载的项目文件移动到此工程目录下。
(4)在anaconda的prompt之下,激活之前创建的环境,并进入(3)创建的工程目录下,再进入我们的项目文件夹内,然后输入
pip install -r requirements.txt
如下图:
下载完成如下图:
这时候,项目就可以运行起来了
请参考项目的README.md文件,其中有详细的使用教程,另外我还提供了一个演示视频,均在项目文件夹里,这里就不多赘述。
(1)分两个线程分别执行识别和系统硬件的控制
if __name__ == "__main__":
cl = threading.Thread(target=control.recognize, )
m = threading.Thread(target=move_m, )
cl.start()
time.sleep(1)
m.start()
cl 任务执行mediapipe的手掌识别,m 任务执行鼠标的控制等等任务
(2)部分手势的识别思路
手部动作识别的核心是手指的弯曲。手指弯曲部分代码如下,主要思路是以手指的四个关节之间的斜率的差来判断手指是否弯曲,定义以手指根部为参考点,上面三个关节相对于根关节的斜率之间的差不超过一个设置的微小量即可认为未弯曲。
# 用来判断手指弯曲状态。输入是一个手指上的四个点
def wave_stright(finger):
angle1 = np.arctan2((finger[0][1] - finger[1][1]), (finger[0][2] - finger[1][2]))
angle2 = np.arctan2((finger[0][1] - finger[2][1]), (finger[0][2] - finger[2][2]))
angle3 = np.arctan2((finger[0][1] - finger[3][1]), (finger[0][2] - finger[3][2]))
if np.abs((angle3 - angle1)) < diff_angle_tiny and np.abs((angle2 - angle1)) < diff_angle_tiny:
return True
else:
return False
# print(angle1, angle2, angle3)
由此出发可以得到不同手指的弯曲情况,进一步识别为不同手势。
(3)点击动作
点击动作与(2)中的手指弯曲有所不同,点击时,手指只需要上面两个关节稍微弯曲即可,而(2)中的弯曲是手指整个弯曲。这里我们的实现思路是,用指尖节点相对于手指根部的节点比上手根节点相对于手掌的根部节点的距离之比,作为一个判断依据,可以想象的是,手指稍微弯曲 时,其距离的比值会减小。这里采用比值的原因是,mediapipe识别的手掌上各节点之间的距离的大小随着手掌距离摄像头远近而改变。
# 用来判断是否有点击动作
def click_down(figer_top, figer_reference, hand_center, button):
if button == "left":
if len(figer_top[1], figer_top[2], hand_center[1], hand_center[2]) < \
len(figer_reference[1], figer_reference[2], hand_center[1], hand_center[2]):
return 1
else:
return 0
if button == "right":
if len(figer_top[1], figer_top[2], hand_center[1], hand_center[2]) < \
0.8 * len(figer_reference[1], figer_reference[2], hand_center[1], hand_center[2]):
return 1
else:
return 0
if button == "thum":
if len(figer_top[1], figer_top[2], hand_center[1], hand_center[2]) < \
1.1 * len(figer_reference[1], figer_reference[2], hand_center[1], hand_center[2]):
return 1
else:
return 0
(4)整体思路
利用上述的一些函数我们可以得到手指的弯曲情况,手势的情况。总的来说,首先调用mediapipe的手掌识别案例来识别出整个手掌,再把识别的结果,也就是各点坐标、距离等信息传递进各个函数,得到目前的控制模式(通过识别手势是数字几来切换),不同控制模式下,可以完成鼠标移动、点击、上下翻页,以及切换任务等功能。调用键盘和鼠标要用到pyautogui库,注意这个库不能做一些有些的脚本什么的,因为会被游戏屏蔽。