day 32 学习笔记
文章目录
- 前言
- 一、模版匹配的概念
- 二、模版匹配方法
前言
- 通过今天的学习,我掌握了OpenCV中有关模版匹配和模版匹配方法的相关原理和操作
一、模版匹配的概念
- 模板匹配就是用模板图(通常是一个小图)在目标图像(通常是一个比模板图大的图片)中不断的滑动比较,通过某种比较方法来判断是否匹配成功,找到模板图所在的位置。
需要注意的是:
-
模版匹配不会进行边缘填充。
-
类似于卷积,滑动比较,挨个比较象素。
-
返回结果大小是:目标图大小-模板图大小-1。
二、模版匹配方法
res=cv2.matchTemplate(image, templ, method)
- img:指原图像,一个灰度图或者彩色图
- temp:模版图像,要求与原图像具有相同的通道数
- method:匹配方法,包括以下几种
-
- cv2.TM_CCOEFF
- cv2.TM_CCOEFF_NORMED
- cv2.TM_CCORR
- cv2.TM_CCORR_NORMED
- cv2.TM_SQDIFF
- cv2.TM_SQDIFF_NORMED
实际上共有三种方法,只不过每一种方法对应一种归一化方法
- 该方法的返回值是一个矩阵,矩阵中的每个元素代表原图像对应位置与模版图的匹配相似度
- 可以想象成将将原图分为大小与模版相同的许多小块,每一个小块对应着一个索引坐标,而res则每一个小块上的匹配得分
# 读取图像
img = cv.imread(r"D:\AI\笔记课件\images\game.png")
temp = cv.imread(r"D:\AI\笔记课件\images\temp.png")
# 灰度化处理
# 这里的灰度化处理需要根据实际匹配的图像来选择是否要使用
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
temp_gray = cv.cvtColor(temp,cv.COLOR_BGR2GRAY)
# 模版匹配
res = cv.matchTemplate(img_gray,temp_gray,cv.TM_CCOEFF_NORMED)
# 设置阈值,找到符合条件的坐标
threshold = 0.8
loc = np.where(res>=threshold)
# 获取模版宽高
h,w = temp.shape[:2]
# print(res[loc[0][0],loc[1][0]])
# 解包获取坐标
for i in zip(*loc): #y在前,x在后 (y,x)left_point = i[::-1]right_point = (i[1] + w,i[0] + h)# 绘制匹配区域cv.rectangle(img,left_point,right_point,(0,255,0),2,cv.LINE_AA)
# 显示图像
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
tips:注意这里使用到了where函数,该函数是使用行优先进行遍历和返回的,因此最后的结果中y坐标在前,x坐标在后
THE END