OpenCV模板匹配matchTemplate的实现

yizhihongxing

我会详细讲解 “OpenCV模板匹配matchTemplate的实现”的完整攻略,下面是具体的步骤:

1. 准备工作

首先,我们需要引入OpenCV库,并导入需要的头文件。在C++代码中,我们可以使用以下代码实现引入:

#include <opencv2/opencv.hpp>
using namespace cv;

2. 读取图像

我们需要先读取需要进行模板匹配的原始图像和模板图像,并对其进行灰度转换。在读取图像的过程中,我们可以使用以下代码:

//读取原始图像和模板图像
Mat img = imread("原始图像.jpg");
Mat tpl = imread("模板图像.jpg");
//将图像转为灰度图像
Mat img_gray, tpl_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY);
cvtColor(tpl, tpl_gray, COLOR_BGR2GRAY);

3. 执行模板匹配

在将图像转为灰度图像的基础上,我们可以使用matchTemplate()函数对原始图像和模板图像进行模板匹配。其函数参数如下:

void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method, InputArray mask=noArray());

其中,参数image、templ均为输入参数,分别为原始图像和模板图像;参数result为输出参数,用于保存匹配结果;参数method是匹配算法,如下表所示:

常数名称 意义
TM_SQDIFF 平方差匹配法
TM_SQDIFF_NORMED 归一化平方差匹配法
TM_CCOEFF 相关系数匹配法
TM_CCOEFF_NORMED 归一化相关系数匹配法
TM_CCORR 相关匹配法
TM_CCORR_NORMED 归一化相关匹配法

其中,平方差匹配法(TM_SQDIFF)一般用于基准图像较小,需要在目标图像中寻找匹配区域的情况。而相关系数匹配法(TM_CCOEFF)一般用于基准图像较大,需要在目标图像中寻找相似度最高的区域的情况。

以下代码以归一化相关系数匹配法为例:

Mat match_img; //用于保存匹配结果
matchTemplate(img_gray, tpl_gray, match_img, TM_CCOEFF_NORMED);

4. 获取匹配结果

matchTemplate()函数将匹配结果保存在match_img中,接下来我们需要在match_img中寻找到相似度最高的区域。可以使用以下代码:

double min_val, max_val; //用于保存匹配值的最小值和最大值
Point min_loc, max_loc; //用于保存匹配值的最小位置和最大位置
minMaxLoc(match_img, &min_val, &max_val, &min_loc, &max_loc); //求得最大匹配值的位置

5. 显示结果

最后,将匹配结果显示出来。可以使用以下代码:

//在原始图像中,标出匹配的区域
rectangle(img, max_loc, Point(max_loc.x + tpl.cols, max_loc.y + tpl.rows), Scalar(0,0,255), 2, 8, 0);
//显示匹配结果
imshow("Match result", img);
waitKey(0);

至此,我们就完成了OpenCV模板匹配matchTemplate的实现过程。以下是两个可供参考的示例:

示例1:基于平方差匹配的模板匹配

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    //读取原始图像和模板图像
    Mat img = imread("original.jpg");
    Mat tpl = imread("template.jpg");
    //将图像转为灰度图像
    Mat img_gray, tpl_gray;
    cvtColor(img, img_gray, COLOR_BGR2GRAY);
    cvtColor(tpl, tpl_gray, COLOR_BGR2GRAY);

    //执行模板匹配
    Mat match_img;
    matchTemplate(img_gray, tpl_gray, match_img, TM_SQDIFF);

    //获取匹配结果
    double min_val, max_val;
    Point min_loc, max_loc;
    minMaxLoc(match_img, &min_val, &max_val, &min_loc, &max_loc);

    //在原始图像中,标出匹配的区域
    rectangle(img, min_loc, Point(min_loc.x + tpl.cols, min_loc.y + tpl.rows), Scalar(0,0,255), 2, 8, 0);

    //显示匹配结果
    imshow("Match result", img);
    waitKey(0);
    return 0;
}

示例2:基于相关系数匹配的模板匹配

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
    //读取原始图像和模板图像
    Mat img = imread("original.jpg");
    Mat tpl = imread("template.jpg");
    //将图像转为灰度图像
    Mat img_gray, tpl_gray;
    cvtColor(img, img_gray, COLOR_BGR2GRAY);
    cvtColor(tpl, tpl_gray, COLOR_BGR2GRAY);

    //执行模板匹配
    Mat match_img;
    matchTemplate(img_gray, tpl_gray, match_img, TM_CCOEFF_NORMED);

    //获取匹配结果
    double min_val, max_val;
    Point min_loc, max_loc;
    minMaxLoc(match_img, &min_val, &max_val, &min_loc, &max_loc);

    //在原始图像中,标出匹配的区域
    rectangle(img, max_loc, Point(max_loc.x + tpl.cols, max_loc.y + tpl.rows), Scalar(0,0,255), 2, 8, 0);

    //显示匹配结果
    imshow("Match result", img);
    waitKey(0);
    return 0;
}

希望以上讲解能够对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenCV模板匹配matchTemplate的实现 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • OpenCV计算轮廓长度/周长和面积

    首先,计算轮廓长度/周长和面积需要使用到OpenCV库中的cv2.contourArea()和cv2.arcLength()函数。在计算前需要先检测出轮廓。 以下是计算轮廓长度/周长和面积的详细攻略: 1. 导入库 import cv2 import numpy as np 2. 读取并预处理图像 image = cv2.imread(‘test.jpg’)…

    人工智能概论 2023年5月25日
    00
  • Tensorflow之梯度裁剪的实现示例

    下面是“Tensorflow之梯度裁剪的实现示例”的完整攻略。 什么是梯度裁剪? 梯度裁剪是一种常见的优化技巧,用于限制梯度的范围,避免梯度爆炸或消失。在深度学习中,梯度裁剪常用于RNN等网络中,比如LSTM、GRU等。 梯度裁剪的实现方法 Tensorflow提供了两种梯度裁剪的实现方式: 1. tf.clip_by_norm tf.clip_by_nor…

    人工智能概论 2023年5月25日
    00
  • ubuntu下安装Python多版本的方法及注意事项

    下面我会详细讲解“ubuntu下安装Python多版本的方法及注意事项”的完整攻略。在Ubuntu系统中,我们可以通过以下步骤来安装Python多版本。 安装pyenv pyenv是一个Python版本管理工具,它可以方便地管理多个Python版本,我们可以通过以下命令来安装pyenv。 $ git clone https://github.com/yyuu…

    人工智能概览 2023年5月25日
    00
  • 易语言设置组合框高度方法

    下面是“易语言设置组合框高度方法”的完整攻略: 介绍 在易语言中,组合框(ComboBox)是常用的GUI控件之一,用于显示一组下拉选项。默认情况下,组合框的高度是自适应的,但有时需要手动调整组合框的高度,以使其显示更多的选项或适应具体的UI设计。 方法 要设置组合框的高度,可以使用API函数SendMessage,该函数位于user32.dll库中。具体调…

    人工智能概论 2023年5月25日
    00
  • 谷歌技术人员解决Docker镜像体积太大问题的方法

    谷歌技术人员解决Docker镜像体积太大问题的方法 问题背景 Docker镜像体积太大一直是Docker社区面临的一个问题。一方面,巨大的体积会占用更多的磁盘空间和网络带宽;另一方面,Docker镜像的构建和推送也会变得更加缓慢。谷歌技术人员提出了一种解决方案解决Docker镜像体积过大的问题。 解决方案 1. 使用gomplate构建Dockerfile …

    人工智能概览 2023年5月25日
    00
  • Python中整数的缓存机制讲解

    Python中整数的缓存机制讲解 在Python中,整数有一个缓存机制,即-5到256之间的整数会被缓存,而其他的整数则不会被缓存。在使用整数时,如果两个整数的值相同,则它们实际上可能会指向同一个对象,而不是两个不同的对象。 整数缓存机制的实现原理 Python中整数的缓存机制通过小整数对象池实现,也就是说,Python会在解释器启动时创建一系列小整数对象(…

    人工智能概览 2023年5月25日
    00
  • visual studio 2012安装配置方法图文教程 附opencv配置教程

    Visual Studio 2012安装配置方法图文教程 安装Visual Studio 2012 首先,需要下载Visual Studio 2012安装程序。在微软官网上下载即可,也可到其他网站下载,但需保证来源可靠。 下载完毕后,双击安装程序文件,开始安装。安装过程中,需要选择相应的组件进行安装。建议安装的组件有: Visual C++核心功能 Visu…

    人工智能概览 2023年5月25日
    00
  • window10下pytorch和torchvision CPU版本安装教程

    下面是关于在Windows 10上安装PyTorch和torchvision的完整攻略。 环境准备 在开始安装过程之前,我们需要确保本地环境已经安装了Anaconda。这里以安装Anaconda最新版为例。 创建虚拟环境 首先,我们需要在Anaconda中创建一个新的虚拟环境来安装PyTorch和torchvision。在Anaconda Prompt命令行…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部