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通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Python实现小数转化为百分数的格式化输出方法示例
Sep 20 Python
解读! Python在人工智能中的作用
Nov 14 Python
Python遍历numpy数组的实例
Apr 04 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
基于python实现高速视频传输程序
May 05 Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 Python
python学生信息管理系统实现代码
Dec 17 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
教你怎么用Python selenium操作浏览器对象的基础API
Jun 23 Python
python异步的ASGI与Fast Api实现
Jul 16 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上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
Codeigniter实现智能裁剪图片的方法
2014/06/12 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
我见过最全的个人js加解密功能页面
2007/12/12 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
jquery取消选择select下拉框示例代码
2014/02/22 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
vue中的event bus非父子组件通信解析
2017/10/27 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
2017/11/17 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python提取字典key列表的方法
2015/07/11 Python
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
Python函数装饰器实现方法详解
2018/12/22 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
Python实现区域填充的示例代码
2021/02/03 Python
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
Linux机考试题
2015/07/17 面试题
静态变量和实例变量的区别
2015/07/07 面试题
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
模具数控专业自荐信
2014/01/27 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
在职证明范本
2015/06/15 职场文书