【Emgu CV教程】10.11、MatchShapes()比较轮廓的相似度

news2024/11/27 15:34:30

文章目录

  • 一、函数介绍
  • 二、演示
    • 1.原始素材
    • 2.代码
    • 3.运行结果


一、函数介绍

MatchShapes()函数,可以比较两个轮廓的相似度,而且对于旋转、放大、缩小的轮廓都能适用,利用这个函数就能实现最简单的物体检测。函数官方定义如下

public static double MatchShapes(
	IInputArray contour1, // 待比较的轮廓1
	IInputArray contour2,  // 待比较的轮廓2
	ContoursMatchType method, // 比较方式
	double parameter = 0.0 // 对比精度0.0 - 1.0 ,越小匹配程度越高
)

ContoursMatchType 有I1、I2、I3共三种,我也不知道有什么区别。

二、演示

1.原始素材

模板图像templateMat如下图:
在这里插入图片描述
目标图像targetMat如下图:
在这里插入图片描述
我们的目标是在targetMat中,找到与templateMat相似的字母“A”。

2.代码

轮廓检索模式要选择RetrType.External,代码如下:

Mat tempTemplateMat = templateMat.Clone();
Mat tempTargetMat = targetMat.Clone();
Mat dstMat = tempTargetMat.Clone();
Mat templateGray = new Mat();
Mat targetGray = new Mat();
int threshold = 40;
double comparison = Convert.ToDouble("0.02");

// 1.查找模版图像的轮廓
CvInvoke.CvtColor(tempTemplateMat, templateGray, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(templateGray, templateGray, threshold, 255, ThresholdType.Binary); // 二值化,确保黑里面找白
CvInvoke.Imshow("1.Threshold template Mat", templateGray);
VectorOfVectorOfPoint contoursTemplate = new VectorOfVectorOfPoint(); // 模版图像的轮廓
VectorOfRect hierarchyTemplate = new VectorOfRect();
CvInvoke.FindContours(templateGray, contoursTemplate, hierarchyTemplate, RetrType.External, ChainApproxMethod.ChainApproxNone);
CvInvoke.DrawContours(tempTemplateMat, contoursTemplate, -1, new MCvScalar(255, 0, 255), 1);

// 2.查找模板图像的轮廓
CvInvoke.CvtColor(tempTargetMat, templateGray, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(templateGray, templateGray, threshold, 255, ThresholdType.Binary);
CvInvoke.Imshow("2.Threshold target Mat", templateGray);
VectorOfVectorOfPoint contoursTarget = new VectorOfVectorOfPoint(); // 模版图像的轮廓
VectorOfRect hierarchyTarget = new VectorOfRect();

 CvInvoke.FindContours(templateGray, contoursTarget, hierarchyTarget, RetrType.External, ChainApproxMethod.ChainApproxNone);


// 3.形状匹配---比较两个形状或轮廓间的相似度
double a0 = 0;
for (int i = 0; i < contoursTarget.Size; i++)
{
	a0 = CvInvoke.MatchShapes(contoursTemplate[0], contoursTarget[i], ContoursMatchType.I1, 0);
	Console.WriteLine("模版图像轮廓与目标图像轮廓" + i + "的相似度: " + a0);
	if (a0 < comparison) // 轮廓与模版轮廓的相似度小于设定值,证明找到了
	{
		CvInvoke.DrawContours(dstMat, contoursTarget, i, new MCvScalar(0, 255, 0), 5);
	}
}

CvInvoke.Imshow("Final result image, " + dstMat.Size.ToString(), dstMat); // 显示最终结果 

3.运行结果

在这里插入图片描述
刚才对比精度是0.02,结果只找到了两个字母“A”,如果换成0.2呢,全部的“A”都会找到,包括颜色不一样的、大小不一样的、旋转的等等,如下所示:
在这里插入图片描述


原创不易,请勿抄袭。共同进步,相互学习。

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

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

相关文章

【机器学习】代价函数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Web应急响应

2024年护网将至&#xff0c;最近我将分享一些红蓝对抗的一些技巧&#xff0c;应急响应、信息收集相关的知识概念以及相关技巧。 目录 1. 黑客攻击流程 2. webshell流量特征 1.1.菜刀特征 1.2.冰蝎3.0 &#xff1a; 1.3.冰蝎2.0&#xff1a; 1.4.冰蝎3.11流量特征 1.5.蚁…

申请小程序https证书

背景&#xff1a;目前小程序在开发阶段是必须要使用SSL证书实现服务器https访问&#xff0c;在2017年12月30后http将无法调用微信公众平台接口&#xff0c;需要上线微信小程序的个人或企业&#xff0c;需要办理SSL证书&#xff0c;才能实现网站HTTPS化&#xff0c;让小程序顺利…

用python做一个终身免费的听书工具,一文搞定!!!

你好&#xff0c;小编有多年大厂经验&#xff0c;努力构建通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 一、前言 话说某天&#xff0c…

SCTNet 项目排坑

SCTNet 项目排坑 任务过程记录在旧环境下运行重配环境训练测试速度测试 任务 想跑一下最新的实时分割代码。由于这个项目也是基于mmsegmentation的&#xff0c;所以我想先看看之前那个环境是否能直接适配。不行&#xff0c;我再新建环境。 过程记录 在旧环境下运行 必要工作…

16-代码检查:如何进行静态代码检查?

在做Go项目开发的过程中&#xff0c;我们肯定需要对Go代码做静态代码检查。虽然Go命令提供了go vet和go tool vet&#xff0c; 今天我想给你介绍的golangci-lint&#xff0c;是目前使用最多&#xff0c;也最受欢迎的静态代码检查工具 接下来&#xff0c;我就从golangci-lint…

【数据结构】——树和二叉树相关概念(全网超级详解)

创作不易&#xff0c;家人们来一波三连吧&#xff1f;&#xff01; 前言 世界上最大的树--雪曼将军树&#xff0c;这棵参天大树不是最长也不是最宽&#xff0c;是不是很奇怪&#xff0c;大只是他的体积是最大的&#xff0c;看图片肯定是感触不深&#xff0c;大家可以自己去看…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日&#xff0c;Go语言正式成为开源编程语言家庭的一员。 Go语言&#xff08;或称Golang&#xff09;是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率&#xff0c;Go语言专门针对多处理器系统应用程序的编…

vue2项目安装(使用vue-cli脚手架)

使用npm安装 安装镜像&#xff08;使npm创建项目更快&#xff09;&#xff1a;镜像可更换 npm config set registry https://registry.npmmirror.com1.全局安装vue-cli&#xff08;一次&#xff09; npm install -g vue/cli 2. 查看vue-cli 版本 vue --version 3. 创建项目…

【Pytorch学习笔记(二)】张量的创建(补充)

一、知识回顾 我们在博客《张量的创建与访问》中已经讨论了一些张量的创建方法如torch.CharTensor()、torch.FloatTensor()以及torch.zeros()等张量创建方法&#xff0c;但由于其仅仅介绍了cpu版本torch下张量的创建方法和只有具体数据类型张量&#xff0c;本节内容旨在补充gp…

数字示波器

数字示波器 综述&#xff1a;本文讲述了数字示波器的电路组成。 一&#xff0e;定义 显示电信号波形的仪器 二&#xff0e;组成 由模拟前端处理电路、电源电路、单片机电路、控制电路、触发电路、校准电路组成。 1&#xff09;模拟前端处理电路 将输入的模拟信号处理后传…

2024中国医药企业项目管理大会将于7月在京召开

“创新是企业之魂”&#xff0c;对于医药企业来说药品创新研发能力很大程度上决定了公司核心竞争力和可持续发展能力。新药研发具有高投入、高成本、高风险、高收益、长周期等特点&#xff0c;从药物的发现研发到临床试验到获批生产上市销售是一个充满风险挑战的较为漫长历程&a…

判断点在多边形内的算法

在计算几何中&#xff0c;判定点是否在多边形内&#xff0c;是个非常有趣的问题。通常有两种方法&#xff1a; 一、Crossing Number&#xff08;交叉数&#xff09; 它计算从点P开始的射线穿过多边形边界的次数。当“交叉数”是偶数时&#xff0c;点在外面;当它是奇数时&…

基于8086毫秒数码管计时器仿真设计

**单片机设计介绍&#xff0c;基于8086毫秒数码管计时器仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086毫秒数码管计时器仿真设计概要主要关注于利用8086微处理器实现毫秒级别的计时功能&#xff0c;并通过数码管显示时间…

action method

package cn.hello01;import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionSupport;public class UserAction extends ActionSupport{//增加public String save(){System.out.println("保存");return Action.SUCCESS;}//删除public String …

RESTful的优点

优点 1.通过url对资源定位&#xff0c;语义清晰&#xff1b; 2.通过HTTP谓词表示不同的操作&#xff0c;接口自描述&#xff1b; 3.可以对GET、PUT、DELETE请求重试&#xff08;幂等的&#xff09;&#xff1b; 4.可以对GET请求做缓存&#xff1b; 5.通过HTTP状态码反映服务器端…

SQLite3进行数据库各项常用操作

目录 前言1、SQLite介绍2、通过SQLite创建一个数据库文件3、往数据库文件中插入数据4、数据库文件信息查询5、修改数据库中的内容6、删除数据库中的内容 前言 本文是通过轻量化数据库管理工具SQLite进行的基础操作和一些功能实现。 1、SQLite介绍 SQLite是一个广泛使用的嵌入…

Docker镜像构建

Docker镜像构建 1. docker commit 平常我们都是从公共仓库拉取镜像&#xff0c;我们也可以从容器中构建我们自己的镜像。 需求&#xff1a; 1. 基础镜像centos 2. 安装jdk 3. 安装nginx1.1 创建容器 # 拉取镜像 docker pull centos:7 # 创建容器 docker run -di --name ce…

鸿蒙实战开发-如何使用三方库

使用三方库 在使用三方库之前&#xff0c;需要安装 ohpm&#xff0c;并在环境变量中配置。 在项目目录的Terminal窗口执行ohpm命令下载依赖 ohpm install yunkss/eftool 命令运行成功后&#xff0c;在项目的oh-package.json5文件中会自动添加上依赖&#xff0c;如下所示&am…