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中针对函数处理的特殊方法
Mar 06 Python
scrapy spider的几种爬取方式实例代码
Jan 25 Python
python安装模块如何通过setup.py安装(超简单)
May 05 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
使用python爬取微博数据打造一颗“心”
Jun 28 Python
Django接收自定义http header过程详解
Aug 23 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
python中rc1什么意思
Jun 19 Python
Python enumerate() 函数如何实现索引功能
Jun 29 Python
用Python实现职工信息管理系统
Dec 30 Python
python 远程执行命令的详细代码
Feb 15 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
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
Yii2第三方类库插件Imagine的安装和使用
2017/07/06 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
python 判断是否为正小数和正整数的实例
2017/07/23 Python
django之session与分页(实例讲解)
2017/11/13 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
举例讲解Python常用模块
2019/03/08 Python
Python封装成可带参数的EXE安装包实例
2019/08/24 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
优秀志愿者感言
2015/08/01 职场文书