opencv教程(基于python)----模板匹配

模板匹配日是在一幅大图中寻找莫版图位置的方法,是不是觉得很有用啊。和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))2x,yT(x,y)2x,yI(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,yT(x,y)2x,yI(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,yT(x,y)2x,yI(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竟然失败了,还是对对其中的数学原理还不是很了解,但是只有先编出来程序了,才是以后了解原理的基础。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值