OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍

您所在的位置:网站首页 opencv归一化图像 OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍

OpenCV笔记:模板匹配 cv2.matchTemplate()、cv2.minMaxLoc() 与 绘制矩形 cv2.rectangle() 方法介绍

2023-12-31 15:31| 来源: 网络整理| 查看: 265

导读

        模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。绘制矩形是用来将模版图像的匹配结果展示出来的方法。

        模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化、边缘检测等操作来生成二值化图像。但是:如果输入图像中存在变化的因素,包括旋转、缩放、视角变化等,模板匹配很容易就会失效。除非:旋转、缩放、视角变化恒定的情况下,模板匹配也可以完美发挥作用。

        如果你的输入图像中包含这些类型的变化因素,那么你不应使用模板匹配,而应该使用专用的对象检测器,包括:HOG + 线性 SVM,Faster R-CNN,SSD,YOLO 等。

        你可能需要的文章:

关于:Python基础,爬虫,常见异常和面试【篇】(专题汇总) 正文

        OpenCV 为我们提供了函数: cv2.matchTemplate() 用于实现模板匹配,并使用 cv2.minMaxLoc() 计算匹配结果,最后通过 cv2.rectangle() 绘制矩形展示匹配结果。

一、方法介绍 1. cv2.matchTemplate()

1.1 作用

        模板匹配是在一幅图像中寻找一个特定目标的方法,这种方法的原理非常简单:依次遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标。

1.2 使用方法

res = cv2.matchTemplate(image, templ, method, result=None, mask=None) image:输入一个待匹配的图像,支持8U或者32F;templ:输入一个模板图像,需与image相同类型;method:要使用的数据匹配算法。result:输出保存结果的矩阵,32F类型;

1.3 匹配算法

        OpenCV提供了6种模板匹配算法。

method名称含义TM_SQDIFF平方差匹配

计算模板与目标图像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高。

TM_CCORR 相关匹配该方法采用乘法操作;数值越大表名匹配程度越好。TM_CCOEFF 相关系数匹配计算相关系数,1表示完美匹配;-1表示最差匹配。TM_SQDIFF_NORMED 归一化平方差匹配计算归一化平方差,计算出来的值越接近0,越相关。TM_CCORR_NORMED 归一化相关匹配计算归一化相关性,计算出来的值越接近1,越相关。TM_CCOEFF_NORMED 归一化相关系数匹配计算归一化相关系数,计算出来的值越接近1,越相关。

         下面是匹配算法的公式,额,别问我这些公式什么意思,我也不懂,官网上扒下来的,看看就好。

2. cv2.minMaxLoc()

2.1 作用

        根据 cv2.matchTemplate() 的匹配结果,返回图形坐标结果。

2.2 使用方法

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret) ret:是 cv2.matchTemplate() 返回的矩阵;min_val:最小值;max_val:最大值;min_loc:最小值对应的图像中的位置;max_loc:最大值对应的图像中的位置; 3. cv2.rectangle()

3.1 作用

        绘制矩形:在图片 img 上画长方形,坐标原点是图片左上角,向右为x轴正方向,向下为y轴正方向。

3.2 使用方法

cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift ) img:底图;pt1:矩形的左上角坐标;pt2:矩形的右下角坐标;color:线条的颜色,BGR;thickness:线的粗细,数值越大线越粗; 二、实战操作 1. 图片准备

        待匹配图片 image(博客首页的图),模板图片 templ 如下:

2. 代码展示 # _*_coding:utf-8_*_ # 作者:Java Punk # 时间:2022-10-09 14:49:45 # 功能:方法学习:cv2.matchTemplate(), cv2.minMaxLoc(), cv2.rectangle() import cv2 as cv2 import numpy as np from matplotlib import pyplot as plt # 单个模板匹配 def one_match(image, templ): # 1.读取图片 img = cv2.imread(image) template = cv2.imread(templ) h, w = template.shape[:2] # 2.匹配模板 res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 3.计算矩形左边 top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) # 4.画矩形 cv2.rectangle(img, top_left, bottom_right, (255, 0, 0), 5) # 5.展示结果 cv2.imshow('img_rgb', img) cv2.waitKey(0) pass if __name__ == '__main__': print("———————————————————— start ————————————————————\n") # 图片路径自己设置,下面是我本地的路径,记得替换!!! one_match('../img/test/guimie_01.jpg', '../img/test/guimie_02.jpg') print("———————————————————— end ————————————————————\n") 3. 结果展示

        完美匹配到了,下面的蓝色方框可不是我画的,是程序画的哈。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3