【待解决】【OpenCV图像处理】1.27 模板匹配(Template Match)

2023-11-08

1. 相关理论

直观介绍:
在这里插入图片描述

  • 介绍

    • 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
    • 所以模板匹配首先需要一个模板图像T(给定的子图像)
    • 另外需要一个待检测的图像-源图像S
    • 工作方法,在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
  • 模板匹配介绍 - 匹配算法介绍
    OpenCV中提供了六种常见的匹配算法如下:

    • 计算平方不同: R ( x , y ) = ∑ z ′ , y ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 R(x, y)=\sum_{z^{\prime}, y}\left(T\left(x^{\prime}, y^{\prime}\right)-I\left(x+x^{\prime}, y+y^{\prime}\right)\right)^{2} R(x,y)=z,y(T(x,y)I(x+x,y+y))2
    • 计算相关性: R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) R(x, y)=\sum_{x^{\prime}, y^{\prime}}\left(T\left(x^{\prime}, y^{\prime}\right) \cdot I\left(x+x^{\prime}, y+y^{\prime}\right)\right) R(x,y)=x,y(T(x,y)I(x+x,y+y))
    • 计算相关系数:
      R ( x , y ) = ∑ x ′ , y ′ ( T ′ ( x ′ , y ′ ) ⋅ I ′ ( x + x ′ , y + y ′ ) ) T ′ ( x ′ , y ′ ) = T ( x ′ , y ′ ) − 1 / ( w ⋅ h ) ⋅ ∑ x ′ ′ , y ′ ′ T ( x ′ ′ , y ′ ′ ) I ′ ( x + x ′ , y + y ′ ) = I ( x + x ′ , y + y ′ ) − 1 / ( w ⋅ h ) ⋅ ∑ x ′ ′ , y ′ ′ I ( x + x ′ ′ , y + y ′ ′ ) \begin{array}{c}{R(x, y)=\sum_{x^{\prime}, y^{\prime}}\left(T^{\prime}\left(x^{\prime}, y^{\prime}\right) \cdot I^{\prime}\left(x+x^{\prime}, y+y^{\prime}\right)\right)} \\ {T^{\prime}\left(x^{\prime}, y^{\prime}\right)=T\left(x^{\prime}, y^{\prime}\right)-1 /(w \cdot h) \cdot \sum_{x^{\prime \prime}, y^{\prime \prime}} T\left(x^{\prime \prime}, y^{\prime \prime}\right)} \\ {I^{\prime}\left(x+x^{\prime}, y+y^{\prime}\right)=I\left(x+x^{\prime}, y+y^{\prime}\right)-1 /(w \cdot h) \cdot \sum_{x^{\prime \prime}, y^{\prime \prime}} I\left(x+x^{\prime \prime}, y+y^{\prime \prime}\right)}\end{array} R(x,y)=x,y(T(x,y)I(x+x,y+y))T(x,y)=T(x,y)1/(wh)x,yT(x,y)I(x+x,y+y)=I(x+x,y+y)1/(wh)x,yI(x+x,y+y)
    • 计算归一化平方不同:
      R ( x , y ) = ∑ z ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 ∑ z ′ , y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ z ′ , y ′ I ( x + x ′ , y + y ′ ) 2 R(x, y)=\frac{\sum_{z^{\prime}, y^{\prime}}\left(T\left(x^{\prime}, y^{\prime}\right)-I\left(x+x^{\prime}, y+y^{\prime}\right)\right)^{2}}{\sqrt{\sum_{z^{\prime}, y^{\prime}} T\left(x^{\prime}, y^{\prime}\right)^{2} \cdot \sum_{z^{\prime}, y^{\prime}} I\left(x+x^{\prime}, y+y^{\prime}\right)^{2}}} R(x,y)=z,yT(x,y)2z,yI(x+x,y+y)2 z,y(T(x,y)I(x+x,y+y))2
    • 计算归一化相关性
      R ( x , y ) = ∑ z ′ , y ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) ∑ z ′ y ′ T ( x ′ , y ′ ) 2 ⋅ ∑ z ′ y ′ I ( x + x ′ , y + y ′ ) 2 R(x, y)=\frac{\sum_{z^{\prime}, y}\left(T\left(x^{\prime}, y^{\prime}\right) \cdot I\left(x+x^{\prime}, y+y^{\prime}\right)\right)}{\sqrt{\sum_{z^{\prime} y^{\prime}} T\left(x^{\prime}, y^{\prime}\right)^{2} \cdot \sum_{z^{\prime} y^{\prime}} I\left(x+x^{\prime}, y+y^{\prime}\right)^{2}}} R(x,y)=zyT(x,y)2zyI(x+x,y+y)2 z,y(T(x,y)I(x+x,y+y))
    • 计算归一化相关系数:
      R ( x , y ) = ∑ x ′ , y ′ ( T ′ ( x ′ , y ′ ) ⋅ I ′ ( x + x ′ , y + y ′ ) ) ∑ x ′ , y ′ T ′ ( x ′ , y ′ ) 2 ⋅ ∑ z ′ , y ′ I ′ ( x + x ′ , y + y ′ ) 2 R(x, y)=\frac{\sum_{x^{\prime}, y^{\prime}}\left(T^{\prime}\left(x^{\prime}, y^{\prime}\right) \cdot I^{\prime}\left(x+x^{\prime}, y+y^{\prime}\right)\right)}{\sqrt{\sum_{x^{\prime}, y^{\prime}} T^{\prime}\left(x^{\prime}, y^{\prime}\right)^{2} \cdot \sum_{z^{\prime}, y^{\prime}} I^{\prime}\left(x+x^{\prime}, y+y^{\prime}\right)^{2}}} R(x,y)=x,yT(x,y)2z,yI(x+x,y+y)2 x,y(T(x,y)I(x+x,y+y))
  • 相关API介绍cv::matchTemplate

    matchTemplate(
    
    InputArray image,// 源图像,必须是8-bit或者32-bit浮点数图像
    
    InputArray templ,// 模板图像,类型与输入图像一致
    
    OutputArray result,// 输出结果,必须是单通道32位浮点数,假设源图像WxH,模板图像wxh,则结果必须为W-w+1, H-h+1的大小。
    int method,//使用的匹配方法
    
    InputArray mask=noArray()//(optional)
    )
    

2. 源码 & 效果展示

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>

using namespace std;
using namespace cv;

#ifndef P27
#define P27 27
#endif

#if P27 //模板匹配
    Mat src, temp, dst;
    int match_method = TM_SQDIFF;
    int max_track = 5;
    const char* INPUT_T = "input image";
    const char* OUTPUT_T = "result image";
    const char* match_t = "template match-demo";

    void Match_Demo(int, void*) {
        int width = src.cols - temp.cols + 1;
        int height = src.rows - temp.rows + 1;
        Mat result(width, height, CV_32FC1);

        matchTemplate(src, temp, result, match_method, Mat());
        normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());

        Point minLoc;
        Point maxLoc;
        double min, max;
        src.copyTo(dst);
        Point temLoc;
        minMaxLoc(result, &min, &max, &minLoc, &maxLoc, Mat());
        if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED) {
            temLoc = minLoc;
        } else {
            temLoc = maxLoc;
        }

        rectangle(dst, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, 8);
        rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2, 8);

        imshow(OUTPUT_T, result);
        imshow(match_t, dst);
    }
#endif

int main() {
    std::string path = "../color_line.JPG";
    cv::Mat img = cv::imread(path, 5);
    if(img.empty())
    {
        std::cout << "open file failed" << std::endl;
        return -1;
    }
    
#if P27 //模板匹配
    src = imread("../fei.JPG");
	temp = imread("../color_line.JPG");
	if (src.empty() || temp.empty()) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow(INPUT_T, WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_T, WINDOW_AUTOSIZE);
	namedWindow(match_t, WINDOW_AUTOSIZE);
	imshow(INPUT_T, temp);
	const char* trackbar_title = "Match Algo Type:";
	createTrackbar(trackbar_title, OUTPUT_T, &match_method, max_track, Match_Demo);
	Match_Demo(0, 0);

#endif

    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

运行效果:
编译、链接成功,但运行上述代码失败,提示:

libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(4.0.1) 
/tmp/opencv-20190105-31032-o160to/opencv-4.0.1/modules/core/src/matrix.cpp:
235: error: (-215:Assertion failed) s >= 0 in function 'setSize'

Process finished with exit code 6

有待解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【待解决】【OpenCV图像处理】1.27 模板匹配(Template Match) 的相关文章

  • linux svn 修改回退,玩转SVN-版本回退

    当我们想放弃对文件的修改 可以使用 SVN revert 命令 svn revert 操作将撤销任何文件或目录里的局部更改 我们对文件 readme 进行修改 查看文件状态 root runoob svn runoob01 trunk sv
  • Python之模块打包

    1 什么是模块打包 模块打包目的是让自己开发的功能能够实现共享 供给他人使用 包管理索引平台 Python Package Index 2 怎么打包 tar gz格式 这个就是标准压缩格式 里面包含了项目元数据和代码 可以使用Python
  • 2021.06.15

    括号生成 力扣 方法 回溯 回溯算法框架 result def backtrack 路径 选择列表 if 满足结束条件 result add 路径 return for 选择 in 选择列表 做选择 backtrack 路径 选择列表 撤销
  • DeBruijin 【HDU - 2894】【欧拉回路】

    题目链接 可以说这题是着实有趣了 题意 我们给出一个K 现在我们想最多的表示从 的数 也就是00 0 11 1 0 1都是K个 譬如说K 3 我们可以用字典序最小的 00010111 按顺序的用二进制表示 000 001 010 101 0
  • github Page博客速度优化+Cloudflare_https两端配置+解决重定向次数过多问题

    网站加速调优 自从加了CDN之后我的博客偶尔会报错 重定向次数过多 症状 XXX XXX XXX 将您重定向的次数过多 尝试清除 Cookie ERR TOO MANY REDIRECTS 可能原因 参考阿里云cdn解决方案https he
  • Spark机器学习实例

    2020 07 09 引言 Learning Spark 过程中只是简单介绍了mllib中的东西 没有一个完整的实践过程 暂时还没有去找有没有专门做这种的书 好像我看 spark in action 是有这部分内容 后续在看 本篇文章就利用
  • BERT:深度双向预训练语言模型

    论文标题 BERT Pre training of Deep Bidirectional Transformers for Language Understanding 论文链接 https arxiv org abs 1810 04805
  • AJAX发送对象参数及Spring 4.3----@GetMapping, @PostMapping, @PutMapping, @DeleteMapping)

    前言 Spring4 3中引进了 RestController GetMapping PostMapping PutMapping DeleteMapping PatchMapping 来帮助简化常用的HTTP方法的映射 并更好地表达被注解
  • CSS flex属性

    flex弹性盒模型 让所有弹性盒模型对象的子元素都有相同的长度 且忽略它们内部的内容 可以做到水平布局 div div div div
  • 随机改变背景颜色

    开发工具与关键技术 VS 2019 JS 作者 唐嘉怡 撰写时间 2022 5 8 注意 要按照步骤一步一步执行下去 设置一个div盒子 给这个盒子一个id名为box 并给这个盒子设置样式 再设置一个随机改变背景颜色的按钮 给他一个id名为
  • 解决element 弹窗屏幕变灰的问题(双层弹窗)(遮罩层问题)

    问题 新增按钮弹窗 新增按钮里需要选择部门 又一个弹窗 此时点第二个弹窗的时候页面会灰 解决 在最后一个弹窗上面加属性 append to body true 就能解决 element 已经说明了问题 嵌套Dialog必须指定该标签 这个属
  • 精讲Flutter官网的第一个例子

    原文链接 前言 学习Flutter你一定会看到官网的第一个例子 中文版 或 英文版 但是作为新手 或许你看的会很费劲 这篇文章的目的是帮助你更好的理解这个例子 最终的效果图 我们先分析一下如何实现上图中的效果 Android开发者 1 准备
  • 【Spring Boot】——集成lombok

    还在编写无聊枯燥又难以维护的POJO吗 洁癖者的春天在哪里 请看Lombok 在过往的Java项目中 充斥着太多不友好的代码 POJO的getter setter toString 异常处理 I O流的关闭操作等等 这些样板代码既没有技术含
  • 用c语言实现扫雷小游戏。

    相信小伙伴在学习c语言的时候想做一些小趣事 下面就是用c语言来实现一个扫雷小游戏 不过是简单的实现扫雷 只是通过数组的方式来实现 适合新手学习 我用的是vs敲的这个代码 大家可以用vs运行 可能有些小地方不支持其他编译器 不过自己可以修改
  • 如何整理计算机本地磁盘文件夹,怎么清理c盘无用文件,10招教你如何清除C盘除系统外的所有垃圾...

    C盘简介 C盘是电脑硬盘的主分区之一 一般用于储存或安装系统使用 C盘对于本地硬盘的单操作系统来说 是很重要的 所以平时存放文件尽量不要放在C盘 但是在使用的过程中难免会不注意从而导致C盘空间不足 下面小棠为大家提供了清理C盘的十种方法 P
  • 中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第二周 类和类的对象基础 笔记 之 复制构造函数

    第二周 类和类的对象基础 1 类和对象的基本概念 2 2 构造函数 3 复制构造函数 4 类型转换构造函数和析构函数 5 构造函数析构函数调用时机 3 复制构造函数 用一个同类的已存在对象 复制它 来初始化一个新的对象 只有一个参数 即对同

随机推荐

  • 编写一个程序,输入一组字符串,将字符串中的小写字母转换为大写字母(其它字符不变)并输出。

    include
  • chatgpt赋能python:Python提取数字:一种简单而强大的方法

    Python提取数字 一种简单而强大的方法 Python是一种功能强大且简单易用的编程语言 它具有许多有用的特性和工具 其中一些可以帮助你完成各种任务 在这个SEO文章中 我们将介绍如何使用Python提取数字 为了使关键信息更加突出 重要
  • redis 作为缓存总结

    redis缓存服务器笔记 redis是一个高性能的key value存储系统 能够作为缓存框架和队列 但是由于他是一个内存内存系统 这些数据还是要存储到数据库中的 作为缓存框架 create updae delete 同时存到redis和数
  • CentOS 安装nginx最简单办法

    我看了很多都挺复杂 然后查了下管网就有安装步骤 参考这个链接 http nginx org en linux packages html RHEL CentOS 第一步 sudo yum install yum utils 如果yum命令遇
  • 【Python人工智能】Python全栈体系(十六)

    人工智能 第四章 分类模型 一 分类业务模型 分类预测模型与回归不同 回归模型是根据已知的输入和输出寻找一个性能最佳的模型 从而通过未知输出的样本得到连续的输出 而分类模型则是需要得到离散的输出 即根据已知样本的所属类别预测未知输出的样本所
  • 解决RedisTemplate 使用 setIfAbsent 做分布式锁出现返回值为 null 的问题

    我们现在较少使用RedisTemplate 提供的setIfAbsent 做分布式锁 解决并发场景问题 一般使用成熟的三方工具Redisssion来解决分布式锁问题 但是有时候还是需要手动通过RedisTemplate 提供的setIfAb
  • 线圈自感的计算公式

    线圈自感等于总的磁通量除以电流 磁路的磁阻R为 l是磁通的总长度 mu 电路材料的相对磁导率 0 mu 0 0 自由空间的磁导率 4
  • Qt中三个窗口基类(QMainWindow , QWidget , QDialoh)的区别

    在平常qt开发中 通常要写自己的窗口类 那么这个窗口类该继承自哪个类呢 下面就来看下三个窗口基类的区别 1 QMainWindow QMainWindow类提供一个带有菜单条 工具条和一个状态条的主应用程序窗口 主窗口通常提供一个大的中央窗
  • 聚类与分类的定义

    1 聚类的概念 有一堆数据 讲这堆数据分成几类称为聚类 举个例子 比如有一堆水果 我们按着不同的特征分为 苹果 橘子 香蕉三类叫做分类 2 分类的概念 在聚类的前提下 拿来一个新水果 我们按着他的特征 把他分到橘子或者香蕉那类中 叫做分类
  • Spring Data JPA 定义实体类关系:一对一

    JPA使用 OneToOne来标注一对一的关系 实体 Dept 部门 实体 User 用户 Dept和 User 是一对一的关系 这里使用关联字段描述JPA的一对一关系 通过关联字段的方式 一个实体通过关联字段关联到另一个实体的主键 通过关
  • SAP事务码MM17物料主数据批量维护

    这个事务码真的很有意思 因为可以看到物料主数据不同层次的内容 为什么这么说呢 进入MM17
  • mysql 修改数据库字段长度限制_修改数据库字段长度问题,非常紧急!大家来帮忙...

    你的位置 问答吧 gt JAVA gt 问题详情 修改数据库字段长度问题 非常紧急 大家来帮忙 我有一个表里有个主键id char 3 第一个问题 能不能把char 3 改为varchar2 10 alter table sys compa
  • Hadoop安装过程与问题解决

    Hadoop安装过程与问题解决 安装环境 CentOS JDK1 8 如何查看系统版本号 如下图 cat etc redhat release 下载Hadoop 包 可以通过在windows下下载 然后通过linux的客户端工具进行上传 这
  • AI测试中的数据收集

    人工智能 通俗来说就是让机器最大程度的接近于人 如人与人之间沟通 识别图像 奔跑 越障等 例如之前被刷屏的波士顿动力机器人 猎豹移动在世界机器人大会展出的研磨咖啡机器人 图像识别是目前人工智能应用的一大类型 不断地收集 调整 完善测试数据来
  • 【深度长文】人脸识别:人脑认知与计算机算法(五部曲)

    来源 本文经作者 Owl of Minerva 授权转载 链接 https zhuanlan zhihu com HicRhodushicsalta 1 初期预测和介绍 现阶段 人脸识别是人工智能领域最炙手可热的话题之一 Google和Fa
  • 用Python画圣诞树

    拿去给自己所思所念之人 import turtle as t as就是取个别名 后续调用的t都是turtle from turtle import import random as r import time n 100 0 speed f
  • uniapp微信小程序使用axios(vue3+axios+ts版)

    版本号 vue 3 2 45 axios 1 4 0 axios miniprogram adapter 0 3 5 安装axios及axios适配器 适配小程序 yarn add axios axios miniprogram adapt
  • CentOS安装docker

    Docker这两年大受追捧 风光无二 Docker是一个轻量级容器技术 类似于虚拟机技术 xen kvm VMware virtualbox Docker是直接运行在当前操作系统 Linux 之上 而不是运行在虚拟机中 但是也实现了虚拟机技
  • vmware workstation pro 14 虚拟机无法开启、黑屏的解决方案汇总

    方案1 卸载鲁大师 重启 方案2 管理员命令行 输入netsh winsock reset 重启 方案3 360安全管家修复LSP 重启 方案4 卸载14 0 安装12 0 手动导入虚拟机 转载于 https www cnblogs com
  • 【待解决】【OpenCV图像处理】1.27 模板匹配(Template Match)

    1 相关理论 直观介绍 介绍 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域 所以模板匹配首先需要一个模板图像T 给定的子图像 另外需要一个待检测的图像 源图像S 工作方法 在带检测图像上 从左到右 从上向下计算模板图像与重叠子图