Opencv中的直方图(5)计算EMD距离的函数EMD()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算两个加权点配置之间的“最小工作量”距离。
该函数计算地球搬运工距离(Earth Mover’s Distance)和/或两个加权点配置之间距离的下界。其中一个应用如文献 225和 226中所述,是在图像检索中进行多维直方图比较。EMD 是一个运输问题,使用某种修改的单纯形算法来求解,因此最坏情况下的复杂度是指数级的,不过平均而言它要快得多。在真实度量的情况下,下界甚至可以用线性时间算法更快地计算出来,并且它可以用来大致确定两个签名是否足够远,以至于它们不可能关联到同一个对象。
函数原型
float cv::EMD
(InputArray signature1,InputArray signature2, int distType,InputArray cost = noArray(),float * lowerBound = 0,OutputArray flow = noArray()
)
参数
- 参数signature1 第一个签名,一个大小为 size1 × dims + 1 的浮点矩阵。每一行存储点的权重后跟点的坐标。如果使用用户定义的成本矩阵,则允许该矩阵只有一列(仅权重)。权重必须是非负的,并且至少有一个非零值
- 参数signature2 第二个签名,格式与 signature1 相同,尽管行数可能不同。总权重可以不同。在这种情况下,会在 signature1 或 signature2 中添加一个额外的“虚拟”点。权重必须是非负的,并且至少有一个非零值。
- 参数distType 使用的度量。见 DistanceTypes
- 参数cost 用户定义的大小为 size1 × size2 的成本矩阵。另外,如果使用成本矩阵,则无法计算下界 lowerBound,因为它需要一个度量函数。
- 参数lowerBound 可选的输入/输出参数:两个签名之间的距离的下界,即质心之间的距离。如果使用用户定义的成本矩阵,点配置的总权重不相等,或者签名只包含权重(签名矩阵只有一列),则下界可能不会被计算。你必须初始化 lowerBound。如果计算得到的质心之间的距离大于或等于 lowerBound(这意味着签名之间的距离足够远),则函数不会计算 EMD。无论如何,返回时 lowerBound 都会被设置为计算得到的质心之间的距离。因此,如果你想同时计算质心之间的距离和 EMD,则应将 lowerBound 设置为 0。
- 参数flow 结果大小为 size1 × size2 的流矩阵:flow[i,j] 是从 signature1 的第 i 个点到 signature2 的第 j 个点的流。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 创建两个加权点配置cv::Mat signature1 = ( cv::Mat_< float >( 3, 2 ) << 100, 23, 12,13, 13, 11 ); // 权重和坐标cv::Mat signature2 = ( cv::Mat_< float >( 3, 2 ) << 3, 12, 12, 1, 21, 3 ); // 权重和坐标// 初始化参数int distType = cv::DIST_L2; // 使用 L2 距离cv::Mat flow; // 流矩阵float lowerBound = 0; // 下界// 计算 EMDfloat distance = cv::EMD( signature1, signature2, distType, cv::Mat(), &lowerBound, flow );std::cout << "The EMD distance between the two signatures is: " << distance << std::endl;std::cout << "The lower bound of the EMD distance is: " << lowerBound << std::endl;std::cout << "The flow matrix is: " << std::endl << flow << std::endl;return 0;
}
运行结果

相关文章:
Opencv中的直方图(5)计算EMD距离的函数EMD()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离(Earth Mover’s Distance)和/或两个加权点配…...
KDD 2024 时空数据(Spatio-temporal) ADS论文总结
2024 KDD( ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议)在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文,如有疏漏,欢迎大…...
uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址
安装jszip插件 npm install jszip 对应功能实现和逻辑处理: <script setup>import { onMounted, reactive, ref } from vueimport { onHide, onUnload } from dcloudio/uni-appimport JSZip from jsziplet videoSrc ref() // 视频地址// 创建JSZip实例con…...
探索 Zed 编辑器:速度与协作的巅峰之作
Zed 是一款备受瞩目的代码编辑器,专为现代开发者打造。本文将深入介绍 Zed 的独特优势,以及如何快速上手使用这款编辑器,助你在编程工作中大幅提升效率。 一:Zed 编辑器的优势 Zed 是近年来崭露头角的一款代码编辑器,迅速赢得了众多开发者的青睐。以下是 Zed 的几大核心优…...
文心快码前端工程师观点分享:人机协同新模式的探索之路(三)
本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上,从一款文心快码(Baidu Comate)前端工程师的角度,分享了关于智能研发工具本身的研…...
Qt基础类03-直线类QLine
Qt基础类03-直线类QLine 摘要基本信息成员函数程序全貌QLine::QLine()QLine::QLine(const QPoint &p1, const QPoint &p2)QLine::QLine(int x1, int y1, int x2, int y2)QPoint QLine::p1() constQPoint QLine::p2() constint QLine::x1() constint QLine::x2() consti…...
集成电路学习:什么是ARM先进精简指令集计算机
ARM:先进精简指令集计算机 ARM先进精简指令集计算机(Advanced RISC Machine,简称ARM)是一种基于精简指令集计算机(RISC)原则的计算机处理器架构,由英国的ARM公司开发。这种架构以其低功耗和高性…...
设计模式-行为型模式-迭代器模式
1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法,而不需要暴露该对象的内部细节; 在软件系统中,容器对象有两个职责:一是存储数据,二是遍历数据;从依赖性上看,前者…...
FRP代理(QUIC通信)实验
访问关系与TCP实验相同,配置不一样 服务端配置 客户端配置 通信数据...
项目依赖拉不下来卡着不动怎么办,node又不支持cnpm
如果你的项目依赖在拉取时卡住,可以尝试以下步骤来解决问题: 检查网络:确保你的网络连接稳定。如果可能,尝试使用 VPN 或更换网络。 使用镜像源: 对于 yarn,可以使用淘宝镜像: yarn confi…...
ansible--role
简介 roles是ansible,playbooks的目录的组织结构,将代码或文件进行模块化,成为roles的文件目录组织结构。 易读,代码可冲哟美好,层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…...
SpinalHDL之数据类型(一)
本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你…...
Ansys Zemax | 什么是Sobol取样?
附件下载 联系工作人员获取附件 本文主要介绍了: 什么是Sobol取样? 和随机光线产生方法相比,Sobol取样有什么优点? Sobol取样有什么限制? 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…...
Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】
Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 目录 Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现案例热更】 一、简单介绍 二、YooAsset 引…...
vue3写一个无限树形菜单,递归组件
原本使用element plus的el-tree,可是他的UI不匹配,狠难改成自己想要的,所以只能自己去写一个,做法:使用递归组件 效果 组件代码itemDir.vue // itemDir.vue<template><div><ul v-for"node in li…...
3D建模主要使用哪些软件?有什么特点?
3D建模主要使用的软件多种多样,每种软件都有其独特的优势和适用领域。以下是一些主流的3D建模软件: 1. Autodesk 3ds Max 概述:3ds Max是一款功能丰富的建模和动画软件,广泛用于电影、游戏和虚拟现实等领域。 特点:…...
Android Studio 加载多个FLutter项目
按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录,只选择主目录,下面的文件不要选 添加完成,点击ok后,会进行导入 最终导入成功...
SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座
数字化办公时代,企业升级 IT 基础设施,已不再是选择题,而是必答题。 数字化办公时代,企业为何要升级 IT 基础设施? 随着时代变化与科技进步,人们的工作方式也发生了巨大变化。如今,远程办公、全…...
l超市售货管理系统小程序的设计
管理员账户功能包括:系统首页,个人中心,会员管理,供应商信息管理,商品管理,出入库管理,公告管理,轮播图信息 微信端账号功能包括:系统首页,公告,…...
systemverilog、verilog的部分常用内部函数
1. $ceil 作用:将给定的实数或浮点数向上取整。示例:$ceil(3.2) 返回 4。 2. $floor 作用:将给定的实数或浮点数向下取整。示例:$floor(3.9) 返回 3。 3. $value$plusargs 作用:从命令行读取传递给仿真器的参数。…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
