OpenCV 模板匹配


Posted in Python onJuly 10, 2019

最近小编实现一个微信小程序「跳一跳」的自动化。

主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB。

如果放在一起说,感觉内容有些多。

所以,分三期来讲,也能多了解一些东西。

首先介绍模板匹配,然后边缘检测,最后结合ADB实现「跳一跳」自动化。

游戏虽然过时了,但是拿来练练手还是不错的。

编程就该是快乐的,哈哈。

/ 01 / 模板匹配

模板匹配,就是在整个图像区域里发现与给定子图像相匹配的小块区域。

这里需要一个模板图像(给定的子图像)和一个待检测的图像(原图像)。

在待检测图像上,从左向右,从上向下计算模板图像与重叠子图像的匹配度,匹配度越大,两者相同的可能性越大。

OpenCV 模板匹配

这里主要涉及OpenCV的cv2.matchTemplate()cv2.minMaxLoc()函数。

第一个函数作用是在模板和输入图像之间寻找匹配,获得匹配结果图像。

第二个函数的作用则是在给定的矩阵中寻找最大和最小值(包括它们的位置)。

其中模板匹配算法有以下六种。

# 第一类,利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大
# 平方差匹配
method=CV_TM_SQDIFF
# 标准平方差匹配
method=CV_TM_SQDIFF_NORMED
# 第二类,采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果
# 相关匹配
method=CV_TM_CCORR
# 标准相关匹配
method=CV_TM_CCORR_NORMED
# 第三类,将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)
# 相关系数匹配
method=CV_TM_CCOEFF
# 标准相关系数匹配
method=CV_TM_CCOEFF_NORMED

标准化意味着将数值统一到0~1。

除了平方差类型的是值越小越好,其他的都是值越大越好。

/ 02 / 图像检索

首先来看一下两张图像,都为灰度图。

import cv2
# 读取待检测图像
img = cv2.imread('game.png', 0)
# 读取模板图像
temple = cv2.imread('temple.png', 0)
# 显示灰度处理后的待检测图像
cv2.namedWindow('sample', 0)
cv2.resizeWindow('sample', 400, 600)
cv2.imshow('sample', img)
# 显示灰度处理后的模板图像
cv2.namedWindow('target', 0)
cv2.resizeWindow('target', 400, 600)
cv2.imshow('target', temple)

输出结果如下。

OpenCV 模板匹配

第一张为模板图像,第二张为待检测图像。

下面使用OpenCV的两个函数,来实现模板匹配。

# 获取模板图像的高和宽
th, tw = temple.shape[:2]
print(th, tw)
# 使用标准相关系数匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性
result = cv2.matchTemplate(img, temple, cv2.TM_CCOEFF_NORMED)
# result为匹配结果矩阵
# print(result)
# TM_CCOEFF_NORMED方法处理后的结果图像
cv2.namedWindow('match_r', 0)
cv2.resizeWindow('match_r', 400, 600)
# 显示窗口
cv2.imshow('match_r', result)
# 使用函数minMaxLoc,确定匹配结果矩阵的最大值和最小值(val),以及它们的位置(loc)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 此处选取最大值的位置,为图像的左上角
tl = max_loc
# 获取图像的右下角
br = (tl[0]+tw, tl[1]+th)
# 绘制矩形框
cv2.rectangle(img, tl, br, (0, 0, 255), 2)
# 设置显示窗口
cv2.namedWindow('match', 0)
cv2.resizeWindow('match', 400, 600)
# 显示窗口
cv2.imshow('match', img)
# 结束
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下。

OpenCV 模板匹配

第一张图中最白的位置,即代表着最高的匹配。

第二张图中,矩形框则代表着匹配到的结果。

通过矩形框的位置参数,结合模板图像的大小,便可得到小跳棋中心点位置(底部)。

/ 03 / 总结

现在既然能检测到「跳一跳」小跳棋的位置,那么下一步就是方块的位置啦。

Python 相关文章推荐
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
Django bulk_create()、update()与数据库事务的效率对比分析
May 15 Python
python安装cx_Oracle和wxPython的方法
Sep 14 Python
详解KMP算法以及python如何实现
Sep 18 Python
pycharm如何设置官方中文(如何汉化)
Dec 29 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
Python实现byte转integer
Jun 03 Python
8种用Python实现线性回归的方法对比详解
Jul 10 #Python
Python实现计算对象的内存大小示例
Jul 10 #Python
Python画图高斯分布的示例
Jul 10 #Python
使用Python实现跳一跳自动跳跃功能
Jul 10 #Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 #Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 #Python
Python 占位符的使用方法详解
Jul 10 #Python
You might like
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
服务端 VBScript 与 JScript 几个相同特性的写法 By shawl.qiu
2007/03/06 Javascript
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
JS JQUERY实现滚动条自动滚到底的方法
2015/01/09 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
实现高性能javascript的注意事项
2019/05/27 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
python中实现k-means聚类算法详解
2017/11/11 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
介绍一下Linux中的链接
2016/05/28 面试题
会计专业毕业生自我评价
2013/09/25 职场文书
英语国培研修感言
2014/02/13 职场文书
法律进机关实施方案
2014/03/12 职场文书
HR求职自荐信范文
2014/06/21 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
分家协议书范本
2016/03/22 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
SQL Server基本使用和简单的CRUD操作
2021/04/05 SQL Server