OpenCV计算形状之间的相似度ShapeContextDistanceExtractor类的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

1.功能描述

ShapeContextDistanceExtractor是OpenCV库中的一个类,主要用于计算形状之间的相似度或距离。它是基于形状上下文(Shape Context)特征描述符的,这是一种在计算机视觉和图像处理领域广泛使用的形状匹配技术。该方法由Belongie等人在2000年代初提出,通过分析形状边界点的邻域分布来描述形状特征,进而计算形状间的相似度。

2.使用场景

形状匹配:在图像数据库中查找相似的形状或对象。
物体识别:作为特征提取的一部分,辅助分类或识别任务。
内容基于的图像检索:根据形状内容搜索图像。

3.函数computeDistance

计算由其轮廓定义的两个形状之间的形状距离,首先提取每个轮廓的关键点及其邻域信息,然后通过比较不同轮廓间对应关键点的邻域分布差异来量化形状间的距离。

3.1函数原型


virtual float cv::ShapeDistanceExtractor::computeDistance	(
InputArray 	contour1,
InputArray 	contour2 
)		

3.2 参数

  • 参数contour1 定义第一个形状的轮廓.
  • 参数contour2 定义第二个形状的轮廓…

4 示例代码

#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/shape.hpp"#include <iostream>
#include <opencv2/core/utility.hpp>
#include <string>
using namespace std;
using namespace cv;static vector< Point > simpleContour( const Mat& currentQuery, int n = 300 )
{vector< vector< Point > > _contoursQuery;vector< Point > contoursQuery;findContours( currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE );for ( size_t border = 0; border < _contoursQuery.size(); border++ ){for ( size_t p = 0; p < _contoursQuery[ border ].size(); p++ ){contoursQuery.push_back( _contoursQuery[ border ][ p ] );}}// In case actual number of points is less than nint dummy = 0;for ( int add = ( int )contoursQuery.size() - 1; add < n; add++ ){contoursQuery.push_back( contoursQuery[ dummy++ ] );  // adding dummy values}// 均匀采样cv::randShuffle( contoursQuery );vector< Point > cont;for ( int i = 0; i < n; i++ ){cont.push_back( contoursQuery[ i ] );}return cont;
}
int main( int argc, char** argv )
{string path = "/media/dingxin/data/study/OpenCV/sources/images/shape/";cv::Ptr< cv::ShapeContextDistanceExtractor > mysc = cv::createShapeContextDistanceExtractor();Size sz2Sh( 300, 300 );stringstream queryName;int indexQuery = 1;queryName << path << indexQuery << ".jpg";Mat query = imread( queryName.str(), IMREAD_GRAYSCALE );Mat queryToShow;resize( query, queryToShow, sz2Sh, 0, 0, INTER_LINEAR_EXACT );imshow( "QUERY", queryToShow );moveWindow( "TEST", 0, 0 );vector< Point > contQuery = simpleContour( query );int bestMatch             = 0;float bestDis             = FLT_MAX;for ( int ii = 1; ii <= 4; ii++ ){if ( ii == indexQuery )continue;waitKey( 30 );stringstream iiname;iiname << path << ii << ".jpg";cout << "name: " << iiname.str() << endl;Mat iiIm = imread( iiname.str(), 0 );Mat iiToShow;resize( iiIm, iiToShow, sz2Sh, 0, 0, INTER_LINEAR_EXACT );imshow( "TEST", iiToShow );moveWindow( "TEST", sz2Sh.width + 50, 0 );vector< Point > contii = simpleContour( iiIm );float dis              = mysc->computeDistance( contQuery, contii );//获取匹配度最佳的id和匹配距离值if ( dis < bestDis ){bestMatch = ii;bestDis   = dis;}std::cout << " distance between " << queryName.str() << " and " << iiname.str() << " is: " << dis << std::endl;}destroyWindow( "TEST" );stringstream bestname;bestname << path << bestMatch << ".jpg";Mat iiIm = imread( bestname.str(), 0 );Mat bestToShow;resize( iiIm, bestToShow, sz2Sh, 0, 0, INTER_LINEAR_EXACT );imshow( "BEST MATCH", bestToShow );moveWindow( "BEST MATCH", sz2Sh.width + 50, 0 );waitKey();return 0;
}

运行结果

我一共选了4张图,拿第一张图跟其他三张图比较,看哪个图跟第一张图里的足球形状匹配的最好。四张图如下:

运行结果:
在这里插入图片描述
命令行输出结果:
在这里插入图片描述

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

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

相关文章

OpenStack云平台管理

OpenStack云平台管理 文章目录 OpenStack云平台管理资源列表基础环境一、部署Openstack二、创建网络和路由2.1、删除默认的网络2.2、创建网络和路由2.2.1、创建外部网络2.2.2、创建内部网络 2.3、创建路由 三、创建实例3.1、配置实例3.2、配置NAT转换 四、绑定浮动IP地址五、添…

C# WinForm —— 34 ToolStrip 工具栏 介绍

1. 简介 工具栏 ToolStrip&#xff0c;一般紧贴在菜单栏下面 2. 属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到Enabled控件是否启用Dock定义要绑定到容器的控件边框&#xff0c;默认是topAnchor定义某个控件绑定到的容器的边缘。当控件锚定到某个边缘时&a…

分类模型:MATLAB判别分析

1. 判别分析简介 判别分析&#xff08;Discriminant Analysis&#xff09; 是一种统计方法&#xff0c;用于在已知分类的样本中构建分类器&#xff0c;并根据特征变量对未知类别的样本进行分类。常见的判别分析方法包括线性判别分析&#xff08;Linear Discriminant Analysis, …

韩顺平0基础学java——第22天

p441-459 异常exception 选中代码块&#xff0c;快捷键ctraltt6&#xff0c;即trt-catch 如果进行了异常处理&#xff0c;那么即使出现了异常&#xff0c;但是会继续执行 程序过程中发生的异常事件分为两大类&#xff1a; 异常体系图※ 常见的运行异常&#xff1a;类型转换…

EFuse概念解析

EFuse概念解析 EFUSE Key Parameter iNOM 代表的是&#xff0c;Efuse运行时候的电流 tNOM 代表的是&#xff0c;Efuse电流与时间的曲线 INOM通过VOC_Thrs设置 VOC_THRS VOC_THRS/Rsense Vsense采样小于VOC_THRS时候不动作 Vsense采样大于VOC_THRS时候根据Efuse_I2T曲线来…

平时的财经日历会影响黄金现货走势吗?

现货黄金的价格走势会受到诸多因素的影响&#xff0c;比如在财经日历上&#xff0c;美国的非农就业报告、GDP、利率公告、通胀数据等新闻和经济公告&#xff0c;都可能会对市场产生重大影响&#xff0c;尤其是当这些数据与市场预期不符的时候。所以比起单纯地进行技术分析和图表…

【C++ | 移动构造函数】一文了解C++11的 移动构造函数

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-12 2…

Linux基础IO【II】真的很详细

目录 一.文件描述符 1.重新理解文件 1.推论 2.证明 2.理解文件描述符 1.文件描述符的分配规则 3.如何理解文件操作的本质&#xff1f; 4.输入重定向和输出重定向 1.原理 2.代码实现重定向 3.dup函数 ​编辑 4.命令行中实现重定向 二.关于缓冲区 1.现象 …

【学习笔记】Linux

Linux 1、 介绍 1.1、概述 1.2、特点 1.3、Linux的发行版2、 基础篇 —— 文件系统 2.1、文件系统 2.2、目录结构3、 基础篇 —— VI/VIM 编辑器 3.1、概述 3.2、编辑器模式及常用命令4、 基础篇 —— 网络配置 4.1、VMware NetWork …

电路笔记 : 嘉立创EDA 导入、查找、设计管理器(快速寻找网络标签)功能+DRC错误检查和处理

导入功能 查找功能 可查找多种类型&#xff0c;如原件名称、网络标签等 设计管理器 图层查看 DRC错误 规则设置 线距问题 大多数PCB制造商能够可靠地生产5 mil间距的走线和间隙。这是一个常见的标准&#xff0c;适合大多数消费级和工业级电子产品。在5 mil以上的间距&#xff…

Android APP memory统计方法

目录 进程的内存信息概述 关键的术语 测试步骤 测试步骤 数据处理 数据分析&#xff1a; 进程内存信息 Dumpsys meminfo -a PID Procrank Procmem PID 特殊内存信息 Mali ION(multi-media&#xff0c;gralloc) 进程地址空间信息 /proc/pid/smaps Showmap PID …

计算机网络 —— 运输层(TCP三次握手)

计算机网络 —— 运输层&#xff08;TCP三次握手&#xff09; 三次握手第一次握手第二次握手第三次握手两次握手行不行&#xff1f; 我们今天来学习TCP的三次握手&#xff1a; 三次握手 TCP三次握手是TCP协议中建立连接的过程&#xff0c;旨在确保双方准备好进行可靠的通信。…

【HarmonyOS】鸿蒙入门学习

一、开发前的准备 &#xff08;一&#xff09;HarmonyOS 开发套件介绍 &#xff08;二&#xff09;开发者主要使用的核心套件 主要为代码开发阶段会使用到的 DevEco Studio、ArkTS、ArkUI三个工具。 &#xff08;三&#xff09;熟悉鸿蒙官网 1、网址 https://developer.hua…

第P10周:Pytorch实现车牌识别

第P10周&#xff1a;Pytorch实现车牌识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在之前的案例中&#xff0c;我们多是使用datasets.ImageFolder函数直接导入已经分类好的数据集形成Dataset&#xff…

创建节约机关怎样向媒体投稿报道宣传?

创建节约机关并向媒体投稿报道宣传是一项重要的工作&#xff0c;它不仅能够提升机关的形象&#xff0c;还能促进社会各界对节约型社会的认识和支持。 作为一名新晋信息宣传员,初入职场的我满腔热血,怀揣着用文字传递价值的理想,却在投稿的道路上屡遭波折。面对每月的宣传任务,我…

自动控制原理【期末复习】(二)

无人机上桨之后可以在调试架上先调试&#xff1a; 1.根轨迹的绘制 /// 前面针对的是时域分析&#xff0c;下面针对频域分析&#xff1a; 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度

飞腾派初体验(2)

水个字数&#xff0c;混个推广分&#xff0c;另外几个点还是想吐槽一下 - 1&#xff0c;上篇文章居然没有给开发板一个硬照&#xff0c;补上 - 飞腾派 自拍 2. 现在做镜像用Win32DiskImager的多吗&#xff1f;我记得当年都是dd命令搞定&#xff0c;玩树莓派的应该记得这个命令…

linuxcentos将本地库JAR/arr批量导入到Nexus3.x

背景 我们现在要搞一个私服maven来管理对应的依赖包&#xff0c;需要上传包。用nexus只能单个文件搞&#xff0c;批量导入不行&#xff0c;而且还要单独配置groupID什么的。不多BB,上教程 建脚本 vi mavenimport.sh内容是这个 #!/bin/bash # copy and run this script to t…

6.13--CSS

行内样式 <!DOCTYPE html> <html lang"en"> <head> <title>This is title</title> </head> <body> <p style"font-size: 16px; color: red;">大家好</p> </body> </html> 内部样式表…

piRNA-疾病研究最新综述 – 数据库、软件工具、webserver和计算模型

piRNA被世界顶尖科学期刊《Science》评为2006年年度十大科学突破之一。之后有关piRNA的研究也成为CNS文章的常客。 2022年6月7日发表在Briefings in Bioinformatics上的这篇综述为我们整理了39个piRNA特异性和非特异性数据库及生物信息学资源&#xff1b;并根据piRNA的功能&…