OpenCV进阶篇---模板匹配

模板匹配:
cv.matchTemplate(src,template,method)
模板匹配和卷积原理很像,模板在图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别度,这个差别程度的计算方法在OpenCV中有6中,然后将每次计算的结果放图一个矩阵里,作为输出结果。加入原图是AB大小,而模板的大小是ab大小,则输出的结果矩阵是(A-a+1)*(B-b+1)
模板匹配的方法:不同的匹配方式匹配的结果会有所差异
OpenCV进阶篇---模板匹配_第1张图片
TM_SQDIFF :计算平方不同,计算出来的值越小,越相关
TM_SQDIFF_NORMED :计算归一化平方不同,计算出来的值越接近0,越相关
TM_CCORR :计算相关性,计算出来的值越大,越相关
TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
TM_CCOEFF :计算相关系数,计算出来的值越大,越相关
TM_CCOEFF_NORMED : 计算归一化相关系数,计算出来的值越接近1,越相关

模板:
在这里插入图片描述
待检测图:
OpenCV进阶篇---模板匹配_第2张图片
匹配结果:
OpenCV进阶篇---模板匹配_第3张图片
完整代码:

import cv2 as cv
import matplotlib as plt
import numpy as np
#模板匹配
template=cv.imread("E:\OpenCVTests/teaching\smallLena.png")
target=cv.imread("E:\OpenCVTests\Samples\sample\lena.jpg")
template1=cv.cvtColor(template,cv.COLOR_BGR2GRAY)#都是基于灰度图像的
target1=cv.cvtColor(target,cv.COLOR_BGR2GRAY)
methods=[cv.TM_SQDIFF_NORMED,cv.TM_CCORR_NORMED,cv.TM_CCOEFF_NORMED]#模板匹配的匹配方式
th,tw=template1.shape
for md in methods:
    print(md)#枚举类型的值
    result=cv.matchTemplate(target1,template1,md)#滑动过程中会一次检测出多个矩形窗口,每个算法算出结果的值,每个像素点根据算法都有算出来的对应的值
    minVal,maxVal,minLoc,maxLoc=cv.minMaxLoc(result)#计算出result的最大、最小值,即可得到哪个像素区域是最佳匹配区域,即可得出匹配得到的位置
    if md==cv.TM_SQDIFF_NORMED:#如果匹配方法是‘平方不同’,则应该取最小值,这与‘平方不同’算法得出的结果相关,越相关,result结果越暗,反之。
         tl=minLoc#最左上角的点
    else:
        tl=maxLoc
    br=(tl[0]+tw,tl[1]+th)#bottom right====最右下角的点,在tl的基础上加上长宽即可得,tl[0]、tl[1]表示从最左上角点出发的两个方向
    cv.rectangle(target,tl,br,(0,0,255),2)#绘制矩形,绘制到原图上;tl、br表示长宽,第三个参数为颜色,第四个参数为线的宽度
    #cv.imshow("match"+np.str(md),target)#将md变为str类型
    cv.imshow("match" + np.str(md), target)#将结果图进行显示
cv.waitKey(0)
cv.destroyAllWindows()

你可能感兴趣的:(OpenCV)