Qt+Opencv:模板匹配

一、模板匹配应用场景闲聊

在很多机器视觉的应用场景都有用到模板匹配的功能,常常用来判断是否有目标检测对象,以及检测对象在图像中的位置。譬如在AOI检测软件中,通过拍摄Mark点的图像,进行mark模板的匹配,从而进行晶圆(以下统称 wafer)的角度校正和中心位置计算,通过一系列的坐标转换后,用于晶圆的检测和量测。

本例只是一个简单的模板匹配示例,仅供学习和知识普及用。
譬如,我们有下面一个模板,
在这里插入图片描述
我需要在实际拍摄的图像中获取对象的坐标信息。如下图:

在这里插入图片描述

二、模板匹配代码示例

#ifndef TEMPLATEMATCHDEMO_H
#define TEMPLATEMATCHDEMO_Hclass TemplateMatchDemo
{
public:TemplateMatchDemo();static int run();
};#endif // TEMPLATEMATCHDEMO_H
#include "templatematchdemo.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <QDebug>
using namespace std;
using namespace cv;TemplateMatchDemo::TemplateMatchDemo()
{}cv::Mat img,templ,result;
const char* window_title_1 = "Source Image";
const char* window_title_2 = "Result window";
int match_method;
int max_Trackbar = 5;void MatchCallback(int,void*)
{Mat img_display;img.copyTo( img_display ); //将 img的内容拷贝到 img_display/// 创建输出结果的矩阵int result_cols =  img.cols - templ.cols + 1;     //计算用于储存匹配结果的输出图像矩阵的大小。int result_rows = img.rows - templ.rows + 1;result.create( result_cols, result_rows, CV_32FC1 );//被创建矩阵的列数,行数,以CV_32FC1形式储存。/// 进行匹配和标准化matchTemplate( img, templ, result, match_method ); //待匹配图像,模版图像,输出结果图像,匹配方法(由滑块数值给定。)normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );//输入数组,输出数组,range normalize的最小值,range normalize的最大值,归一化类型,当type为负数的时候输出的type和输入的type相同。/// 通过函数 minMaxLoc 定位最匹配的位置double minVal; double maxVal; Point minLoc; Point maxLoc;Point matchLoc;minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );//用于检测矩阵中最大值和最小值的位置/// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好if( match_method  == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ){matchLoc = minLoc;}else{matchLoc = maxLoc;}///将得到的结果用矩形框起来rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar(0,0,255), 2, 8, 0 );rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar(0,0,255), 2, 8, 0 );imshow( window_title_1, img_display );//输出最终的到的结果imwrite("result.jpg",img_display);    //将得到的结果写到源代码目录下。imshow( window_title_2, result );     // 输出匹配结果矩阵。do {qt_noop();}  while (waitKey(30) < 0);return;
}int TemplateMatchDemo::run()
{/// 加载原图及模板图try{templ = imread("image/mark_templ.png");img = imread("image/Mark.png");/// 模板匹配函数MatchCallback(0,nullptr);}catch(const cv::Exception& e){qDebug() << e.what() << Qt::endl;}return 0;
}

三、运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker——数据卷(volume)概念及使用案例

docker数据卷 Docker的镜像是有⼀系列的只读层组合⽽来&#xff0c;当启动⼀个容器时&#xff0c;Docker加载镜像的所有只读层&#xff0c;并在最上层加⼊⼀个读写层。这个设计使得Docker可以提⾼镜像构建、存储和分发的效率&#xff0c;节省了时间和存储空间&#xff0c;然⽽…

【Java EE初阶三 】线程的状态与安全(上)

1. join方法与多线程 1.1 初识多线程 为了提高cpu得利用率&#xff0c;因此就引入了多个线程的概念&#xff1b;即每个线程负责完成整个程序的一部分工作即可。 写一个代码&#xff0c;让主线程&#xff0c;创建一个新的线程&#xff0c;由新线程负责完成运算&#xff08;12。…

Redis实现滚动周榜|滚动榜单|直播间榜单|排行榜|Redis实现日榜03

滚动排行榜与一般排行榜的最大区别在于数据的存储和查询方式。在一般排行榜中&#xff0c;起始点是固定的&#xff0c;例如某一周或某一个月&#xff0c;存储和查询时的时间范围也是固定的。而滚动排行榜则不同&#xff0c;在滚动排行榜中&#xff0c;榜单的取值范围是随着时间…

数模学习day01-层次分析法模型

已经一个多月没有更新过文章了&#xff0c;为了保住那绩点的意思微弱的优势&#xff0c;直接开摆&#xff0c;开始复习专业课和公共课考试了&#xff0c;结果虽然有遗憾但是还是算不错&#xff0c;至少没有掉到3.xx嘿嘿。 然后现在就要开始学习数学建模和算法同步了。接下来的文…

element ui Checkbox 多选框组件 lable不支持Object类型的值的问题

浅浅记录一下&#xff0c;遇到这个问题的心理路程吧&#xff0c;首先我遇到的问题是多选框的值回显不打对勾&#xff0c;&#xff08;例如&#xff1a;你新增的时候多选&#xff0c;然后点击编辑的时候选过的值没有被勾选&#xff0c;其实是被勾选上了&#xff0c;但是没有显示…

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一&#xff1a;fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载&#xff1a;7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…

Zulip:开源团队协作工具,高效沟通与远程办公 | 开源日报 No.126

zulip/zulip Stars: 18.9k License: Apache-2.0 Zulip 是一个开源的团队协作工具&#xff0c;拥有独特的基于主题的线程功能&#xff0c;结合了电子邮件和聊天的优点&#xff0c;使远程工作更加高效和愉快。它是唯一设计用于实时和异步对话的现代团队聊天应用程序。 其核心优势…

ubuntu 系统终端颜色设置

1 开启终端颜色 # 第一步&#xff1a; 在 ~/.bashrc 中设置 force_color_promptyes# 第二步&#xff1a; 执行 source ~/.bashrc2 对于精减的 .bashrc 在 ~/.bashrc 中添加以下内容&#xff0c;再执行 source ~/.bashrc &#xff1a; # uncomment for a colored prompt, if…

Vue 3插槽

Vue 3中的插槽&#xff08;Slots&#xff09;是一种强大的模式&#xff0c;用于创建可复用的组件&#xff0c;它允许你将模板插入到组件内部&#xff0c;同时保持组件的封装性和可重用性。在Vue 3中&#xff0c;插槽的使用变得更加灵活和强大。 基本插槽 默认插槽 : 在子组件…

Redis自动部署脚本编写

#!/bin/bash ck_ok() { if [ $? -ne 0 ] then echo "$1 error." exit 1 fi } download_redis() { cd /usr/local/src if [ -f redis-7.0.4.tar.gz ] then echo "当前目录已经存在redis-7.0.4.tar.gz&q…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

RabbitMq知识概述

本文来说下RabbitMq相关的知识与概念 文章目录 概述AMQP协议Exchange 消息如何保证100&#xff05;投递什么是生产端的可靠性投递可靠性投递保障方案 消息幂等性高并发的情况下如何避免消息重复消费confirm 确认消息、Return返回消息如何实现confirm确认消息return消息机制 消费…

Keil5 新建STM32工程步骤

//************************新建工程************************// 新建文件夹“STM32project”。 打开“Keil5”。 选择“Project”&#xff0c;选择“New uVision Project”&#xff0c;选择“STM32project”文件夹。 输入文件名&#xff0c;选择芯片型号。 //***************…

《数据库开发实践》之存储过程【知识点罗列+例题演练】

一、什么是存储过程&#xff1f; 1.概念理解&#xff1a; 存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句&#xff0c;提供一种封装任务的方法。因此在创建编译好某个存储过程后&#xff0c;因为存储过程中有可执行操作的sql语句&#xff0c;用户可以…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

【机组期末速成】计算机的运算方法|进制转换|无符号数与有符号数|数的定点表示与浮点表示|定点运算

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;计算机组成原理&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 前言&#xff1a; 一、本章考点总览 二、考点分析 1、日常我们采用十进制来表示数据&#xff0c;计算机如何表示&#xf…

PolarNet: 一种改进的时实激光雷达点云语义分割网格表示方法

PolarNet介绍 github工程代码&#xff1a;https://github.com/edwardzhou130/PolarSeg 点云语义分割在自动驾驶领域的感知模块占据重要地位, 从多年前基于传统的点云聚类和分割,到近些年基于深度学习的点云语义分割方法, 技术逐渐成熟已经进入实时端到端的阶段. 前有基于球面…

无魔搭+ 函数计算: 一键部署,缩短大模型选型到生产的距离

引言 面对魔搭 ModelScope 社区提供的海量模型&#xff0c;用户希望快速进行选型并生产使用起来&#xff0c;但在此之前&#xff0c;却一定会面临算力管理难、模型部署难等一系列问题&#xff0c;那么能否实现快速把选定的模型部署在云端功能强大的 GPU 上&#xff0c;由云端负…

mybatis之TypeHandler,再也不怕数据库与实体类之间的数据转换问题了

mybatis查询转换实体类问题 TypeHandler示例&#xff08;数据类型转换&#xff0c;解决科学计数法问题&#xff09;局部自定义方式全局方式 TypeHandler 类型处理器的基类&#xff0c;MyBatis 中的 TypeHandler 类型处理器用于 JavaType 与 JdbcType 之间的转换&#xff1b;用…

2024,5G-A风起,中兴通讯破浪

对于通信圈而言&#xff0c;2024年最关键的里程碑&#xff0c;当属3GPP R18版本即将冻结。作为5G国际标准化组织&#xff0c;3GPP的意义是推动成员公司、工作组和技术规范的研究&#xff0c;让5G发展更有章法。 放眼整个5G技术的演进&#xff0c;其实大致分为两个阶段。第一阶段…