版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

最近在研究OpenCV,希望能通过机器视觉解决一些网络安全领域的问题。本文简要介绍如何通过OpenCV实现简单的图像识别,并让计算机通过“视觉”自动玩一个简单的2D小游戏,文末有视频演示及完整代码。

私货时间:5G时代,选择华为云!华为云专蜀月·西南钜惠活动开启,给力优惠请看文末。

感兴趣的四川小伙伴请访问:https://activity.huaweicloud.com/citysummit/internet.html?utm_source=&utm_medium=&utm_campaign=&utm_content=sichuan,留下您的信息,我们会第一时间与您联系!

0x01 OpenCV介绍

Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是3.1 ,2016年1月29日发布。(引自百度百科openCV)   

简言之,通过openCV可实现计算机图像、视频的编辑。广泛应用于图像识别、运动跟踪、机器视觉等领域。

0x02 环境

  • Win7 或Win10操作系统
  • Python 3.5 以上

0x03 安装

  • pip install --upgrade setuptools
  • pip install numpy Matplotlib
  • pip install opencv-python
  • pip install pyautogui
  • pip install mss
  • pip install pynput

0x04 代码说明

这个网站提供一个简单的2D小游戏,越过障碍获得分数,我们希望让计算机模拟人的行为控制小恐龙跳过地面上不断出现的树木,整个程序可以被分成三个阶段,即屏幕监控(看) > 障碍物识别(识别) > 键盘控制(控制)。

屏幕监控

我们使用python mss对屏幕的指定区域进行监控,其实就是不断截图并对一帧一帧的图片进行分析。 这里monitor变量保存的是屏幕监控的区域

 with mss.mss() as sct:
# Part of the screen to capture
** = {'top': , 'left': , 'width': , 'height': }
while 'Screen capturing':
# Get raw pixels from the screen, save it to a Numpy array
img = numpy.array(sct.grab(monitor))

图像识别

上一步我们通过监控屏幕上的指定区域可以获取到一帧一帧的图片,我们的目的是识别屏幕上出现的障碍物,以及障碍物的相对位置,这里主要是用OpenCV的matchTemplate方法在目标截图中查找已知的图像元素,所以我们要先截取一些障碍物的图片,如下图所示:

然后在目标图像中查找,这里我们设定图片比对的相似度阈值为65%,这样相当于是做模糊匹配,虽然可能会降低识别精准度,但可以少准备几个截图

 res2 = cv2.matchTemplate(img_gray, tree1, cv2.TM_CCOEFF_NORMED)
threshold = 0.65
loc2 = numpy.where(res2 >= threshold)

识别到相应的障碍物以后我们希望在物体周围画一个矩形框,这样方便调试和查看效果

 for pt in zip(*loc2[::-]):
cv2.rectangle(img, pt, (pt[] + tw, pt[] + th), (, , ), )

鼠标及键盘控制

识别到屏幕上的障碍物以后,我们要控制鼠标和键盘做出相应的操作,这里我们使用pyautoguipynput实现鼠标键盘的模拟

 def startgame():
pyautogui.click(web)
time.sleep(0.03)
pyautogui.keyDown('space')
time.sleep(0.03)
pyautogui.keyUp('space')
print('game start') def jump():
key.release(Key.down)
key.press(Key.space)
print('jump')
time.sleep(0.3)
key.release(Key.space)
key.press(Key.down)

效果演示

 import time
import pyautogui
from pynput.keyboard import Key, Controller
import cv2
import mss
import numpy # use browser to visit http://www.trex-game.skipser.com/
# put the browser to the left side and run the programme key = Controller() web = (, ) tree1 = cv2.imread('tree1.png', )
tw, th = tree1.shape[::-] tree4 = cv2.imread('tree4.png', )
tw4, th4 = tree4.shape[::-] birdie = cv2.imread('birdie1.png', )
nw, nh = birdie.shape[::-] def startgame():
pyautogui.click(web)
time.sleep(0.03)
pyautogui.keyDown('space')
time.sleep(0.03)
pyautogui.keyUp('space')
print('game start') def jump():
key.release(Key.down)
key.press(Key.space)
print('jump')
time.sleep(0.3)
key.release(Key.space)
key.press(Key.down) startgame() with mss.mss() as sct:
# Part of the screen to capture monitor = {'top': , 'left': , 'width': , 'height': } while 'Screen capturing':
key.press(Key.down)
# Get raw pixels from the screen, save it to a Numpy array
img = numpy.array(sct.grab(monitor)) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) res2 = cv2.matchTemplate(img_gray, tree1, cv2.TM_CCOEFF_NORMED)
res5 = cv2.matchTemplate(img_gray, tree4, cv2.TM_CCOEFF_NORMED)
res3 = cv2.matchTemplate(img_gray, birdie, cv2.TM_CCOEFF_NORMED) threshold = 0.65 loc2 = numpy.where(res2 >= threshold)
for pt in zip(*loc2[::-]):
cv2.rectangle(img, pt, (pt[] + tw, pt[] + th), (, , ), )
if pt[] + tw < :
jump()
break loc2 = numpy.where(res3 >= threshold)
for pt in zip(*loc2[::-]):
cv2.rectangle(img, pt, (pt[] + nw, pt[] + nh), (, , ), )
print("{0},{1}".format(pt[], pt[]))
if pt[] + nh > and pt[] + nw < :
jump()
break loc5 = numpy.where(res5 >= threshold)
for pt in zip(*loc5[::-]):
cv2.rectangle(img, pt, (pt[] + tw4, pt[] + th4), (, , ), )
if pt[] + tw4 < :
jump()
break # Display the picture
cv2.imshow('OpenCV/Numpy normal', img) # Press "q" to quit
if cv2.waitKey() & 0xFF == ord('q'):
cv2.destroyAllWindows()
break

来源:华为云社区 作者:菊花茶

私货时间:

5G时代,选择华为云!华为云专蜀月·西南钜惠活动开启:

西南节点云主机低至华北节点价格48折,四川老用户新增消费最高返50%,还有云迁移、安全检测、等保咨询、耀星计划扶持等给力福利;四川新用户最高免费送2万测试券,还有技术赋能、圈子赋能等诸多专享福利;华为云生态伙伴首单5折起

感兴趣的四川小伙伴请访问:https://activity.huaweicloud.com/citysummit/internet.html?utm_source=&utm_medium=&utm_campaign=&utm_content=sichuan

留下您的信息,我们会第一时间与您联系!

HDC.Cloud 华为开发者大会2020 即将于2020年2月11日-12日在深圳举办,是一线开发者学习实践鲲鹏通用计算、昇腾AI计算、数据库、区块链、云原生、5G等ICT开放能力的最佳舞台。

欢迎报名参会

OpenCV图像识别初探-50行代码教机器玩2D游戏【华为云技术分享】的更多相关文章

  1. 华为云实战开发】5.如何快速创建免费Git代码仓库【华为云技术分享】

    1 文章目的 本文主要帮助已经掌握或者想要掌握Git的开发者,如何更好的应用Git,以及更好的将Git与DevCloud结合应用. 2 概述 2.1 版本控制系统介绍 从狭义上来说,版本控制系统是软件 ...

  2. 华为云&#183;寻找黑马程序员#【代码重构之路】如何“消除”if/else【华为云技术分享】

    1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...

  3. 50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...

  4. HTML5游戏实战(1):50行代码实现正面跑酷游戏

    前段时间看到一个"熊来了"的HTML5跑酷游戏,它是一个典型的正面2D跑酷游戏,这里借用它来介绍一下用Gamebuilder+CanTK开发正面跑酷游戏的基本方法. CanTK(C ...

  5. iOS开发——实用技术OC篇&8行代码教你搞定导航控制器全屏滑动返回效果

    8行代码教你搞定导航控制器全屏滑动返回效果 前言 如果自定了导航控制器的自控制器的leftBarButtonItem,可能会引发边缘滑动pop效果的失灵,是由于 self.interactivePop ...

  6. python爬虫实战:利用scrapy,短短50行代码下载整站短视频

    近日,有朋友向我求助一件小事儿,他在一个短视频app上看到一个好玩儿的段子,想下载下来,可死活找不到下载的方法.这忙我得帮,少不得就抓包分析了一下这个app,找到了视频的下载链接,帮他解决了这个小问题 ...

  7. 50行代码实现python计算器主要功能

    实现功能:计算带有括号和四则运算的式子   3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层 ...

  8. 50行代码实现缓存,JAVA内存模型原理

    遇见这样的高人怎么办??下面是一个简单缓存的实现,相当牛叉!自己看吧,只有50行代码. 摘自:http://www.oschina.net/code/snippet_55577_3887 import ...

  9. 50行代码实现GAN | 干货演练

    2014年,Ian Goodfellow和他的同事发表了一篇论文,向世界介绍了生成对抗网络(GAN).通过对计算图和博弈论的创新性组合,他们表明如果有足够的建模能力,两个相互对抗的模型可以通过普通的反 ...

随机推荐

  1. NOIP模拟 15

    因为OJ停机,正好写(tui)个总结(boke) 题解不想写了. 前两题题意没看懂,其实比较简单. 最后一题神仙,想放弃. (迪神貌似又在疯狂骂自己) (我这么辣鸡我...) (下面开始跑题) 这两天 ...

  2. Redis性能解析--Redis为什么那么快?

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  3. Head First设计模式——单例模式

    单例模式是所有设计模式中最简单的模式,也是我们平常经常用到的,单例模式通常被我们应用于线程池.缓存操作.队列操作等等. 单例模式旨在创建一个类的实例,创建一个类的实例我们用全局静态变量或者约定也能办到 ...

  4. Python调用函数加括号和不加括号的区别

    Python调用函数加括号和不加括号的区别 # -*- coding: utf-8 -*- #!/usr/bin/env python # @Time : 2018/7/3 10:03 # @Desc ...

  5. python中字符串常见操作(二)

    # 可迭代对象有:字典,列表,元组,字符串,集合 str1 = '192.168.1.1' str2 = 'as df gh jk' str3 = '小李子' str4 = ['aa','bb','c ...

  6. Windows下编译最新版ChezScheme

    据说ChezScheme是最快的神级编译器,一秒钟几百万行,王垠说的2秒内编译自身绝不是夸张(看这里<揭秘Chez Scheme>,Scheme中文社区).ChezScheme由美国印第安 ...

  7. [java笔记] 最近学的一些笔记

    1.@Override的用法 2.父类的返回值类型的范围,与子类返回值类型的返回的大小关系: 3.子类方法的权限修饰符,与子类方法的权限修饰符: 4.如果p1是一个对象,p2也是个对象,那么代码p1= ...

  8. 微信小程序(mpvue) wx.openSetting 无法调起设置页面

    在开发过程有个需要保存图片/视频到设备相册的业务,so easy~   巴啦啦撸下来了完整功能, wx.saveVideoToPhotosAlbum 会自动调起用户授权,美滋滋~~   btu.... ...

  9. node.js和ionic

    1.安装node.js node -v  检测node文件是否安装成功 node --version  检查node版本号 2.Npm   node package manager 管理工具  管理模 ...

  10. lldb调试使用python脚本问题总结

    lldb调试器可以使用python脚本实现功能增强,但也不是可以随心所欲的,在实际中有很多地方需要注意. 首先是对多线程环境调试使用python脚本,也要考虑python脚本有多线程安全,尤其是有许多 ...