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;} }阶乘 编写一个方法&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
