图像匹配
图像匹配原理
将face与lena对应的位置相匹配。
对比:计算"face"与"lena"中的差别程度,并存放于一个矩阵中,矩阵大小为(w1-w2+1 , h1-h2+1)。(计算方法见API)
API
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
返回值res:存放差别程度的矩阵。
参数1:img:"lena"图像
参数2:template:"face"图像
参数3:计算方法(如下图)
尽量采用归一化的方法,更准确
图片摘自模板匹配方法
算法详情参考长命百岁的博客
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
参数:min_val,max_val,min_loc, max_loc 分别表示最小值,最大值,以及最小值和最大值对应的图像中的位置。res即cv2.matchlemplate的返回值 。
代码
"""
图像匹配
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np
def cv_show(name,image):
cv2.imshow(name,image)
cv2.waitKey()
cv2.destroyAllWindows()
img=cv2.imread('D:/BaiduNetdiskDownload/opencv/lena.png',0)
template=cv2.imread('D:/BaiduNetdiskDownload/opencv/lena_face.png',0)
#匹配
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
cv_show('1',res)
# print(max_val,min_val)
#绘制矩形
img2=img.copy()
top_left=max_loc
h,w=template.shape[0:2]
bottom_right=(top_left[0]+w,top_left[1]+h)
cv2.rectangle(img2,top_left,bottom_right,(0,0,255),2)
cv_show('2',img2)
|
|
多个图像匹配
多个图像与单个差不多,区别在于:单个图像取得是最值,而多个图像超过某个阈值即可判定为匹配。
代码
#匹配多个对象
img_rgb=cv2.imread('D:/BaiduNetdiskDownload/opencv/mario.png')
img_gray=cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)
trick=cv2.imread('D:/BaiduNetdiskDownload/opencv/mario_trick.png',0)
h,w=trick.shape[:2]
res2=cv2.matchTemplate(img_gray,trick,cv2.TM_CCOEFF_NORMED)
cv_show('9',res2)
threshold=0.7#阈值
img_copy=img_rgb.copy()
#取匹配度大于0.9的
loc=np.where(res2>=threshold)
for pt in zip(*loc[::-1]):#*表示可选对象
bottom_right=(pt[0]+w,pt[1]+h)
cv2.rectangle(img_copy,pt,bottom_right,(0,0,255),2)
cv_show('111',img_copy)
|
|