图像识别基础之模板匹配

principle

图像匹配

本质:图像的相似度很高(矩阵的相似度很高)

code

/*\brief 我的图像匹配函数,获取差方和均值最小的矩阵作为结果\param srcPicFile:用以匹配的图像文件\param templatePicFile:模板图像文件\param destPicFile:输出的检测结果文件
*/
void MyPictureMatch(const char* srcPicFile, const char* templatePicFile, const char* destPicFile)
{if ((!srcPicFile) || (!templatePicFile) || (!destPicFile)){return;}cv::Mat srcMat;cv::Mat templateMat;cv::Mat srcGrayMat;cv::Mat templateGrayMat;uint32_t templateMatSize = 0;cv::Rect mask;cv::Mat subSrcGrayMat;cv::Mat caculationMat;struct recorde {int x;int y;double caculation;};recorde recorder;std::vector<recorde> recordes;srcMat = cv::imread(srcPicFile);templateMat = cv::imread(templatePicFile);if (srcMat.size < templateMat.size) {fprintf(stdout, "srcMat.size < templateMat.size\n");return;}templateMatSize = templateMat.cols * templateMat.rows;cv::cvtColor(srcMat, srcGrayMat, cv::ColorConversionCodes::COLOR_RGB2GRAY);cv::cvtColor(templateMat, templateGrayMat, cv::ColorConversionCodes::COLOR_RGB2GRAY);mask.width = templateGrayMat.cols;mask.height = templateGrayMat.rows;caculationMat.create(cv::Size(templateGrayMat.cols, templateGrayMat.rows), templateGrayMat.type());for (int i = 0; (i + mask.height) < srcGrayMat.rows; ++i){for (int j = 0; (j + mask.width) < srcGrayMat.cols; ++j){mask.x = j;mask.y = i;recorder.x = mask.x;recorder.y = mask.y;srcGrayMat(mask).copyTo(subSrcGrayMat);cv::subtract(subSrcGrayMat, templateGrayMat, caculationMat);cv::multiply(caculationMat, caculationMat, caculationMat);cv::Scalar sum = cv::sum(caculationMat);recorder.caculation = sum(0);recorder.caculation = recorder.caculation / templateMatSize;recordes.push_back(recorder);// fprintf(stderr, "recorder.caculation:%lf\n", recorder.caculation);}}auto cmp = [](const recorde& p1, const recorde& p2)->bool {if (p1.caculation < p2.caculation){return true;}return false;};std::sort(recordes.begin(), recordes.end(), cmp);fprintf(stdout, "recordes[0]:%d,%d,%lf\n", recordes[0].x, recordes[0].y, recordes[0].caculation);mask.x = recordes[0].x;mask.y = recordes[0].y;cv::rectangle(srcMat, mask, cv::Scalar(0, 255, 0));// imshow需要显示驱动
#if 0cv::imshow(destPicFile, srcMat);cv::waitKey();
#elsecv::imwrite(destPicFile, srcMat);
#endif
}

performance

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

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

相关文章

汇报工作时,你的工作会让领导满意吗?

当前你正在做的事 众所周知&#xff0c;跟领导汇报&#xff0c;第一件事需着重汇报你正在做的事&#xff0c;否则领导会感觉你无所事事。 举个例子&#xff1a; 完成了某某项目&#xff0c;在这项目中我负责&#xff1a;协调不同科室之间的纠纷&#xff0c;并把问题集中上报给…

阿里云幻兽帕鲁服务器配置4核16G10M带宽够8个人玩吗?玩起来流畅度怎么样?

阿里云幻兽帕鲁服务器配置4核16G10M带宽这个&#xff0c;个人实测下来&#xff0c;五六个人玩是比较流畅的&#xff0c;不过8个人的话&#xff0c;估计会有点卡。如果是8个人的话&#xff0c;我建议选择8核32G那个配置&#xff0c;更加适合一些。 阿里云一键部署幻兽帕鲁详细教…

Leetcode 583 两个字符串的删除操作

题意理解&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 该题的要求是&#xff1a;当前有两个单词&#xff0c;要是两个单词剩余的部分相同&#xff0c;最少需要删除多少个字…

解惑:工业物联网 modbus 地址到底从0开始还是从1开始

困惑了好久&#xff0c;终于搞明白了&#xff0c;直接上结果&#xff1a; modbus本身是从0开始&#xff0c;这可以从指令数据中直接看出来PLC分区的地址从1开始&#xff0c;这是PLC的习惯&#xff0c;但是对应的modbus指令的地址要-1 简单说就是&#xff0c;PLC4个区的表达方式…

打印最小公倍数

打印最小公倍数 题目描述&#xff1a; 输入2个整数m和n&#xff0c;计算m和n的最小公倍数&#xff0c;并打印出结果 测试1&#xff1a; 输入&#xff1a;18 24 输出&#xff1a;72 测试2&#xff1a; 输入&#xff1a;18 6 输出&#xff1a;18解法思路: 最小公倍数是指两个…

分布式锁redisson

文章目录 1. 分布式锁1.1 基本原理和实现方式对比synchronized锁在集群模式下的问题多jvm使用同一个锁监视器分布式锁概念分布式锁须满足的条件分布式锁的实现 1.2 基于Redis的分布式锁获取锁&释放锁操作示例 基于Redis实现分布式锁初级版本ILock接口SimpleRedisLock使用示…

原型模式-Prototype Pattern

原文地址:https://jaune162.blog/design-pattern/prototype-pattern/ 引言 在Java中如果我们想要拷贝一个对象应该怎么做?第一种方法是使用 getter和setter方法一个字段一个字段设置。或者使用 BeanUtils.copyProperties() 方法。这种方式不仅能实现相同类型之间对象的拷贝,…

CMake进行C/C++与汇编混合编程

1. 前提 这篇文章记录一下怎么用CMake进行项目管理, 并用C/C和汇编进行混合编程, 为了使用这项技术, 必须在VS的环境中安装好cmake组件 由于大部分人不会使用C/C与汇编进行混合编程的情况。所以这篇文章并不适用于绝大部分人不会对其中具体细节进行过多叙述。只是做一些简单的…

【C++前缀和】野牛与狼

题目描述 位于欧洲中部的赫希费尔登狩猎保护区生活着许多动物&#xff0c;雄壮的野牛和凶狠的狼群之间保持着一种平衡&#xff0c;当野牛的数量和狼群一样多时&#xff0c;它们彼此互不侵犯相安无事&#xff0c;但只要狼的数量多于野牛狼群就会攻击牛群&#xff0c;而野牛数量…

正确看待OpenAI大模型Sora

2月16日凌晨&#xff0c;OpenAI发布了文生视频模型Sora。官方是这样描述的&#xff1a;Sora is an AI model that can create realistic and imaginative scenes from text instructions.Sora一个人工智能模型&#xff0c;它可以根据文本指令创建逼真和富有想象力的场景。Sora…

网络安全防御保护 Day5

今天的任务如下 要求一的解决方法&#xff1a; 前面这些都是在防火墙FW1上的配置。 首先创建电信的NAT策略 这里新建转换后的地址池 移动同理&#xff0c;不过地址池不一样 要求二的解决方法&#xff1a; 切换至服务器映射选项&#xff0c;点击新建&#xff0c;配置外网通过…

Java 基于 SpringBoot+Vue 的校园交友网站,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

DarkSide针对VMware EXSI系统进行加密

前言 最近黑客组织利用DarkSide勒索病毒对Colonial Pipeline 发起勒索攻击&#xff0c;国内外各大安全厂商和安全媒体也都有相关报道&#xff0c;DarkSide勒索软件是从2020年8月出现&#xff0c;并以(RAAS)勒索即服务的商业模式进行运作&#xff0c;此勒索病毒不仅可以部署基于…

详解 Redis 实现数据去重

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 言 一. Redis去重原理 1. Redis Set 数据结构 2. 基于 Set 实现数据去重 3. 代码示例 4. 总结 …

月薪30K-100K,新一波工作机会来了,你准备好了吗

纯血版鸿蒙发布&#xff0c;开启一个新时代 1月18日下午&#xff0c;在“鸿蒙千帆起”发布会上&#xff0c;华为揭秘鸿蒙生态和纯血鸿蒙星河版HarmonyOS NEXT进阶的新进展。“几年来&#xff0c;在众多伙伴和开发者的共同努力下&#xff0c;鸿蒙生态设备数已达8亿&#xff0c;…

【医学图像分割 2024】BEFUnet

文章目录 【医学图像分割 2024】BEFUnet摘要1. 介绍2. 相关工作2.1 基于CNN的分割网络2.2 ViT2.3 用于医学图像分割的Transformer 3. 方法3.1 双支路编码器3.1.1 边缘编码器3.1.2 主体编码器 3.2 LCAF模块3.2.1 双级融合模块(DLF) 3.3 损失函数3.3.1 边缘监督损失3.3.2 整体边缘…

音响ATS2819 with HDMI ARC_1.4_2.0 Platforms项目需求

加我微信hezkz17,可申请加入数字音频系统研究开发交流答疑群,赠送音频项目核心开发资料 项目名称: ATS2819 with HDMI ARC_1.4_2.0 Platforms 设计要求 幻音型号: HYS-200A/B/C 项目依托: 结构设计: (草案) 2018/05/08

AJAX——接口文档

1 接口文档 接口文档&#xff1a;描述接口的文章 接口&#xff1a;使用AJAX和服务器通讯时&#xff0c;使用的URL&#xff0c;请求方法&#xff0c;以及参数 传送门&#xff1a;AJAX阶段接口文档 <!DOCTYPE html> <html lang"en"><head><meta c…

家人们,比赛打完了

啊&#xff0c;终于打完一场比赛了&#xff0c;但还有三场…… 先看看我的战绩&#xff1a; 共八题&#xff0c;AC6题&#xff0c;总共3902分&#xff0c;3.7k人参加&#xff0c;第980名 来看看第一&#xff1a; A8题&#xff0c;我只有2题没做出&#xff0c;相差4000多分&am…

mysql读写分离

读写分离&#xff1a;应用缓存的原则之一是保证缓存命中率足够高&#xff0c;在大量不同请求下的读多写少&#xff0c;“读写分离”是提升系统并发能力的重要手段。在完成主从复制之后&#xff0c;可以在写数据时只写主库&#xff0c;在读数据时只读从库 主从复制原理&#xff…