【Emgu CV教程】10.13、利用形状场景算法比较轮廓

2024-04-08 11:20

本文主要是介绍【Emgu CV教程】10.13、利用形状场景算法比较轮廓,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、演示
    • 1.原始素材
    • 2.代码
    • 3.运行结果


形状场景算法比较轮廓,要引用Emgu.CV.Shape,定义检测器ShapeContextDistanceExtractor,然后对两个轮廓进行比较,得出结果。

一、演示

1.原始素材

原始图像srcMat1如下图:
在这里插入图片描述
待比较的图像srcMat2如下图:
在这里插入图片描述

2.代码

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

Mat tempMat1 = srcMat1.Clone();
Mat tempMat2 = srcMat2.Clone();
Mat gray1 = new Mat();
Mat gray2 = new Mat();// 二值化图片1,确保黑里面找白
CvInvoke.CvtColor(tempMat1, gray1, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(gray1, gray1, 50, 255, ThresholdType.Binary);
VectorOfVectorOfPoint contours1 = new VectorOfVectorOfPoint();
VectorOfRect hierarchy1 = new VectorOfRect();
CvInvoke.FindContours(gray1, contours1, hierarchy1, RetrType.External, ChainApproxMethod.ChainApproxNone);
Mat contourMat1 = new Mat(new System.Drawing.Size(gray1.Cols, gray1.Rows), DepthType.Cv8U, 1);
contourMat1.SetTo(new MCvScalar(0, 0, 0));// 按照面积筛选,太小的轮廓不计算
Dictionary<int, double> dict1 = new Dictionary<int, double>();
if (contours1.Size > 0)
{for (int i = 0; i < contours1.Size; i++){double area = CvInvoke.ContourArea(contours1[i]);Rectangle rect = CvInvoke.BoundingRectangle(contours1[i]);if (rect.Width > 2 && rect.Height > 2 && area < 3000000){dict1.Add(i, area);}}
}// 二值化图片2,确保黑里面找白
CvInvoke.CvtColor(tempMat2, gray2, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(gray2, gray2, 50, 255, ThresholdType.Binary);
VectorOfVectorOfPoint contours2 = new VectorOfVectorOfPoint();
VectorOfRect hierarchy2 = new VectorOfRect();
CvInvoke.FindContours(gray2, contours2, hierarchy2, RetrType.External, ChainApproxMethod.ChainApproxNone);
Mat contourMat2 = new Mat(new System.Drawing.Size(gray1.Cols, gray1.Rows), DepthType.Cv8U, 1);
contourMat2.SetTo(new MCvScalar(0, 0, 0));// 按照面积筛选,太小的轮廓不计算
Dictionary<int, double> dict2 = new Dictionary<int, double>();
if (contours2.Size > 0)
{for (int i = 0; i < contours2.Size; i++){double area = CvInvoke.ContourArea(contours2[i]);Rectangle rect = CvInvoke.BoundingRectangle(contours2[i]);if (rect.Width > 2 && rect.Height > 2 && area < 3000000){dict2.Add(i, area);}}
}// 排序,取最大的轮廓再判断
IOrderedEnumerable<KeyValuePair<int, double>> descendingDict1 = dict1.OrderByDescending(x => x.Value);
IOrderedEnumerable<KeyValuePair<int, double>> descendingDict2 = dict2.OrderByDescending(x => x.Value);
using (HistogramCostExtractor comparer = new ChiHistogramCostExtractor())
using (ThinPlateSplineShapeTransformer transformer = new ThinPlateSplineShapeTransformer())
using (ShapeContextDistanceExtractor extractor = new ShapeContextDistanceExtractor(comparer, transformer))
{CvInvoke.DrawContours(contourMat1, contours1, descendingDict1.First().Key, new MCvScalar(255, 255, 255), 1);CvInvoke.DrawContours(contourMat2, contours2, descendingDict2.First().Key, new MCvScalar(255, 255, 255), 1);float distance = extractor.ComputeDistance(contours1[descendingDict1.First().Key], contours2[descendingDict2.First().Key]);MessageBox.Show("形状场景距离是:" + distance);
}

3.运行结果

利用extractor.ComputeDistance()函数计算出的形状场景距离是:0.1476557

在这里插入图片描述
如果srcMat2采用和srcMat1相同的图形,计算出的形状场景距离是:0.000375
在这里插入图片描述
因此记住它的特点:使用“距离”作为形状比较的度量标准,距离越小相似度越高


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

这篇关于【Emgu CV教程】10.13、利用形状场景算法比较轮廓的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/885443

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各