当前位置: 首页 > 科技观察

AI虚拟手势玩飞机大战

时间:2023-03-19 23:39:21 科技观察

大家好。下面就把这个小项目分解一下,带大家一步步实现。文末获取项目完整源码。1.准备AircraftWars程序在Github上找一个Python版本的AirplanesWars程序,安装Pygame运行。游戏操作简单,右上角是游戏暂停/开始按钮,用鼠标点击操作。键盘上的A、D、W、S键用于控制飞行器的运动方向,分别对应左、右、上、下。因此,我们的人工智能程序必须完成两个核心功能。第一,识别手势;第二,将手势转化为鼠标和键盘操作来控制游戏。2.识别手势在这里,我们使用opencv从摄像头读取视频流。将视频流中的每一帧发送到mediapipe中的手掌检测模型,识别出手掌的21个关键点。在我们的项目中,只用到了食指和中指,也就是左右的第8点和第12点。核心代码如下:ret,frame=cap.read()results=hands.process(frame[:,:,::-1])ifresults.multi_hand_landmarks:#遍历每只手掌,寻找results.multi_hand_landmarks中的hand_landmarks:finger_axis_8=hand_landmarks.landmark[8]finger_axis_12=hand_landmarks.landmark[12]frame是视频流中的每一帧,hands是手掌检测模型。解析出来的finger_axis_8和finger_axis_12两个对象分别存储了食指和中指的x坐标和y坐标。3.手势控制游戏暂停计算食指和中指坐标的距离,如果大于一定阈值,移动鼠标点击暂停游戏按钮。游戏暂停。如果食指和中指坐标之间的距离小于一定阈值,则移动鼠标并点击开始游戏按钮。开始游戏的距离计算非常简单。我不会在这里粘贴代码。重点是用Python来控制鼠标。我使用PyUserInput库,它提供了两个类,PyMouse和PyKeyboard,分别控制鼠标和键盘。当我们想用Python程序来控制游戏的暂停和开始时,只需要将鼠标移动到按钮的位置,进行点击操作即可。#定义鼠标对象self.mouse=PyMouse()defpause_or_start_game(self,dist):"""判断是否暂停(开始)游戏:paramdist:::return:"""if(notself.is_pauseanddist>80)or(self.is_pauseanddist<80):self.mouse.move(915,125)self.mouse.click(915,125)self.is_pause=notself.is_pausepause_or_start_game函数的参数dist为食指与中指之间的距离。暂停/开始按钮的坐标是(915,125)。每台电脑的坐标都不一样,需要根据自己的实际情况重新计算。计算思路很简单。游戏帧的大小为(480,700),游戏从屏幕中间开始。只要得到屏幕的大小,就可以大致估算出按钮的坐标。调用PyMouse的移动函数后,检查微调即可。PyMouse的move函数用于移动鼠标位置,click函数用于执行鼠标点击操作。4.手势控制飞行器的运动这里需要计算相邻两帧中食指的x坐标和y坐标的运动方向和距离。从而确定键盘A、D、W和S中的哪一个被按下。同样,移动的方向和距离也很简单,这里就不多说了,重点介绍PyKeyboard模块来控制键盘按键。self.key_board=PyKeyboard()#按下按钮self.key_board.press_key(key)#停留一段时间time.sleep(press_dwell)#释放按钮self.key_board.release_key(key)在press_key和release_key函数之间,calltime.sleep(press_dwell)控制按下按钮的持续时间。如果按下时间长,飞行器将移动更长的时间。反之,按下时间越短,飞行器的动作就越小。因此,这里的难点在于如何将食指的移动距离映射到按键的持续时间。我使用下面的一段代码来测量iinrange(n):kb.press_key('A')time.sleep(0.05)kb.release_key('A')固定按键时间为0.05秒,并且测试平面从中间部分移到最左边,需要最小的n。飞机从中间向最左边移动240,所以240/(n*0.05)是飞机每秒移动的距离。我测得n=7,所以飞机每秒移动685.7142857次。只要计算出食指移动的距离,除以685.7142857,就可以得到键盘上按键的时长。手势控制飞行器移动的完整代码为:defpress_key_board(self,direction,move_dist):"""将手指移动距离转换为按键间隔,进行按键操作:paramdirection:movingdirection:parammove_dist:移动距离:返回:“””dist_per_sec=685.7142857ifdirection=='x':key='A'ifmove_dist<0else'D'elifdirection=='y':key='W'ifmove_dist<0else'S'else:returnpress_dwell=math.fabs(move_dist/dist_per_sec)self.key_board.press_key(key)time.sleep(press_dwell)self.key_board.release_key(key)项目的核心部分已经解释完了,完整的代码已经整理出来了。小伙伴们可以在评论区留言。拿到代码后,先看运行中的steps.txt。如果您觉得本文对您有用,请点击阅读鼓励。以后会继续分享优秀的Python+AI项目。