模板在原图像上从原点开始滑动,通过计算与原图像的像素点的数据差值来作为结果输出。原图A×B,模板a×b,则输出矩阵为(A-a+1)×(B-b+1)
单对象模板匹配
cv2.imread()函数完成图像读取
cv2.imread(imgpath,flags)
- imgpath:图片路径
- flags:读入标识符,有三种类型
cv2.IMREAD_COLOR | 1 | 默认,读入一副彩色图片不包括alpha通道或写为1 |
cv2.IMREAD_GRAYSCALE | 0 | 读入灰度图片或写为0 |
cv2.IMREAD_UNCHANGED | -1 | 读入完整图片包括alpha通道或写为-1 |
flags
cv2.minMaxLoc()函数在数组中找到全局最小和最大值
minVal, maxVal,minLoc,maxLoc =minMaxLoc(src)
- minVal:最小值
- maxVal:最大值
- minVal:最小值坐标位置
- maxVal:最大值坐标位置
cv2.matchTemplate()函数完成模板匹配
cv2.matchTemplate(img,template,flags)
- img:输入图像
- template:模板图像
- flags:差别程度的六个计算方法
cv2.TM_SQDIFF | 计算平方不同,计算出来的值越小越相关 |
cv2.TM_CCORR | 计算相关性,计算出来的值越大越相关 |
cv2.TM_CCOEFF | 计算相关系数,计算的值越大越相关 |
cv2.TM_SQDIFF_NORMED | 计算平方不同并归一化,计算的值越小越相关 |
cv2.TM_CCORR_NORMED | 计算相关性并归一化,计算的值越大越相关 |
cv2.TM_CCOEFF_NORMED | 计算相关系数并归一化,计算的值越大越相关 |
cv2.TM_SQDIFF
多对象模板匹配
np.where()函数完成条件判断
np.where(condition,x,y)#第二和第三个参数可选
- 当满足condition时返回满足条件的元素坐标,以元组方式
- 当有x,y时,即满足条件返回x,不满足条件返回y
img=cv2.imread('mario.png')
img_gray=cv2.cvtcolor(img,cv2.COLOR_BGR2GRAY)
template=cv2.imread('mario_coin',0)
h,w=template.shape[:2]#img.shape[:2]获取高宽
#img.shape[:3]获取高宽通道
res=cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold= 0.8
loc =np.where(res>=threshold)
for pt in zip(*loc[::-1]):
bottom_templte=(pt[0]+w,pt[1]+h)
cv2.rectangle(img,pt,bottom_template,(0,0,255),2)
cv_show(img,'img')
cv2.waitKey(0)