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用imghdr模块识别图片格式实例解析
Jan 11 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python爬虫获取图片并下载保存至本地的实例
Jun 01 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
使用Python 统计高频字数的方法
Jan 31 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
Python 3 判断2个字典相同
Aug 06 Python
python脚本调用iftop 统计业务应用流量的思路详解
Oct 11 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 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
上海无线电三厂简史修改版
2021/03/01 无线电
js资料prototype 属性
2007/03/13 Javascript
javascript引用对象的方法代码
2007/08/13 Javascript
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
JavaScript统计字符串中每个字符出现次数完整实例
2016/01/28 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
jQuery实现节点的追加、替换、删除、复制功能示例
2017/07/11 jQuery
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
nodejs dgram模块广播+组播的实现示例
2019/11/04 NodeJs
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
Python安装Imaging报错:The _imaging C module is not installed问题解决方法
2014/08/22 Python
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
道路建设实施方案
2014/03/18 职场文书
药店采购员岗位职责
2014/09/30 职场文书
房屋产权证明书
2014/10/15 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
如何理解及使用Python闭包
2021/06/01 Python
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL