OpenCV模板匹配实战:从原理到「跳一跳」自动化第一步

远山来客
远山来客
发布时间:2026-10-12| 3人浏览过
原创

本文详解OpenCV模板匹配原理,重点解析cv2.matchTemplate与cv2.minMaxLoc函数的使用。通过六种匹配算法对比及Python代码示例,展示如何定位图像中的目标区域,为「跳一跳」游戏自动化脚本开发奠定技术基础。

近期,笔者尝试开发一款微信小程序「跳一跳」的自动运行程序。

该项目的核心技术栈涵盖了OpenCV的模板匹配与边缘检测算法,同时结合了Android调试桥(ADB)工具进行设备交互。

若将上述技术点一次性阐述,内容篇幅可能过于庞大。

因此,计划分三期进行连载,以便更系统地展开讨论。

本期首先聚焦于模板匹配技术,后续将依次介绍边缘检测,并最终整合ADB指令实现「跳一跳」的全流程自动化。

尽管该游戏已非热点,但作为技术练手项目仍具有不错的实践价值。

编程的本质应当是充满乐趣的,不是吗?

/ 01 / 模板匹配

模板匹配的核心任务,是在整幅图像中搜索并定位与给定子图像(模板)相吻合的区域。

这一过程需要两个关键输入:一是作为参考的模板图像(即给定的子图像),二是包含目标的原图像(待检测图像)。

算法会在待检测图像上执行滑动窗口操作,从左至右、从上至下逐区域计算模板与当前重叠子图像的匹配程度;匹配度越高,表明两者重合的可能性越大。

在OpenCV中,实现此功能主要依赖cv2.matchTemplate()和cv2.minMaxLoc()这两个核心函数。

前者用于在模板与输入图像之间执行匹配计算,并生成反映匹配结果的矩阵图像。

后者则用于在生成的匹配结果矩阵中查找最大值和最小值及其对应的坐标位置。

OpenCV提供的模板匹配算法共包含以下六种类型。

# 第一类,利用平方差来进行匹配,最好匹配为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的区间内。

需要注意的是,平方差类算法(SQDIFF)遵循“值越小匹配越好”的原则,而其余五种算法均遵循“值越大匹配越好”的逻辑。

/ 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 / 总结

既然已经成功定位了「跳一跳」中小跳棋的位置,接下来的关键步骤便是识别方块的位置。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。