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通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
轻松实现TensorFlow微信跳一跳的AI
Jan 05 Python
Odoo中如何生成唯一不重复的序列号详解
Feb 10 Python
python读取目录下最新的文件夹方法
Dec 24 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
python实现复制大量文件功能
Aug 31 Python
pymysql模块的操作实例
Dec 17 Python
python中round函数保留两位小数的方法
Dec 04 Python
pandas实现导出数据的四种方式
Dec 13 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php下统计用户在线时间的一种尝试
2010/08/26 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
用Vue.extend构建消息提示组件的方法实例
2017/08/08 Javascript
详解Vue-cli代理解决跨域问题
2017/09/27 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
浅谈JS for循环中使用break和continue的区别
2020/07/21 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
寻找网站后台地址的python脚本
2014/09/01 Python
Python中类的继承代码实例
2014/10/28 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
Python3 修改默认环境的方法
2019/02/16 Python
Django 删除upload_to文件的步骤
2020/03/30 Python
使用pyecharts1.7进行简单的可视化大全
2020/05/17 Python
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
AJAX都有哪些有点和缺点
2012/11/03 面试题
2014年文学毕业生自我鉴定
2014/04/23 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
综合素质评价个性与发展自我评价
2015/03/06 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
Python time库的时间时钟处理
2021/05/02 Python
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python
MySQL中的隐藏列的具体查看
2021/09/04 MySQL
python pygame 开发五子棋双人对弈
2022/05/02 Python