目录
引言:
在计算机视觉领域,模板匹配是一种强大的技术,用于在一幅图像中寻找特定图案或物体的位置。OpenCV是一个流行的计算机视觉库,它提供了丰富的工具来执行模板匹配任务。在本篇博客中,我们将学习如何使用OpenCV进行模板匹配,并展示一个简单的示例。
安装OpenCV
首先,确保你已经安装了OpenCV。你可以使用pip在命令提示符安装OpenCV:
pip install opencv-python
模板匹配函数介绍
cv2.matchTemplate
是OpenCV库中的一个函数,用于进行模板匹配。它可以在一个给定的图像(源图像)中搜索与一个指定模板图像最相似的区域。具体来说,这个函数会将模板图像滑动遍历源图像的每一个像素点,比较模板图像与源图像每一个小区域的相似度,返回一个灰度图像,每一个像素值表示源图像中对应位置与模板的匹配程度。这个函数在图像处理和计算机视觉任务中,如目标检测、图像识别等,有着广泛的应用。
cv2.matchTemplate
函数的原型如下:
cv2.matchTemplate(image, templ, method, result[, mask])
image
:这是待搜索的图像,也被称为源图像。templ
:这是搜索模板,需要和源图像具有相同的数据类型,尺寸不能大于源图像。method
:这个参数指定匹配方法:
cv2.TM_SQDIFF
: 平方差匹配,返回最小值。
cv2.TM_SQDIFF_NORMED
: 归一化平方差匹配,返回最小值。
cv2.TM_CCORR
: 相关性匹配,返回最大值。
cv2.TM_CCORR_NORMED
: 归一化相关性匹配,返回最大值。
cv2.TM_CCOEFF
: 相关性系数匹配,返回最大值。
cv2.TM_CCOEFF_NORMED
: 归一化相关性系数匹配,返回最大值。
4.result
: 这是一个可选的参数,如果提供,则用于存储比较结果的映射图像。这个图像必须是单通道,32位浮点型图像。如果源图像的尺寸为W*H
,模板图像的尺寸为w*h
,则结果图像的尺寸一定是 (W-w+1)*(H-h+1)
。
5.mask
(可选): 这是一个可选参数,通常为None
。如果提供,它应该是一个与主图像相同大小的掩码图像。在匹配期间,只有掩码图像中为非零的区域才会被考虑。
模板匹配示例
1. 准备图像
首先,我们需要准备两幅图像 - 主图像和模板图像。主图像是我们要在其中查找模板的图像,而模板图像是我们要在主图像中匹配的小图案。
import cv2
kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
2. 执行模板匹配
接下来,我们使用cv2.matchTemplate
函数执行模板匹配。这将在主图像中查找模板,并返回一个匹配结果矩阵。
cv2.matchTemplate
函数使用归一化相关系数匹配法进行模板匹配,返回相关系数矩阵res
。
h, w = template.shape[:2]
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)
3. 查找匹配位置
我们使用cv2.minMaxLoc
函数来获取匹配结果矩阵中的最小值、最大值,以及它们的位置。
这里关注的是最大值,因为它表示源图像中与模板最相似的位置。
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
4. 绘制矩形框
有了最大匹配位置后,我们可以在主图像上绘制一个矩形框,以标记匹配的区域。cv2.rectangle
函数用于在源图像上绘制这个矩形区域
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)
5. 显示结果
最后,我们显示带有矩形标记的主图像,以可视化匹配结果,然后等待用户按键并关闭所有窗口。
cv2.imshow('kele_template', kele_template)
cv2.waitKey(100000)
cv2.destroyAllWindows()
完整代码展示
'''图片模板匹配'''
kele = cv2.imread( 'kele.png ')
template = cv2.imread( 'template.png ' )
h ,w = template.shape[ :2]
res = cv2.matchTemplate(kele,template,cv2.TM_CCOEFF_NORMED)
# c v2.minHaxLoc可以获取矩阵中的最小值和最大值.以及最小值的索引号和最大值的索引号
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)#最小值、最大值、最小值位置、最大值位置
top_left = max_loc
bottom_right = (top_left[0]+w ,top_left[1]+h)
kele_template = cv2.rectangle(kele,top_left, bottom_right,(0,255,0),2)#绘删矩形cv2.imshow( ' kele_template ' ,kele_template)
cv2.imshow('kele_template',kele_template)
cv2.waitKey(100000)
cv2.destroyAllWindows()
结论
模板匹配是一个强大的计算机视觉技术,用于在图像中寻找特定模式或物体的位置。OpenCV提供了方便的工具来执行模板匹配任务,如上所示。你可以使用这些技术来构建各种应用,从对象检测到图像识别。