目录

引言:

安装OpenCV

模板匹配函数介绍

模板匹配示例

1. 准备图像

2. 执行模板匹配

3. 查找匹配位置

4. 绘制矩形框

5. 显示结果

完整代码展示

 结论


引言:

在计算机视觉领域,模板匹配是一种强大的技术,用于在一幅图像中寻找特定图案或物体的位置。OpenCV是一个流行的计算机视觉库,它提供了丰富的工具来执行模板匹配任务。在本篇博客中,我们将学习如何使用OpenCV进行模板匹配,并展示一个简单的示例。

安装OpenCV

首先,确保你已经安装了OpenCV。你可以使用pip在命令提示符安装OpenCV:

pip install opencv-python

模板匹配函数介绍

 cv2.matchTemplate是OpenCV库中的一个函数,用于进行模板匹配。它可以在一个给定的图像(源图像)中搜索与一个指定模板图像最相似的区域。具体来说,这个函数会将模板图像滑动遍历源图像的每一个像素点,比较模板图像与源图像每一个小区域的相似度,返回一个灰度图像,每一个像素值表示源图像中对应位置与模板的匹配程度。这个函数在图像处理和计算机视觉任务中,如目标检测、图像识别等,有着广泛的应用。

cv2.matchTemplate函数的原型如下:

cv2.matchTemplate(image, templ, method, result[, mask])
  1. image:这是待搜索的图像,也被称为源图像
  2. templ:这是搜索模板,需要和源图像具有相同的数据类型,尺寸不能大于源图像
  3. 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. 准备图像

首先,我们需要准备两幅图像 - 主图像模板图像。主图像是我们要在其中查找模板的图像,而模板图像是我们要在主图像中匹配的小图案。

主图像:kele.png
模板图像:template.png

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提供了方便的工具来执行模板匹配任务,如上所示。你可以使用这些技术来构建各种应用,从对象检测到图像识别。

GitHub 加速计划 / opencv31 / opencv
142
15
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:3 个月前 )
d9a139f9 Animated WebP Support #25608 related issues #24855 #22569 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake 1 天前
09030615 V4l default image size #25500 Added ability to set default image width and height for V4L capture. This is required for cameras that does not support 640x480 resolution because otherwise V4L capture cannot be opened and failed with "Pixel format of incoming image is unsupported by OpenCV" and then with "can't open camera by index" message. Because of the videoio architecture it is not possible to insert actions between CvCaptureCAM_V4L::CvCaptureCAM_V4L and CvCaptureCAM_V4L::open so the only way I found is to use environment variables to preselect the resolution. Related bug report is [#25499](https://github.com/opencv/opencv/issues/25499) Maybe (but not confirmed) this is also related to [#24551](https://github.com/opencv/opencv/issues/24551) This fix was made and verified in my local environment: capture board AVMATRIX VC42, Ubuntu 20, NVidia Jetson Orin. ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [X] I agree to contribute to the project under Apache 2 License. - [X] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [X] The PR is proposed to the proper branch - [X] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake 1 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐