当前位置:网站首页>opencv-matchTemplate 之使用场景为大图里面找小图

opencv-matchTemplate 之使用场景为大图里面找小图

2022-08-09 13:07:00 论一个测试的养成

opencv的图片模板匹配方法

【1】matchTemplate 用法介绍
result = cv.matchTemplate( image, templ, method[, result[, mask]] )
image:目标图
templ:模板图
method:原图与样章匹配效果的判别标准,
平方差匹配cv2.TM_SQDIFF:用两者的平方差来匹配,最好的匹配 值为0
归一化平方差匹配cv2.TM_SQDIFF_NORMED
相关匹配cv2.TM_CCORR:用两者的乘积匹配,数值越大表明匹配程度越好
归一化相关匹配cv2.TM_CCORR_NORMED
相关系数匹配cv2.TM_CCOEFF:用两者的相关系数匹配,1表示完美的匹配,-1表示最差的匹配 ,识别率不如其他方法的高 和cv2.TM_CCORR差不多
归一化相关系数匹配cv2.TM_CCOEFF_NORMED

import cv2
target = cv2.imread("test.png")
template = cv2.imread("0_0.png")
result = cv2.matchTemplate( target , template, cv2.TM_SQDIFF_NORMED)
print(result) #输出的是一组数组

【2】minMaxLoc 用法介绍
主要功能是在矩阵里面找大最大值和最小值以及他们对应的索引

import numpy as np
import cv2
a = np.array([[1,2],  [3, 4]])
x = cv2.minMaxLoc(a)
print(x)  #(1.0, 4.0, (0, 0), (1, 1)) 

【3】normalize 用法介绍
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
normalize(src, dst, alpha=None, beta=None, norm_type=None, dtype=None, mask=None)
src 输入数组;
dst 输出数组,数组的大小和原数组一致;
alpha 用来规范值或者规范范围,并且是下限;
beta 只用来规范范围并且是上限,因此只在NORM_MINMAX中起作用;
norm_type 归一化选择的数学公式类型;
dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输如不同,不同 的地方由dtype决定;
mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作
四种norm_type的区别
cv2.NORM_L1、cv2.NORM_INF、cv2.NORM_L2模式下归一化结果与beta无关,只与alpha有关,详见第4部分的公式说明;
cv2.NORM_MINMAX中alpha、beta都起作用,同时需要注意的是alpha和beta的取值顺序与归一化结果无关。即alpha=255,beta=0和alpha=0,beta=255最后的归一化结果是相同的。

import cv2
target = cv2.imread("test.png")
template = cv2.imread("0_0.png")
result = cv2.matchTemplate( target , template, cv2.TM_SQDIFF_NORMED)
print('归一化之前..........',result)
cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX, -1) #归一化
print('归一化之后..........',result)

【4】rectangle 用法介绍
图像上绘制一个简单的矩形。
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → None
img – 图片
pt1 — 矩形的顶点
pt2 — 与pt1相对的点
color -颜色

import cv2
img = cv2.imread('1.png',0) #灰色度显示图片
cv2.rectangle(img,(100,100),(300,200),(0,245,243),2) 
cv2.imshow('blue',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

实例1
— 识别率不是100%准确,后续改进中…

import cv2
import numpy as np
target = cv2.imread("test.png")
template = cv2.imread("0_0.png")
theight, twidth = template.shape[:2]
result = cv2.matchTemplate( target , template, cv2.TM_SQDIFF_NORMED,-1)
cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)    
cv2.rectangle(target, min_loc, (min_loc[0] + twidth, min_loc[1] + theight), (0, 0, 225), 2) 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值,其他的取最大值
cv2.imshow("aa", target)
cv2.waitKey()
cv2.destroyAllWindows()

实例2
看起来比1的识别率要高一些 具体原因是cv2.TM_CCOEFF_NORMED 比TM_SQDIFF_NORMED方法识别率要高些…

import cv2
self.template = cv2.imread('template,png',0)
self.width, self.height = self.template.shape[::-1]  # shape读取图片的三维通道分别是高*宽*颜色
self.target = cv2.imread('tar.png', 0)
res = cv2.matchTemplate(self.target, self.template,cv2.TM_CCOEFF_NORMED)
threshold = 0.9
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
	self.x, self.y = (pt[0] + self.width // 2, pt[1] + self.height // 2)
return self.x, self.y
原网站

版权声明
本文为[论一个测试的养成]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44517891/article/details/107013842