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 简易计算器程序,代码就几行
Aug 29 Python
python实现的防DDoS脚本
Feb 08 Python
用Python的pandas框架操作Excel文件中的数据教程
Mar 31 Python
详解Django中的过滤器
Jul 16 Python
详解python使用Nginx和uWSGI来运行Python应用
Jan 09 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
pybind11和numpy进行交互的方法
Jul 04 Python
Python numpy数组转置与轴变换
Nov 15 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
Python绘制分类图的方法
Apr 20 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
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
PHP cURL获取微信公众号access_token的实例
2018/04/28 PHP
JS实现两个大数(整数)相乘
2014/04/28 Javascript
Bootstrap插件全集
2016/07/18 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
JS实现太极旋转思路分析
2016/12/09 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
Python3里的super()和__class__使用介绍
2015/04/23 Python
Python中for循环控制语句用法实例
2015/06/02 Python
Python中字符串的格式化方法小结
2016/05/03 Python
浅谈python可视化包Bokeh
2018/02/07 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python多线程下信号处理程序示例
2019/05/31 Python
Python类的动态绑定实现原理
2020/03/21 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
会计与审计专业大专生求职信
2013/10/03 职场文书
本科生求职简历的自我评价
2013/10/21 职场文书
《灯光》教学反思
2014/02/08 职场文书
500字作文之难忘的同学
2019/12/20 职场文书