体感游戏 | 手势识别玩飞机大战游戏(三) 使用OpenCV实现手势识别玩飞机大战游戏

83 篇文章 25 订阅
44 篇文章 9 订阅

    后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是:


    今天是第三部分:使用OpenCV实现手势识别玩飞机大战游戏的功能。前面的两篇文章我们已经介绍了使用Pygame实现一个简易的飞机大战游戏以及使用Python+OpenCV实现简单手势识别。那么,实现手势识别来玩飞机大战游戏就是把它们两部分组合起来,听起来很简单,让我们一起实现它吧。


    第一步:先学会Windows下模拟按键按下的响应。

    Python中我们使用pypiwin32这个包,需要先安装pip install pypiwin32,然后导入使用:

import win32conimport win32apiimport time#第一个参数,键盘对应数字,查表#第二个,第四个没用#第三个参数,0代表按下,win32con.KEYEVENTF_KEYUP松开while True:    #win32api.keybd_event(37, 0, 0, 0)  # 键盘按下左键 37 <-    #time.sleep(0.5)            #win32api.keybd_event(37, 0, win32con.KEYEVEddddddddNTF_KEYUP, 0)  # 键盘松开
        win32api.keybd_event(38, 0, 0, 0)  #38对应上键    time.sleep(0.3)    win32api.keybd_event(38, 0, win32con.KEYEVENTF_KEYUP, 0)  # 键盘松开        #win32api.keybd_event(39, 0, 0, 0)  # 键盘按下右键 39 ->    #time.sleep(0.1)    #win32api.keybd_event(39, 0, win32con.KEYEVENTF_KEYUP, 0)  # 键盘松开

    不同按键对应什么数字,查看一下VKCode即可(如下)

图片

    第二步:将虚拟按键响应代码加入手势识别代码中。

    这里将上面的代码整理为函数使用(最好是分装成线程类方便调用):

 

class KeyEvent(threading.Thread):    def __init__(self, caller):        threading.Thread.__init__(self)        self.caller = caller #父类调用者                    def action(self,num):        if num == 2:          self.move_left_key()        elif num == 3:          self.move_right_key()        elif num == 4:          self.shooting_key()              def shooting_key(self):      win32api.keybd_event(38, 0, 0, 0)  # 键盘按下上键 38上键      time.sleep(0.1)      win32api.keybd_event(38, 0, win32con.KEYEVENTF_KEYUP, 0)
    def move_left_key(self):      win32api.keybd_event(37, 0, 0, 0)  # 键盘按下左键 37左键      time.sleep(0.1)      win32api.keybd_event(37, 0, win32con.KEYEVENTF_KEYUP, 0)
    def move_right_key(self):      win32api.keybd_event(39, 0, 0, 0)  # 键盘按下下键 39下键      time.sleep(0.1)      win32api.keybd_event(39, 0, win32con.KEYEVENTF_KEYUP, 0)            def run(self): #线程启动后自动调用此函数        while True:          if self.caller.exitFlag:              break          action()

    在手势识别后加入手势数字判断然后开启虚拟按键线程:

def show_camera(self):        flag, self.img = self.cap.read()        if self.img is not None:            num,img = self.Gesture_Recognize(self.img)            self.refreshShow(img)            self.Key=KeyEvent(self)#开启测试线程            self.Key.setDaemon(True)            self.Key.action(num)

    第三步:运行测试。

    我们设定手势2对应按键左移<-,手势3对应按键右移->,手势4对应发射炮弹。先打开并运行pygame游戏界面,然后运行手势识别程序,将鼠标点击到游戏界面窗口,然后通过手势识别控制飞机行动,效果如下:

图片

视频演示效果:https://www.bilibili.com/video/BV1UK411M73n

 

    代码还有很多待完善的地方,这里只做功能实现演示故没进一步做优化,有兴趣的朋友可以自己试着修改一下,最明显的比如子弹与敌人的距离关系设置不合理。下篇文章我们来介绍使用TensorFlow来替代OpenCV手势识别来控制飞机行动玩游戏,敬请期待。

    本文代码在公众号回复“OpenCV飞机大战”即可获取,更多视觉学习资讯请关注:OpenCV与AI深度学习,感谢支持!


  •  
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Color Space

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值