opencv进阶学习笔记8:模板匹配

基础版笔记传送门:
python3+opencv学习笔记汇总目录(适合基础入门学习)
进阶版笔记目录链接:
python+opencv进阶版学习笔记目录(适合有一定基础)

模板匹配原理

模板匹配(TemplateMatching)就是在一幅图像中寻找和模板图像(template)最相似的区域,该方法原理简单计算速度快,能够应用于目标识别,目标跟踪等多个领域。

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
首先需要一个模板图像T(子图像)和一个待检测的图像(源图像S)
在待检测图像从左到右,从上到下计算模板图像与重叠子图像的匹配度,匹配度越高,两者相同的可能性越大。
缺点:模板图像尺寸和待检测图像尺寸问题。模板尺寸必须小于待检测图片尺寸。

匹配度量的方法有:
CV_TM_SQDIFF 平方差匹配法,最好的匹配为0,值越大匹配越差
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR 相关匹配法,采用乘法操作,数值越大表明匹配越好
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF 相关系数匹配法,最好的匹配为1,-1表示最差的匹配
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法
前面两种方法为越小的值表示越匹配,后四种方法值越大越匹配。

OpenCV模板匹配实现

cv2.matchTemplate(image, templ, method, result=None, mask=None)

image:待搜索图像
templ:模板图像
result:匹配结果,是一个矩阵
method:计算匹配程度的方法
cv2.minMaxLoc(src, mask=None)
src是一个矩阵。输入cv2.matchTemplate的返回值

函数功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。索引即位置坐标

import cv2 as cv
import numpy as np


def template_demo():
    tpl = cv.imread("head.png")#模板
    target = cv.imread("yangmi.jpg")#待检测图
    cv.imshow("template image", tpl)
    #cv.imshow("target image", target)
    methods = [cv.TM_SQDIFF_NORMED, cv.TM_CCORR_NORMED, cv.TM_CCOEFF_NORMED]#归一化均方误差,归一化相关匹配,归一化相关系数
    th, tw = tpl.shape[:2]#取高宽,不取通道 模板高宽
    for md in methods:
        print(md)
        result = cv.matchTemplate(target, tpl, md)
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)#寻找最小值,最大值。最小值位置,最大值位置
        if md == cv.TM_SQDIFF_NORMED:
            tl = min_loc
        else:
            tl = max_loc
        br = (tl[0]+tw, tl[1]+th);
        cv.rectangle(target, tl, br, (0, 0, 255), 2)#在待检测图像上画矩形框。tl为矩形左上角,br为矩形右下角
        cv.imshow("match-"+str(md), target)
        #cv.imshow("match-" + np.str(md), result)#"match-" + np.str(md) 为窗口名


print("--------- Python OpenCV Tutorial ---------")

template_demo()
cv.waitKey(0)

cv.destroyAllWindows()

模板图像尺寸必须小于待检测图像尺寸。可以自己修改尺寸,使满足要求。
result结果样子

md=1,3,5
左上角为模板,其余三图为结果、

电气专业的计算机萌新,写博文不容易。如果你觉得本文对你有用,请点个赞再走,谢谢。

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/107341382