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 相关文章推荐
在Django框架中设置语言偏好的教程
Jul 27 Python
如何在Python中编写并发程序
Feb 27 Python
python网络爬虫学习笔记(1)
Apr 09 Python
深入浅析python with语句简介
Apr 11 Python
python 处理数字,把大于上限的数字置零实现方法
Jan 28 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
Python内置函数property()如何使用
Sep 01 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 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数据库类
2009/05/27 PHP
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
Ubuntu 16.04下安装PHP 7过程详解
2017/03/28 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
web css实现整站样式互相切换
2013/10/29 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
使用easyui从servlet传递json数据到前端页面的两种方法
2019/09/05 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
python数据结构之列表和元组的详解
2017/09/23 Python
python实现扫描日志关键字的示例
2018/04/28 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
2019/01/04 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
意大利奢侈品多品牌集合店:TheDoubleF
2019/08/24 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
团代会主持词
2014/04/02 职场文书
二手房买卖协议书
2014/04/10 职场文书
会计专业求职信
2014/08/10 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
小数乘法教学反思
2016/02/22 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python