深圳做网站收费,沈阳计算机培训短期速成班,兴宁区住房和城乡建设局网站,中国最大的网络公司排名目录
一、环境
二、模板匹配算法原理
三、代码演示 一、环境
本文使用环境为#xff1a;
Windows10Python 3.9.17opencv-python 4.8.0.74
二、模板匹配算法原理
cv.matchTemplate是OpenCV库中的一个函数#xff0c;用于在图像中查找与模板匹配的特征。它的主要应用场景…目录
一、环境
二、模板匹配算法原理
三、代码演示 一、环境
本文使用环境为
Windows10Python 3.9.17opencv-python 4.8.0.74
二、模板匹配算法原理
cv.matchTemplate是OpenCV库中的一个函数用于在图像中查找与模板匹配的特征。它的主要应用场景是在图像处理、计算机视觉和模式识别等领域。
算法原理 cv.matchTemplate函数通过计算输入图像与模板图像之间的相似度来找到最佳匹配位置。它使用滑动窗口的方法在输入图像上移动模板图像并计算每个窗口内的像素值差异。然后根据所选的匹配方法如平方差、归一化平方差、相关系数等对差异进行加权求和得到一个匹配得分矩阵。最后函数返回得分矩阵中的最大值及其位置作为最佳匹配位置。
函数API
retval, result cv2.matchTemplate(image, templ, method, mask)参数说明
image输入图像通常是一个灰度图像。templ模板图像可以是灰度图像或彩色图像。method匹配方法常用的有 cv2.TM_SQDIFF平方差匹配法计算结果越小表示匹配程度越高。cv2.TM_SQDIFF_NORMED归一化平方差匹配法计算结果越接近0表示匹配程度越高。cv2.TM_CCORR相关系数匹配法计算结果越接近1表示匹配程度越高。cv2.TM_CCORR_NORMED归一化相关系数匹配法计算结果越接近1表示匹配程度越高。cv2.TM_CCOEFF相关系数匹配法计算结果越接近1表示匹配程度越高。cv2.TM_CCOEFF_NORMED归一化相关系数匹配法计算结果越接近1表示匹配程度越高。mask可选参数mask是一个二值图作用于参数temp1有效区域则参与模板匹配计算
返回值说明
result匹配结果矩阵每个元素表示对应位置的匹配程度。minVal, maxVal, minLoc, maxLoc最佳匹配位置的最小值、最大值、最小值位置和最大值位置。
下面是对 cv.matchTemplate() 算法的简单解释
预处理首先将输入图像和模板图像转换为灰度图像。这是因为 cv.matchTemplate() 算法只支持灰度图像。滑动模板然后算法会在输入图像上滑动模板。对于每个位置从左到右、从上到下呗都会计算一个匹配分数。这个分数取决于当前位置的图像和模板的相似性。计算匹配分数根据选择的匹配方法计算当前位置的匹配分数。例如如果选择的是归一化相关系数方法那么算法会计算输入图像和模板在当前位置的相关系数。其他方法如归一化相关、平方差等会有不同的计算方式。找到最匹配的位置在所有位置中算法会找到匹配分数最高的位置。这个位置就是最匹配的位置。返回结果最后函数会返回一个包含所有匹配区域信息的结构。这个结构包含了每个匹配区域的坐标、匹配分数等信息。
需要注意的是由于滑动窗口的限制如果模板和图像的某些区域不匹配这些区域将不会被计入匹配分数。这是通过使用掩码mask参数实现的。掩码是一个与模板大小相同的二维数组值可以是0或1。在掩码中为1的位置将被计入匹配分数为0的位置则不会被计入。
总的来说cv.matchTemplate() 是一个强大的工具可以用于在图像中查找和模板最匹配的区域。它广泛应用于图像处理、计算机视觉和模式识别等领域。
三、代码演示
代码中需要的三张图这里给出来lena_tmpl.jpg以下是原图 tmpl.png以下是模板图意思是在原图中找到与其相似的区域用矩形画出来。 mask.png必须与tmp1.png尺寸相同是一个二值图用于表示模板计算过程中模板图中哪些区域用于模板匹配。 from __future__ import print_function
import sys
import cv2 as cv# 全局变量
use_mask False
img None
templ None
mask None
image_window Source Image
result_window Result windowmatch_method 0
max_Trackbar 5def main():# 读取三张图global imgglobal templimg cv.imread(data/lena_tmpl.jpg, cv.IMREAD_COLOR) # 图片1templ cv.imread(data/tmpl.png, cv.IMREAD_COLOR) # 图片2global use_maskuse_mask Trueglobal maskmask cv.imread(data/mask.png, cv.IMREAD_COLOR ) # 图片3if ((img is None) or (templ is None) or (use_mask and (mask is None))):print(Can\t read one of the images)return -1cv.namedWindow( image_window, cv.WINDOW_AUTOSIZE )cv.namedWindow( result_window, cv.WINDOW_AUTOSIZE )# 创建滑条trackbar_label Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMEDcv.createTrackbar( trackbar_label, image_window, match_method, max_Trackbar, MatchingMethod )# 执行模板匹配MatchingMethod(match_method)cv.waitKey(0)return 0def MatchingMethod(param):global match_methodmatch_method paramimg_display img.copy()# 模板匹配method_accepts_mask (cv.TM_SQDIFF match_method or match_method cv.TM_CCORR_NORMED)if (use_mask and method_accepts_mask):result cv.matchTemplate(img, templ, match_method, None, mask)else:result cv.matchTemplate(img, templ, match_method)# 将结果进行归一化到[0, 1]cv.normalize( result, result, 0, 1, cv.NORM_MINMAX, -1 )# 找到最佳匹配_minVal, _maxVal, minLoc, maxLoc cv.minMaxLoc(result, None)# 得到的匹配位置即一个矩形框if (match_method cv.TM_SQDIFF or match_method cv.TM_SQDIFF_NORMED):matchLoc minLocelse:matchLoc maxLoc# 可视化cv.rectangle(img_display, matchLoc, (matchLoc[0] templ.shape[0], matchLoc[1] templ.shape[1]), (0,255,0), 2, 8, 0 )cv.rectangle(result, matchLoc, (matchLoc[0] templ.shape[0], matchLoc[1] templ.shape[1]), (0,0,255), 2, 8, 0 )cv.imshow(image_window, img_display)cv.imshow(result_window, result)pass
if __name__ __main__:main()
以下是不同算法运行效果哪些算法吊一眼就能看出来自己可以玩一玩哈。
\n 0: SQDIFF \n 1: SQDIFF \n 2: TM CCORR \n 3: TM CCORR \n 4: TM COEFF \n 5: TM COEFF