OpenCV:模板匹配。
时间:2022-07-26
本文章向大家介绍OpenCV:模板匹配。,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
端午放假期间,小F实现了小程序「跳一跳」的自动化。
主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB。
如果放在一起说,感觉内容有些多。
所以,分三期来讲,也能多了解一些东西。
首先介绍模板匹配,然后边缘检测,最后结合ADB实现「跳一跳」自动化。
游戏虽然过时了,但是拿来练练手还是不错的。
编程就该是快乐的,哈哈。
/ 01 / 模板匹配
模板匹配,就是在整个图像区域里发现与给定子图像相匹配的小块区域。
这里需要一个模板图像(给定的子图像)和一个待检测的图像(原图像)。
在待检测图像上,从左向右,从上向下计算模板图像与重叠子图像的匹配度,匹配度越大,两者相同的可能性越大。
这里主要涉及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的两个函数,来实现模板匹配。
# 获取模板图像的高和宽
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()
输出结果如下。
第一张图中最白的位置,即代表着最高的匹配。
第二张图中,矩形框则代表着匹配到的结果。
通过矩形框的位置参数,结合模板图像的大小,便可得到小跳棋中心点位置(底部)。
/ 03 / 总结
现在既然能检测到「跳一跳」小跳棋的位置,那么下一步就是方块的位置啦。
所以未完待续,下一篇边缘检测~
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7备份文件时备份文件加入备件日期
- Linux traceroute命令使用详解
- Linux 添加开机启动方法(服务/脚本)
- 概述Linux TTY/PTS的区别
- 在 Linux 命令行发送邮件的 5 种方法(推荐)
- Linux下Jenkins忘记密码的操作步骤
- Linux系统下Tomcat使用80端口的方法
- python 虚拟环境安装与卸载方法及遇到问题
- keras训练浅层卷积网络并保存和加载模型实例
- Python分析最近大火的网剧《隐秘的角落》
- PHP使用PDO操作sqlite数据库应用案例
- 一次因composer错误使用引发的问题与解决
- PHP生成二维码与识别二维码的方法详解【附源码下载】
- 详解PHP多个进程配合redis的有序集合实现大文件去重
- 原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】