opencv 基础54-利用形状场景算法比较轮廓-cv2.createShapeContextDistanceExtractor()
注意:新版本的opencv 4 已经没有这个函数 cv2.createShapeContextDistanceExtractor()
形状场景算法是一种用于比较轮廓或形状的方法。这种算法通常用于计算两个形状之间的相似性或差异性,以及找到最佳的匹配方式。
下面是一种基本的比较轮廓的流程,使用了形状场景算法:
-
数据准备: 首先,你需要准备两个形状的轮廓数据。轮廓可以表示为一系列的点坐标,或者更高级的表示方法,比如参数化的曲线等。
-
特征提取: 对于每个形状,你可以使用形状描述符或特征提取算法,将轮廓数据转化为一组能够表征形状的数值特征。这些特征可以是形状的曲率、长度、角度等等。
-
相似性度量: 选择一个相似性度量方法来比较两个形状的特征。常见的方法包括欧氏距离、曼哈顿距离、余弦相似度等。这些度量方法将两个形状的特征转化为一个相似性分数,分数越高表示形状越相似。
-
匹配与优化: 如果你想要找到最佳的形状匹配,可以使用优化算法来调整一个形状以使其与另一个形状更加相似。这可能涉及到形状的缩放、旋转、平移等变换。
-
可视化与解释: 最后,你可以可视化两个形状,展示它们的相似性以及在匹配过程中发生的变化。这可以通过绘制形状、展示变换等方式来实现。
需要注意的是,形状场景算法的选择取决于你所处理的具体问题和数据。不同的算法可能在不同的场景下表现更佳。一些常用的形状比较算法包括基于轮廓匹配的方法(如Frechet距离、Hausdorff距离)、基于特征的方法(如傅里叶描述符、轮廓矢量化等)、基于统计的方法(如Procrustes分析)等。
最终,选择适合你问题需求的方法,并根据实际情况进行调整和优化,以得到准确的形状比较结果。
利用形状场景算法比较轮廓与Hu 矩的区别
形状场景算法和Hu矩都是用于比较轮廓或形状的方法,但它们基于不同的原理和特征表示。
下面是它们之间的区别:
1. 原理和特征表示:
-
形状场景算法: 形状场景算法基于整个形状的轮廓信息,通常通过提取一系列特征点的坐标来表示轮廓,然后计算这些特征点之间的几何关系、曲率等信息。这些算法可以比较两个形状之间的形状变化、缩放、旋转等变换。
-
Hu矩: Hu矩是一组与形状相关的不变矩,用于描述对象的整体形状特征。它们通过对轮廓的几何矩进行变换和归一化得到。Hu矩是一种用于表示形状的紧凑形式,能够在一定程度上保持形状的平移、旋转和缩放不变性。
2. 不变性:
-
形状场景算法: 形状场景算法通常对形状的几何变换比较敏感,因此可能需要进行额外的处理来考虑形状的平移、旋转和缩放等变换。
-
Hu矩: Hu矩被设计用于保持一定的形状不变性,它们对于平移、旋转和缩放都具有一定程度的不变性。这使得Hu矩在某些形状匹配和识别任务中非常有用。
3. 适用领域:
-
形状场景算法: 形状场景算法适用于需要考虑形状变换以及局部特征的情况。例如,可以用于比较两个形状的整体结构和曲率变化。
-
Hu矩: Hu矩适用于需要保持形状不变性的场景,例如对象识别、图像检索等。它们能够在一定程度上解决形状的旋转、平移和缩放变化对比较造成的影响。
OpenCV 提供了使用“距离”作为形状比较的度量标准。这是因为形状之间的差异值和距离有相似之处,比如二者都只能是零或者正数,又比如当两个形状一模一样时距离值和差值都等于零。
OpenCV 提供了函数 cv2.createShapeContextDistanceExtractor(),用于计算形状场景距离。
其使用的“形状上下文算法”在计算距离时,在每个点上附加一个“形状上下文”描述符,让每个点都能够捕获剩余点相对于它的分布特征,从而提供全局鉴别特征。
函数 cv2.createShapeContextDistanceExtractor()的语法格式为:
retval = cv2.createShapeContextDistanceExtractor( [, nAngularBins[,
nRadialBins[, innerRadius[, outerRadius[, iterations[, comparer[,
transformer]]]]]]] )
式中的返回值为 retval,返回结果。
该结果可以通过函数 cv2.ShapeDistanceExtractor.computeDistance()计算两个不同形状之间的距离。此函数的语法格式为:
retval=cv2.ShapeDistanceExtractor.computeDistance(contour1, contour2)
式中,coutour1 和 coutour2 是不同的轮廓。
函数 cv2.createShapeContextDistanceExtractor()的参数都是可选参数:
- nAngularBins:为形状匹配中使用的形状上下文描述符建立的角容器的数量。
- nRadialBins:为形状匹配中使用的形状上下文描述符建立的径向容器的数量。
- innerRadius:形状上下文描述符的内半径。
- outerRadius:形状上下文描述符的外半径。
- iterations:迭代次数。
- comparer:直方图代价提取算子。该函数使用了直方图代价提取仿函数,可以直接采用
直方图代价提取仿函数的算子作为参数。 - transformer:形状变换参数。
示例:使用函数 cv2.createShapeContextDistanceExtractor()计算形状场景距离。
import cv2
#-----------原始图像 o1 的边缘--------------------
o1 = cv2.imread('cs.bmp')
cv2.imshow("original1",o1)
gray1 = cv2.cvtColor(o1,cv2.COLOR_BGR2GRAY)
ret, binary1 = cv2.threshold(gray1,127,255,cv2.THRESH_BINARY)
contours1, hierarchy = cv2.findContours(binary1,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)cnt1 = contours1[0]
#-----------原始图像 o2 的边缘--------------------
o2 = cv2.imread('cs3.bmp')
cv2.imshow("original2",o2)
gray2 = cv2.cvtColor(o2,cv2.COLOR_BGR2GRAY)
ret, binary2 = cv2.threshold(gray2,127,255,cv2.THRESH_BINARY)
contours2, hierarchy = cv2.findContours(binary2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)cnt2 = contours2[0]
#-----------原始图像 o3 的边缘--------------------
o3 = cv2.imread('hand.bmp')
cv2.imshow("original3",o3)
gray3 = cv2.cvtColor(o3,cv2.COLOR_BGR2GRAY)
ret, binary3 = cv2.threshold(gray3,127,255,cv2.THRESH_BINARY)
contours3, hierarchy = cv2.findContours(binary3,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
cnt3 = contours3[0]#-----------构造距离提取算子--------------------
sd = cv2.createShapeContextDistanceExtractor()#-----------计算距离--------------------
d1 = sd.matchShapes(cnt1,cnt1)
print("与自身的距离 d1=", d1)
d2 = sd.matchShapes(cnt1,cnt2)
print("与旋转缩放后的自身图像的距离 d2=", d2)
d3 = sd.matchShapes(cnt1,cnt3)
print("与不相似对象的距离 d3=", d3)cv2.waitKey()
cv2.destroyAllWindows()
运行后报错:

相关文章:
opencv 基础54-利用形状场景算法比较轮廓-cv2.createShapeContextDistanceExtractor()
注意:新版本的opencv 4 已经没有这个函数 cv2.createShapeContextDistanceExtractor() 形状场景算法是一种用于比较轮廓或形状的方法。这种算法通常用于计算两个形状之间的相似性或差异性,以及找到最佳的匹配方式。 下面是一种基本的比较轮廓的流程&…...
分布式系统理论
以前的架构...
Gartner发布2023年的存储技术成熟曲线
技术路线说明 Gartner自1995年起开始采用技术成熟度曲线,它描述创新的典型发展过程,即从过热期发展到幻灭低谷期,再到人们最终理解创新在市场或领域内的意义和角色。 一项技术 (或相关创新)在发展到最终成熟期的过程中经历多个阶段࿱…...
c++ 有元
友元分为两部分内容 友元函数友元类 友元函数 问题:当我们尝试去重载operator<<,然后发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。…...
安卓:网络框架okhttp
目录 一、okhttp介绍 1. OkHttpClient类: 常用方法: 2. Request类: 常用方法: 3. Response类: 常用方法: 4. Call类: 常用方法: 5. Interceptor接口: 常用方法&…...
Python爬虫 爬取图片
在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。 我们最常规的做法就是通过鼠标右键,选择另存为。但有些图片鼠标右键的时候并没…...
【云原生】Pod详讲
目录 一、Pod基础概念1.1//在Kubrenetes集群中Pod有如下两种使用方式:1.2pause容器使得Pod中的所有容器可以共享两种资源:网络和存储。1.3kubernetes中的pause容器主要为每个容器提供以下功能:1.4Kubernetes设计这样的Pod概念和特殊组成结构有…...
先进先出的队
文章目录 队列特点队列实现 队列特点 先进先出,后进后出 队列实现 queue.c#define _CRT_SECURE_NO_WARNINGS 1 #include"Queue.h" //初始化 void QueInit(Queue* pq) {assert(pq);pq->head NULL;pq->tail NULL;pq->size 0; } //入队&#…...
怎样学会单片机
0、学单片机首先要明白,一个单片机啥也干不了,学单片机的目的是学习怎么用单片机驱动外部设备,比如数码管,电机,液晶屏等,这个需要外围电路的配合,所以学习单片机在这个层面上可以等同为学习单片…...
数据结构笔记--常见二叉树分类及判断实现
目录 1--搜索二叉树 2--完全二叉树 3--平衡二叉树 4--满二叉树 1--搜索二叉树 搜索二叉树的性质:左子树的节点值都比根节点小,右子树的节点值都比根节点大; 如何判断一颗二叉树是搜索二叉树? 主要思路: 递归自底向…...
docker小白第二天
centos上安装docker docker官网,docker官网,找到下图中的doc文档。 进入如下页面 选中manuals,安装docker引擎。 最终centos下的docker安装文档链接:安装文档链接. 具体安装步骤: 1、打开Centos,输入命…...
【变形金刚03】使用 Pytorch 开始构建transformer
一、说明 在本教程中,我们将使用 PyTorch 从头开始构建一个基本的转换器模型。Vaswani等人在论文“注意力是你所需要的一切”中引入的Transformer模型是一种深度学习架构,专为序列到序列任务而设计,例如机器翻译和文本摘要。它基于自我注意机…...
「Web3大厂」价值70亿美元的核心竞争力
经过近 5 年的研发和酝酿,Linea 团队在 7 月的巴黎 ETHCC 大会期间宣布了主网 Alpha 的上线,引起了社区的广泛关注。截止 8 月 4 日,据 Dune 数据信息显示,其主网在一周内就涌入了 100 多个生态项目,跨入了超 2 万枚 E…...
前端发送请求和后端springboot接受参数
0.xhr、 ajax、axios、promise和async/await 和http基本方法 xhr、 ajax、axios、promise和async/await都是异步编程和网络请求相关的概念和技术! xhr:XMLHttpRequest是浏览器提供的js对象(API),用于请求服务器资源。…...
程序一直在阿里云服务器运行
保持阿里云服务器开机程序保持运行. 1.下载Screen CentOS 系列系统: yum install screen Ubuntu 系列系统: sudo apt-get install screen 2、运行screen,创建一个screen screen -S name:name是标记进程, 给进程备注…...
Linux 文件与目录管理
nvLinux 文件与目录管理 我们知道 Linux 的目录结构为树状结构,最顶级的目录为根目录 /。 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。 在开始本教程前我们需要先知道什么是绝对路径与相对路径。 绝对路径: 路径的写…...
【CSS】CSS 布局——弹性盒子
Flexbox 是一种强大的布局系统,旨在更轻松地使用 CSS 创建复杂的布局。 它特别适用于构建响应式设计和在容器内分配空间,即使项目的大小是未知的或动态的。Flexbox 通常用于将元素排列成一行或一列,并提供一组属性来控制 flex 容器内的项目行…...
“华为杯”研究生数学建模竞赛2018年-【华为杯】B题:光传送网建模与价值评估(附优秀论文及matlab代码实现)
目录 摘要: 1.问题重述 1.1 问题背景 1.2 问题提出 2.问题假设 3.符号说明...
群晖 nas 自建 ntfy 通知服务(梦寐以求)
目录 一、什么是 ntfy ? 二、在群晖nas上部署ntfy 1. 在Docker中安装ntfy 2. 设置ntfy工作文件夹 3. 启动部署在 docker 中的 ntfy(binwiederhier/ntfy) 三、启动配置好后,如何使用ntfy 1. 添加订阅主题( Subscribe to topic…...
Java基础练习九(方法)
求和 设计一个方法,用于计算整数的和 public class Work1101 {public static void main(String[] args) {// 设计一个方法,用于计算整数的和System.out.println(sum(7, 6));}public static int sum(int a, int b) {return a b;} }阶乘 编写一个方法&…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
