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

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': 280, 'left': 100, 'width': 660, 'height': 300}while 'Screen capturing':# Get raw pixels from the screen, save it to a Numpy arrayimg = 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[::-1]):
cv2.rectangle(img, pt, (pt[0] + tw, pt[1] + th), (0, 0, 255), 2)

鼠标及键盘控制

识别到屏幕上的障碍物以后,我们要控制鼠标和键盘做出相应的操作,这里我们使用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 programmekey = Controller()web = (200, 400)tree1 = cv2.imread('tree1.png', 0)
tw, th = tree1.shape[::-1]tree4 = cv2.imread('tree4.png', 0)
tw4, th4 = tree4.shape[::-1]birdie = cv2.imread('birdie1.png', 0)
nw, nh = birdie.shape[::-1]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 capturemonitor = {'top': 280, 'left': 100, 'width': 660, 'height': 300}while 'Screen capturing':key.press(Key.down)# Get raw pixels from the screen, save it to a Numpy arrayimg = 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.65loc2 = numpy.where(res2 >= threshold)for pt in zip(*loc2[::-1]):cv2.rectangle(img, pt, (pt[0] + tw, pt[1] + th), (0, 0, 255), 2)if pt[0] + tw < 280:jump()breakloc2 = numpy.where(res3 >= threshold)for pt in zip(*loc2[::-1]):cv2.rectangle(img, pt, (pt[0] + nw, pt[1] + nh), (0, 0, 255), 2)print("{0},{1}".format(pt[0], pt[1]))if pt[1] + nh > 280 and pt[0] + nw < 420:jump()breakloc5 = numpy.where(res5 >= threshold)for pt in zip(*loc5[::-1]):cv2.rectangle(img, pt, (pt[0] + tw4, pt[1] + th4), (0, 0, 255), 2)if pt[0] + tw4 < 280:jump()break# Display the picturecv2.imshow('OpenCV/Numpy normal', img)# Press "q" to quitif cv2.waitKey(25) & 0xFF == ord('q'):cv2.destroyAllWindows()break

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

OpenCV图像识别初探-50行代码教机器玩2D游戏相关推荐

  1. 50 行代码教 AI 实现动作平衡 | 附完整代码

    [CSDN 编者按]本文将为大家展示如何通过 Numpy 库和 50行 Python 代码,使用标准的 OpenAI Gym平台创建智能体 (Agent),就教会机器处理推车杆问题 (Cart Pol ...

  2. 50行代码教AI实现动作平衡 | 附完整代码

    作者 | Mike Shi 译者 | linstancy 责编 | Jane 出品 | AI科技大本营(id:rgznai100) [导读]本文将为大家展示如何通过 Numpy 库和 50行 Pyth ...

  3. 50行的python游戏代码_使用50行Python教AI玩运杆游戏

    编译:yxy 出品:ATYUN订阅号 嗨,大家好!今天我想展示如何使用50行Python代码教一台机器来平衡杆!我们将使用标准的OpenAI Gym作为我们的测试环境,并只使用numpy创建我们的智能 ...

  4. 猫眼html源码,50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...

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

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 今天,手把手教你入门 Python 爬虫,爬取猫眼电影 TOP100 榜信息. 作者 | 丁 ...

  6. 50行代码教你打造一个公众号文章采集器

    Alfred的女票是一枚数据科学领域的新媒体运营官(是的,Alfred是一名程序员,Alfred有女票),每天都要阅读大量的行业相关文章,以掌握行业的动向,挑选和生产相关内容.为此,她关注了一大批的相 ...

  7. python跑酷游戏源码_HTML5游戏实战(1):50行代码实现正面跑酷游戏

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

  8. 如何用50行代码构建情感分类器

    选自Toward Data Science,作者:Rohith Gandhi,机器之心编译. 本文介绍了如何构建情感分类器,从介绍自然语言处理开始,一步一步讲述构建过程. 自然语言处理简介 语言把人类 ...

  9. 【PyTorch】50行代码实现GAN——PyTorch

    本文来源于PyTorch中文网. 一直想了解GAN到底是个什么东西,却一直没能腾出时间来认真研究,前几日正好搜到一篇关于PyTorch实现GAN训练的文章,特将学习记录如下,本文主要包含两个部分:GA ...

最新文章

  1. 机房收费系统总结【2】-细节优化
  2. 《深入浅出Windows Phone 8应用开发》
  3. 部署WAR包实时查看Tomcat的状态和日志
  4. Pandas中文官档 ~ 基础用法1
  5. 关于 sql语句的一些小优化
  6. c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,上海交通大学继续教育学院2012春——程序设计(C)作业1(有答案)...
  7. Code First :使用Entity. Framework编程(6) ----转发 收藏
  8. beaninfo详解源码解析 java_Java后端精选技术:源码解析Spring Cloud Zuul
  9. 人工智能TensorFlow工作笔记008---张量的使用
  10. 多线程例题练手(c入门)
  11. 解析WINDOWS中的DLL文件---经典DLL解读
  12. Wonderware-InTouch相关软件下载链接(intouch、驱动、OPC、数据库)
  13. 实验项目一 俄罗斯方块游戏
  14. Facebook 前端技术栈重构分享
  15. 调试的时候没有在断点处停止的原因
  16. 【C++】Win10设置默认程序
  17. 安装vim的最新版本
  18. 简易处理字典MDX文件的方法
  19. 初识go-micro
  20. 2.递归解决年龄问题

热门文章

  1. php mysql 多表搜索_PHP MYSQL查询,使用来自多个表的数据搜索多个字段/列
  2. c语言一元二次方程代码,一元二次方程求解程序完整代码
  3. Qt Quick QMl学习笔记 之图片浏览器
  4. C++ map中使用erase应该注意到的问题
  5. 在ubuntu下面安装glew
  6. Python 第一章 基础知识
  7. 源码研究:php变量
  8. String.Format数字格式化输出 {0:N2} {0:D2} {0:C2}
  9. 数据与运算(以及补码)
  10. linux 7 远程桌面xrdp,[转帖]CentOS7安装xrdp(windows远程桌面连接linux)