今天学习模板匹配
模板图片
目标图像
import cv2import matplotlib.pyplot as plt# 模板匹配的原理:# 一个模板图像在目标图像上机芯从左到右从上到下进行滑动,每滑动一个位置就计算匹配度(均方差或者是相关系数等)# 遍历完目标图像后,求出最匹配的未知区域来。# 展示图像,封装成函数def cv_show_image(name, img): cv2.imshow(name, img) cv2.waitKey(0) # 等待时间,单位是毫秒,0代表任意键终止 cv2.destroyAllWindows()# 读取模板template = cv2.imread('images/template.jpg') # 转成灰度图print('template图像维度是:', template.shape)h, w, c = template.shapeprint(h)print(w)cv_show_image('template', template)# 读取目标图像dst_img = cv2.imread('images/saoge2.jpg') # 转成灰度图print('目标图像维度是:', dst_img.shape)cv_show_image('dst_img', dst_img)# 匹配度的度量方法methords = ['cv2.TM_SQDIFF', # 计算每个像素点的均方差,值越小越相关 'cv2.TM_CCORR', # 计算相关性,值越大越相关 'cv2.TM_CCOEFF', # 计算相关性系数,值越大越相关 'cv2.TM_SQDIFF_NORMED', # 计算每个像素点的均方差,值越小越相关,带有归一化 'cv2.TM_CCORR_NORMED', # 计算相关性,值越大越相关,带有归一化 'cv2.TM_CCOEFF_NORMED' # 计算相关性系数,值越大越相关,带有归一化 ]colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255), (255, 0, 255)]thickness = [12, 10, 8, 6, 4, 2]img_result = dst_img.copy()for i in range(len(methords)): img_tmp = dst_img.copy() # 临时展示当前的框框 methord = eval(methords[i]) # 拿到具体的模板匹配方法 print('current methord is: {}'.format(methords[i])) # 实际进行模板匹配 res = cv2.matchTemplate(dst_img, template, methord) # 传入目标图像、模板图像、匹配度量方法 print(res.shape) # 得到的是 (dst_img.H - template.H + 1, dst_img.W - template.W + 1)的维度数据 print(type(res)) #
效果如下:
‘cv2.TM_SQDIFF’, # 计算每个像素点的均方差,值越小越相关
‘cv2.TM_CCORR’, # 计算相关性,值越大越相关
‘cv2.TM_CCOEFF’, # 计算相关性系数,值越大越相关
‘cv2.TM_SQDIFF_NORMED’, # 计算每个像素点的均方差,值越小越相关,带有归一化
‘cv2.TM_CCORR_NORMED’, # 计算相关性,值越大越相关,带有归一化
‘cv2.TM_CCOEFF_NORMED’ # 计算相关性系数,值越大越相关,带有归一化
最后汇总的结果就是