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

  • 使用Pygame实现简易飞机大战小游戏

  • 使用Python+OpenCV实现简单手势识别

  • 使用OpenCV实现手势识别玩飞机大战游戏

  • 使用TensorFlow实现手势识别玩飞机大战游戏


今天是第三部分:使用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深度学习,感谢支持!

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

  1. c语言全民飞机游戏代码,课内资源 - 基于VC++和OpenCV实现的全民飞机大战游戏

    摘要功能:利用C++语言完成了一个小游戏项目-全民飞机大战,该游戏首先能够给用户提供注册,登录功能:提供了菜单栏及两种游戏模式,一种是无尽模式,另一种是一般模式:一般模式中用户通过控制玩家飞机攻击敌方 ...

  2. python猜密码游戏规则_【python笔记 三 】python脚本实战---数字密码小游戏

    描述:A输入一个数值,输入时该数值已隐藏无法看到,让B猜该数字为多少,数值过小或过大都会提示,并会在最后猜对时统计出共猜了几次. 脚本内容: #!/usr/bin/env python #FileNa ...

  3. 用python玩转数据第三周_用Python玩转数据(三)

    1 找人程序(4分) 题目内容: 有5名某界大佬xiaoyun.xiaohong.xiaoteng.xiaoyi和xiaoyang,其QQ号分别是88888.5555555.11111.1234123 ...

  4. 在线试玩,在体感游戏中打败泰森,这位小哥破解了任天堂「拳无虚发」

    视学算法报道 编辑:张倩.陈萍 加入体感控制,这位小哥破解了原版任天堂的拳击格斗游戏「拳无虚发」. 在经典红白机上玩拳击游戏是很多人的童年回忆,其中就包括任天堂 1987 年发布的拳击格斗游戏--「P ...

  5. 【去后厂村开游戏厅吧】基于pp-tinypose的体感贪吃蛇游戏

    [去后厂村开游戏厅吧]基于pp-tinypose的体感贪吃蛇游戏 你是否也被腰痛所困扰!你是否也是久坐一族!你是否也是网瘾少年! 来玩体感贪吃蛇吧!只需要电脑上有摄像头就可以玩体感游戏啦~远离屏幕,扭 ...

  6. 体感开发学习总结 - 二

    Kinect开发学习笔记之(一)Kinect介绍和应用 http://blog.csdn.net/zouxy09/article/details/8145592 一.Kinect简介       Ki ...

  7. kinect体感互动拍照软件开发,支持绿幕/无背景两种,自定义成像区域

    体感互动拍照软件主要利用抠像技术和影像合成技术实现,参与者走进游戏区域内,会看见自己的影像已经被合成到前方的屏幕里,这就是抠像互动. 产品介绍: 佩京AR虚拟拍照系统支持绿幕和无背景,通过体感控制拍摄 ...

  8. 坦克大战系列二:从零编写【坦克大战】

    目录 1. 我方坦克发射单颗子弹 2.敌方坦克发射子弹 3. 击中敌方坦克 4. 爆炸效果 5. 敌方坦克自由移动 6.移动范围问题 7. 我方坦克发射多颗子弹 8. 敌方发射的子弹消亡后可以再发射子 ...

  9. 体感游戏 | 手势识别玩飞机大战游戏(二) Python+OpenCV实现简易手势识别功能

    后面将分四篇文章来介绍实现手势识别控制飞机大战游戏的功能,它们分别是: 使用Pygame实现简易飞机大战小游戏 使用Python+OpenCV实现简单手势识别 使用OpenCV实现手势识别玩飞机大战游 ...

最新文章

  1. 【区块链Go语言实现】区块链基本原型
  2. android源码framework下添加新资源的方法
  3. 不用鼠标,只用键盘,你还能操作自如吗?
  4. 【正一专栏】内马尔留不留下都已经是伤痕累累
  5. Delphi IDE使用的一些主要技巧
  6. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?
  7. qq拼音输入法下载|qq拼音输入法纯净版下载
  8. adadelta算法_【深度学习】深入理解优化器Optimizer算法(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)...
  9. ansys命令流——网格划分基础操作
  10. 使用HTML5 Canvas API中的clip()方法裁剪区域图像
  11. 用C++做的文本分割器(就是黑乎乎的那个)
  12. leetcode LCP 02. 分式化简
  13. 初识AutoIt v3
  14. 数据基础设施创新如火如荼,主要方向有哪些(下)
  15. TTL反相器、OC门、TS门、推挽输出、开漏输出
  16. 【知识图谱系列】动态知识图谱表示学习综述 | 十篇优秀论文导读
  17. 安装 Cartographer问题记录汇总
  18. input常见输入限制及金额转货币
  19. ghost博客mysql_centos 上快速搭建ghost博客方法分享
  20. 过拟和处理方法.md

热门文章

  1. 【数项级数】无穷个数相加一定是个数吗?
  2. Dubbo面试题及答案,2021年Dubbo面试题-持续更新中
  3. linux中yum安装splunk,Splunk tips
  4. Http文件分块上传
  5. 香港中文大学岳翔宇老师招收人工智能全奖博士生/博士后/研究助理/实习生
  6. vue+element-ui之tree树形控件有关子节点和父节点之间的各种选中关系详解
  7. NLP领域基本名词、算法
  8. 方差,标准差,标准误,均方根误差,平均绝对误差(SD,SE,RMSE,MAE)简单介绍
  9. 服务器异常重启,导致mysql启动失败,问题解决过程记录
  10. 关于http状态码302 请求重定向 前后端数据交互http302