机器视觉-5 检测原理之视觉定位

在机器视觉检测中有一个非常重要的流程就是定位,检测区准确的检测效果的基础是精确的定位。以下是关于OpenCV中matchTemplate检测的详细说明,包括其原理、使用方法和应用场景。

1. matchTemplate 的原理

模板匹配的基本原理是通过滑动模板图像与源图像的每一个子区域进行比较,计算模板与子区域之间的相似度。滑动模板的方式类似于卷积操作。不同的匹配方法使用不同的相似度度量:

  • 平方差 (Sum of Squared Differences, SSD): 计算模板与子区域像素之间差的平方和。
  • 相关匹配 (Cross-Correlation, CC): 计算模板与子区域像素的相关性。
  • 相关系数 (Correlation Coefficient, CCOEFF): 对模板和子区域进行均值归一化后再计算相关性,减小亮度差异的影响。

匹配结果存储在一个矩阵中,矩阵中的每个值代表模板在对应位置与图像子区域的相似度。不同的匹配方法会有不同的极值(如平方差匹配时,值越小越好;相关匹配时,值越大越好)。

2. matchTemplate 的函数原型

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

  • image: 源图像。
  • templ: 模板图像。
  • result: 输出结果矩阵,存储匹配的相似度值。
  • method: 匹配方法(详见后面说明)。

3. 常用的匹配方法

OpenCV 提供了6种不同的匹配方法,具体如下:

  • cv::TM_SQDIFF: 平方差匹配法,结果值越小表示越相似。
  • cv::TM_SQDIFF_NORMED: 归一化的平方差匹配法,结果值越接近0表示越相似。
  • cv::TM_CCORR: 相关匹配法,结果值越大表示越相似。
  • cv::TM_CCORR_NORMED: 归一化的相关匹配法,结果值越接近1表示越相似。
  • cv::TM_CCOEFF: 相关系数匹配法,结果值越大表示越相似。
  • cv::TM_CCOEFF_NORMED: 归一化的相关系数匹配法,结果值越接近1表示越相似。

4. matchTemplate 的使用方法

下面是一个C++的使用示例:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main() {// 读取源图像和模板图像Mat image = imread("image.jpg");Mat templateImg = imread("template.jpg");if (image.empty() || templateImg.empty()) {cout << "图像读取失败!" << endl;return -1;}// 创建结果矩阵,用于保存匹配结果Mat result;matchTemplate(image, templateImg, result, TM_CCOEFF_NORMED);// 找到匹配位置double minVal, maxVal;Point minLoc, maxLoc;minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);// 使用最大值作为最佳匹配位置Point matchLoc = maxLoc;// 在源图像上绘制矩形rectangle(image, matchLoc, Point(matchLoc.x + templateImg.cols, matchLoc.y + templateImg.rows), Scalar(0, 255, 0), 2);// 显示结果imshow("Detected", image);waitKey(0);return 0;
}

5. minMaxLoc 函数

minMaxLoc 函数用于在结果矩阵中找到最大值或最小值(具体取决于匹配方法)。该函数的作用是找到最优匹配的位置:

void minMaxLoc(InputArray src, double* minVal, double* maxVal, Point* minLoc, Point* maxLoc);

  • minVal:最小值。
  • maxVal:最大值。
  • minLoc:最小值的位置。
  • maxLoc:最大值的位置。

不同的匹配方法返回的极值有所不同:

  • 对于 TM_SQDIFF 和 TM_SQDIFF_NORMED,匹配的最佳位置是最小值。
  • 对于其他方法,匹配的最佳位置是最大值。

6. 应用场景

模板匹配的应用场景通常是在已知目标形状的情况下寻找目标。典型应用场景包括:

  • 对象检测:在图像中寻找一个已知形状的物体,例如在制造业中的产品检测、零件识别等。
  • 图像配准:在不同视角或不同帧中寻找相同的目标,用于图像对齐或视频稳定等。
  • 图像识别:在多张图像中寻找预定义的模板,例如商标检测、人脸识别等。
  • 实时跟踪:在视频中实时跟踪特定的对象,如体育赛事中的球体跟踪、汽车跟踪等。

7. 优缺点

优点:
  • 简单易用matchTemplate 是基于像素强度的模板匹配方法,相比复杂的特征匹配方法实现简单。
  • 适合已知形状匹配:在图像清晰、无噪声、亮度均匀的条件下,可以取得较好的效果。
缺点:
  • 对旋转、缩放不敏感:模板匹配对旋转、尺度变化非常敏感,若目标在图像中有旋转或缩放,则匹配效果会显著下降。
  • 受光照影响:亮度变化会影响模板匹配的结果。
  • 计算量大:在大图像中滑动模板会消耗大量的计算资源,尤其是大模板图像时。

8. 进阶方法

如果 matchTemplate 无法满足应用需求(如处理旋转、缩放等变化),可以采用以下进阶方法:

  • 多尺度模板匹配:在不同的尺度下进行模板匹配,可以处理目标的尺度变化。
  • 特征匹配算法:如 SIFT、SURF、ORB 等,可以处理旋转、缩放、亮度变化等复杂情况。
  • 深度学习方法:卷积神经网络(CNN)等深度学习技术可以用于更加复杂的图像匹配任务。

9. 总结

OpenCV 的 matchTemplate 函数是进行图像模板匹配的基本工具,适用于简单的匹配任务。它易于实现且具有一定的稳定性,但对旋转、缩放等复杂情况不敏感。在需要更高精度和鲁棒性的场景下,可以结合特征匹配算法或深度学习方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146904.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java反序列化利用链篇 | URLDNS链

文章目录 URLDNS链调用链分析Payload编写 系列篇其他文章&#xff0c;推荐顺序观看~ Java反序列化利用链篇 | JdbcRowSetImpl利用链分析Java反序列化利用链篇 | CC1链_全网最菜的分析思路Java反序列化利用链篇 | CC1链的第二种方式-LazyMap版调用链Java反序列化利用链篇 | URLD…

thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表&#xff08;分区&#xff09; 引言 thinkphp* 大道至简一、分库分表分表php 分库分表hash算法0、分表的方法&#xff08;thinkphp&#xff09;1、ThinkPHP6 业务分表之一&#xff1a;UID 发号器2、ThinkPHP6 业务分表之二&#xff1a;用…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653

1. 力扣653&#xff1a;两数之和IV - 输入二叉搜索树 1.1 题目&#xff1a; 给定一个二叉搜索树 root 和一个目标结果 k&#xff0c;如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果&#xff0c;则返回 true。 示例 1&#xff1a; 输入: root [5,3,6,2,4,null,7…

伊犁云计算22-1 raid 5 linux 配置

&#xff11;  添加四块&#xff53;&#xff41;&#xff54;&#xff41; 硬盘  &#xff12;  设置启动项为原来&#xff53;&#xff43;&#xff53;&#xff49; 的硬盘 &#xff13;  四块盘都是  &#xff46;&#xff44;   &#xff4c;&#xff49;&…

用 HTML + JavaScript DIY 一个渐进式延迟法定退休年龄测算器

为减轻社会和个人因退休年龄变化带来的冲击&#xff0c;近日&#xff0c;全国人民代表大会常务委员会正式发布了关于实施渐进式延迟法定退休年龄的重要决定。 根据该决定&#xff0c;我国将同步启动对男、女职工法定退休年龄的延迟计划。这一调整将采取渐进式的方式进行&#…

概率论与数理统计(2)

第一节博客已经整理了求导的公式&#xff0c;一些常用的概念。链接如下&#xff1a;高等数学基础&#xff08;1&#xff09;-CSDN博客。 第二节博客整理了微积分的公式及其相关概念。链接如下&#xff1a;高等数学基础&#xff08;2&#xff09;——微积分-CSDN博客 第三节博客…

Java:Clonable 接口和拷贝

一 Clonable 接口 在 Java SE 中&#xff0c;Cloneable 是一个标记接口&#xff08;Marker Interface&#xff09;&#xff0c;它位于 java.lang 包中。这个接口的主要目的是标识实现该接口的类能够被合法地克隆&#xff08;即可以调用 Object 类中的 clone() 方法&#xff09…

重生之我们在ES顶端相遇第14 章 - ES 节点类型

文章目录 前言Coordinating nodeMaster-eligible nodeData nodeCoordinating only nodeRemote-eligible nodeMachine learning node 前言 通过前面的学习&#xff0c;我们已经初步的掌握了 ES 的大部分用法。 后面的篇章会介绍 ES 集群相关的内容。 本文着重介绍 ES 节点类型&…

vue3-05-Element-plus中表单校验:校验对象中的对象的属性,校验对象中的数组中的对象的属性,校验嵌套对象

目录 一、校验对象中的普通属性二、校验对象中对象的属性三、校验对象中的数组中的对象的属性 这两天写vue3项目&#xff0c;用了element-plus库&#xff0c;到了表单规则验证的环节&#xff0c;我发现我只会校验对象中的普通属性&#xff0c;如果校验嵌套对象&#xff0c;我就…

Java笔试面试题AI答之设计模式(2)

文章目录 6. 什么是单例模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;解决的问题应用的环境实现方式 7. 什么是工厂模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;工厂模式简述工厂模式解决的问题工厂模式的应用环境工厂模式的…

React组件如何暴露自身的方法

一、研究背景 最近遇到一个如何暴露React组件自身方法的问题。在某些时候&#xff0c;我们需要调用某个组件内部的方法以实现某个功能&#xff0c;因此我们需要了解如何暴露组件内部API的方法。 二、实践过程 本文主要介绍React组件暴露子组件API的方法&#xff0c;以下是实…

基于协同过滤推荐算法的食品推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…

尚品汇-秒杀成功下单接口、秒杀结束定时任务-清空缓存数据(五十四)

目录&#xff1a; &#xff08;1&#xff09;下单页面 &#xff08;2&#xff09;service-activity-client添加接口 &#xff08;3&#xff09;web-all 编写去下单控制器 &#xff08;4&#xff09;service-order模块提供秒杀下单接口 &#xff08;5&#xff09;service-or…

2024年最新 Python 大数据网络爬虫技术基础案例详细教程(更新中)

网络爬虫概述 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网页蜘蛛&#xff08;Web Spider&#xff09;或网络机器人&#xff08;Web Robot&#xff09;&#xff0c;是一种自动化程序或脚本&#xff0c;用于浏览万维网&#xff08;World Wide Web&#xf…

通过UV快速计算品牌独立站网络流量

背景&#xff1a; 品牌独立站项目交付过程中&#xff0c;我们需要为客户提供“云资源” 成本报价&#xff0c;其中“计算资源” 及CPU、内存、存储 参数相对固定&#xff0c;而互联网网络成本需要进行评估报价&#xff0c;以海外TOP云平台 AWS、AZURE、GCP 为例都是以“不限带…

【学术会议:中国厦门,为全球的计算机科学与管理科技研究者提供一个国际交流平台】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)

您的学术研究值得被更多人看到&#xff01; 在这里&#xff0c;我为您提供精准的会议推荐&#xff0c;包括计算机科学、管理科技、信息系统、人工智能、供应链管理等领域的国际会议。高效的稿件录用流程和优质的检索服务将确保您的研究成果迅速传播。关注我&#xff0c;寻找与…

java(2)方法的使用

目录 1.前言 2.正文 2.1方法的定义 2.2方法的调用过程 2.3方法的实参与形参 2.3.1形参 2.3.2实参 2.3.3参数传递 2.4方法的重载 3.小结 1.前言 哈喽大家好啊&#xff0c;今天博主继续带领大家学习java的基本语法&#xff0c;java的基础语法部分打算用六到七篇博文完…

828华为云征文——使用Flexus云服务器X实例CentOS镜像下创建MySQL服务器教程

一、概述 1.1 前言 当前正值华为云盛大的828 B2B企业庆典&#xff0c;其中Flexus X实例的特惠活动尤为吸引人眼球。对于追求极致算力表现&#xff0c;并期望在自建MySQL数据库、Redis缓存系统及Nginx服务器部署上获得卓越性能的企业用户而言&#xff0c;这无疑是一个不可多得的…

[Linux] Linux进程PCB内部信息的深入理解

标题&#xff1a;[Linux] Linux进程PCB内部信息的深入理解 个人主页&#xff1a;水墨不写bug &#xff08;图片来自网络&#xff09; 目录 一.查看进程 二.认识并了解进程的关键信息 I&#xff0c;PID/PPID II&#xff0c;exe III&#xff0c;cwd 三、fork&#xff08;&…