Python-OpenCV模板匹配

百度百科:模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。它是图像处理中最基本、最常用的匹配方法。模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。

简单来说,模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

工作原理:在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。

下面是利用python语言结合OpenCV的模板匹配代码:

# -*- coding:utf-8 -*-
__author__ = 'Microcosm'

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread("lena.jpg",0)
img2 = img.copy()
template = cv2.imread("eye.png",0)
w,h = template.shape[::-1]

# 6 中匹配效果对比算法
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']

for meth in methods:
    img = img2.copy()

    method = eval(meth)

    res = cv2.matchTemplate(img,template,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)

    print meth
    plt.subplot(221), plt.imshow(img2,cmap= "gray")
    plt.title('Original Image'), plt.xticks([]),plt.yticks([])
    plt.subplot(222), plt.imshow(template,cmap= "gray")
    plt.title('template Image'),plt.xticks([]),plt.yticks([])
    plt.subplot(223), plt.imshow(res,cmap= "gray")
    plt.title('Matching Result'), plt.xticks([]),plt.yticks([])
    plt.subplot(224), plt.imshow(img,cmap= "gray")
    plt.title('Detected Point'),plt.xticks([]),plt.yticks([])
    plt.show()

各种对比方法的结果图如下所示:
1 cv2.TM_CCOEFF

这里写图片描述

2 cv2.TM_CCOEFF_NORMED

这里写图片描述

3 cv2.TM_CCORR

这里写图片描述

4 cv2.TM_CCORR_NORMED

这里写图片描述

5 cv2.TM_SQDIFF

这里写图片描述

6 cv2.TM_SQDIFF_NORMED

这里写图片描述

几种常见的模板匹配算法:

这里写图片描述

CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED 归一化平方差匹配法
CV_TM_CCORR_NORMED 归一化相关匹配法
CV_TM_CCOEFF_NORMED 归一化相关系数匹配法

模板匹配原理应该如下图:

这里写图片描述

matchTemplate

opencv的目标匹配函数为matchTemplate;
函数原型为:matchTemplate(image, templ, method[, result[, mask]]) -> result

image参数表示待搜索源图像,必须是8位整数或32位浮点。

templ参数表示模板图像,必须不大于源图像并具有相同的数据类型。

method参数表示计算匹配程度的方法。

result参数表示匹配结果图像,必须是单通道32位浮点。如果image的尺寸为W x Htempl的尺寸为w x h,则result的尺寸为(W-w+1)x(H-h+1)

minMaxLoc

opencv的函数minMaxLoc:在给定的矩阵中寻找最大和最小值,并给出它们的位置。 该功能不适用于多通道阵列。 如果您需要在所有通道中查找最小或最大元素,要先将阵列重新解释为单通道。
函数minMaxLoc原型为:minMaxLoc(src[, mask]) -> minVal, maxVal, minLoc, maxLoc

src参数表示输入单通道图像。

mask参数表示用于选择子数组的可选掩码。

minVal参数表示返回的最小值,如果不需要,则使用NULL。

maxVal参数表示返回的最大值,如果不需要,则使用NULL。

minLoc参数表示返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。

maxLoc参数表示返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL

rectangle

opencv的函数rectangle用于绘制矩形;
函数原型为: rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img

img参数表示源图像。

pt1参数表示矩形的一个顶点。

pt2参数表示与pt1相对的对角线上的另一个顶点 。

color参数表示矩形线条颜色 (RGB) 或亮度(灰度图像 )。

thickness参数表示组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。

lineType参数表示线条的类型。

shift参数表示坐标点的小数点位数。

参考文献:
1、https://blog.csdn.net/FireMicrocosm/article/details/48374979 2018.7.13
2、https://blog.csdn.net/gangzhucoll/article/details/78747256 2018.7.13
3、https://www.cnblogs.com/FHC1994/p/9123393.html 2018.7.13
4、https://blog.csdn.net/liuqz2009/article/details/60869427 2018.7.13
5、http://www.cnblogs.com/xiangwengao/archive/2012/03/27/2419831.html 2018.7.13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值