模板匹配日是在一幅大图中寻找莫版图位置的方法,是不是觉得很有用啊。和2d卷积一样,它是模板图下大图上滑动,并在每一个位置对模板图象和其对应的输入图象的子区域进行比较。
这里主要介绍两个函数,cv2.matchTemplate,cv2.minMaxLoc。matchTemplate函数是关于图象匹配的,返回的结果是一个灰度图象,每一个像素值显示了此区域与模板的匹配程度,越亮说明相似程度越大。minMaxLoc函数是找到矩阵的最大值和最小值。
cv2.matchTemplate(image, templ, method, result=None, mask=None)
- 第一个参数是输入图象
- 第二个参数是目标图象
第三个参数是模式(这个是c++的写法,python很类似)
- method=CV_TM_SQDIFF ,最小值才是匹配的区域 R(x,y)=∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2
- method=CV_TM_SQDIFF_NORMED R(x,y)=∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2√
- method=CV_TM_CCORR R(x,y)=∑x′,y′(T(x′,y′)⋅I(x+x′,y+y′))
- method=CV_TM_CCORR_NORMED R(x,y)=∑x′,y′(T(x′,y′)⋅I(x+x′,y+y′))∑x′,y′T(x′,y′)2⋅∑x′,y′I(x+x′,y+y′)2√
- method=CV_TM_CCOEFF R(x,y)=∑x′,y′(T′(x′,y′)⋅I′(x+x′,y+y′))
- method=CV_TM_CCOEFF_NORMED R(x,y)=∑x′,y′(T′(x′,y′)⋅I′(x+x′,y+y′))∑x′,y′T′(x′,y′)2⋅∑x′,y′I′(x+x′,y+y′)2√
其他的忽略,返回的结果可以把最佳匹配作为全局的最小值/最大值(根据模式的不同)
cv2.minMaxLoc(src, mask=None)
- 第一个参数是输出的图像
- 输出的是最小值和最大值
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
img=cv2.imread('C:/Users/dell/Desktop/01.jpg',0)
#copy函数是防止图形在循环中被更改
img2=img.copy()
#截出来的目标图象
img_target=img[260:400,258:372]
w,h=img_target.shape[::-1]
method=['cv2.TM_CCOEFF','cv2.TM_CCOEFF_NORMED','cv2.TM_CCORR', 'cv2.TM_CCORR_MORMED','cv2.TM_SQDIFF','cv2.TM_SQDIFF_NORMED']
for meth in method:
img=img2.copy()
#eval函数可以把str转化为list、dict、tuple,具体视情况而定
method=eval(meth)
res=cv2.matchTemplate(img,img_target,method)
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
#当相面两种参数时选取最小值,否则最大值
if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]:
top_left=min_loc
else:
top_left=max_loc
#依据目标矩阵的大小构建出来的一个矩形坐标。
bottom_right=(top_left[0]+w,top_left[1]+h)
cv2.rectangle(img,top_left,bottom_right,255,2)
plt.subplot(1,2,1),plt.imshow(res)
plt.title('matching result'),plt.xticks([]),plt.yticks([])
plt.subplot(1,2,2),plt.imshow(img)
plt.title('detected point'),plt.xticks([]),plt.yticks([])
plt.title(meth)
plt.show()
目标图象是我在原始图像截了一个脸出来
上面几幅图分别展示了不同方式的作用效果。TM_CORR竟然失败了,还是对对其中的数学原理还不是很了解,但是只有先编出来程序了,才是以后了解原理的基础。。