图像识别基础之模板匹配

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.hqwc.cn/news/472905.html

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

相关文章

一周学会Django5 Python Web开发-项目配置settings.py文件-数据库配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

【Linux内核】从0开始入门Linux Kernel源码

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[Linux内核] ❤️ 前置学习专栏&#xff1a;[Linux学习]从0到1 ⏰ 我们仍在旅途 ​ 目录 …

Qt:Qt3个窗口类的区别、VS与QT项目转换

一、Qt3个窗口类的区别 QMainWindow&#xff1a;包含菜单栏、工具栏、状态栏 QWidget&#xff1a;普通的一个窗口&#xff0c;什么也不包括 QDialog&#xff1a;对话框&#xff0c;常用来做登录窗口、弹出窗口&#xff08;例如设置页面&#xff09; QDialog实现简易登录界面…

GET 和 POST 方法有什么区别?

1.概述 当客户端通过 Web 与服务器通信时&#xff0c;此过程由超文本传输​​协议 ( HTTP) 启用。HTTP 是客户端和服务器之间的请求-响应协议。 GET 和 POST 方法是两种最常见的HTTP 请求方法。它们用于检索数据或将数据发送到服务器。它们是客户端-服务器模型的组成部分&…

Lua内存管理策略

传统的内存管理策略主要分为两种&#xff1a;引用计数&#xff0c;和垃圾回收。相比后者每一段时间执行一次回收周期&#xff0c;前者是对于每一个变量都维护被引用数的策略。对于Lua这种轻量化语言而言&#xff0c;占据大内存的开销是极力避免的&#xff0c;而前者的方式显然是…

文件夹删不掉,显示在另一个文件中打开怎么办

问题&#xff1a; 一、想要删掉这个文件夹&#xff0c;却因为文件夹中的文件打开了删不掉&#xff0c;这里我因为做的测试&#xff0c;所以是知道打开了什么 二、一般情况下文件比较多时&#xff0c;是不知道打开了什么的&#xff0c;长这个样子 解决&#xff1a; 一、打开任…

《Go 简易速速上手小册》第4章:接口与抽象(2024 最新版)

文章目录 4.1 接口的定义与实现 - Go 语言的多面手4.1.1 基础知识讲解4.1.2 重点案例&#xff1a;动物乐队功能描述实现代码 4.1.3 拓展案例 1&#xff1a;通用支付系统拓展案例 1&#xff1a;通用支付系统功能描述实现代码 4.1.4 拓展案例 2&#xff1a;动物园管理器拓展案例 …

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十一)(4)(5)

实验十一&#xff1a;非线性方程&#xff08;组&#xff09;求解 练习四 1.费根鲍姆(Feigenbaum)对超越函数 (λ为非负实数)进行了分叉与混沌的研究,试利用迭代格式 ,做出相应的费根鲍姆图. clc;clear; a0.5;%x初值取0.5 for l1:0.01:1.5hold on x[a]; for k2:150x(k)l*sin…

通过玩游戏学会AWS

游戏名字&#xff1a; Cloud Quest 类型&#xff1a;亚马逊云科技官方出了一款 3D 角色扮演、虚拟城市建造形式的游戏实验课 进入方法&#xff1a;浏览器搜索 Cloud Quest&#xff08;或扫描下方二维码&#xff09;进入 Cloud Quest 课程页。 选择以下的链接 点击进行注册 进…

GPT-4带来的思想火花

GPT-4能够以其强大的生成能力和广泛的知识储备激发出众多思想火花。它能够在不同的情境下生成新颖的观点、独特的见解和富有创意的解决方案&#xff0c;这不仅有助于用户突破思维定势&#xff0c;还能促进知识与信息在不同领域的交叉融合。 1.GPT-4出色的创新思考和知识整合能…

MIT-BEVFusion系列八--onnx导出2 spconv network网络导出

这里写目录标题 export-scn.py加载模型设置每层的精度属性初始化输入参数导出模型model.encoder_layers 设置初始化参数设置 indice_key 属性更改 lidar backbone 的 forward更改lidar网络内各个层的forward带参数装饰器&#xff0c;钩子函数代码使用装饰器修改forward举例 跟踪…

Ubuntu Desktop 显示文件路径

Ubuntu Desktop 显示文件路径 1. GUI hot key2. CLIReferences 1. GUI hot key Ctrl L: 显示文件路径 2. CLI right click -> Open in Terminal -> pwd strongforeverstrong:~/Desktop$ pwd /home/strong/DesktopReferences [1] Yongqiang Cheng, https://yongqiang…