当前位置: 首页 > news >正文

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()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离&#xff08;Earth Mover’s Distance&#xff09;和/或两个加权点配…...

KDD 2024 时空数据(Spatio-temporal) ADS论文总结

2024 KDD&#xff08; ACM SIGKDD Conference on Knowledge Discovery and Data Mining, 知识发现和数据挖掘会议&#xff09;在2024年8月25日-29日在西班牙巴塞罗那举行。 本文总结了KDD2024有关时空数据(Spatial-temporal) 的相关论文&#xff0c;如有疏漏&#xff0c;欢迎大…...

uniapp+vue3实现小程序和h5解压线上压缩包以及如何访问解压后的视频地址

安装jszip插件 npm install jszip 对应功能实现和逻辑处理&#xff1a; <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 的几大核心优…...

文心快码前端工程师观点分享:人机协同新模式的探索之路(三)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…...

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&#xff1a;先进精简指令集计算机 ARM先进精简指令集计算机&#xff08;Advanced RISC Machine&#xff0c;简称ARM&#xff09;是一种基于精简指令集计算机&#xff08;RISC&#xff09;原则的计算机处理器架构&#xff0c;由英国的ARM公司开发。这种架构以其低功耗和高性…...

设计模式-行为型模式-迭代器模式

1.迭代器模式的定义 迭代器模式提供一种对容器对象中的各个元素进行访问的方法&#xff0c;而不需要暴露该对象的内部细节&#xff1b; 在软件系统中&#xff0c;容器对象有两个职责&#xff1a;一是存储数据&#xff0c;二是遍历数据&#xff1b;从依赖性上看&#xff0c;前者…...

FRP代理(QUIC通信)实验

访问关系与TCP实验相同&#xff0c;配置不一样 服务端配置 客户端配置 通信数据...

项目依赖拉不下来卡着不动怎么办,node又不支持cnpm

如果你的项目依赖在拉取时卡住&#xff0c;可以尝试以下步骤来解决问题&#xff1a; 检查网络&#xff1a;确保你的网络连接稳定。如果可能&#xff0c;尝试使用 VPN 或更换网络。 使用镜像源&#xff1a; 对于 yarn&#xff0c;可以使用淘宝镜像&#xff1a; yarn confi…...

ansible--role

简介 roles是ansible&#xff0c;playbooks的目录的组织结构&#xff0c;将代码或文件进行模块化&#xff0c;成为roles的文件目录组织结构。 易读&#xff0c;代码可冲哟美好&#xff0c;层次清晰 目录机构 mkdir roles/nginx/{files,handlers,tasks,templates,vars} -ptou…...

SpinalHDL之数据类型(一)

本文作为SpinalHDL学习笔记第五十四篇,介绍SpinalHDL的Bool数据类型。 SpinalHDL技术交流QQ群: Note: 1.本群是个人技术交流群,不是什么官方答疑群; 2.提问是你的权利,但回答不是别人的义务; 3.可以潜水,不能灌水; 4.请文明交流,做这行的都算高层次人才,希望你…...

Ansys Zemax | 什么是Sobol取样?

附件下载 联系工作人员获取附件 本文主要介绍了&#xff1a; 什么是Sobol取样&#xff1f; 和随机光线产生方法相比&#xff0c;Sobol取样有什么优点&#xff1f; Sobol取样有什么限制&#xff1f; 随机取样和Sobol取样模式 一个光源会在位置空间以及角度空间随机产生光…...

Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统,并 【Android 端简单实现·案例热更】

Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统&#xff0c;并 【Android 端简单实现案例热更】 目录 Unity 热更 之 【YooAsset 热更】Unity 可以进行热更的资源管理系统&#xff0c;并 【Android 端简单实现案例热更】 一、简单介绍 二、YooAsset 引…...

vue3写一个无限树形菜单,递归组件

原本使用element plus的el-tree&#xff0c;可是他的UI不匹配&#xff0c;狠难改成自己想要的&#xff0c;所以只能自己去写一个&#xff0c;做法&#xff1a;使用递归组件 效果 组件代码itemDir.vue // itemDir.vue<template><div><ul v-for"node in li…...

3D建模主要使用哪些软件?有什么特点?

3D建模主要使用的软件多种多样&#xff0c;每种软件都有其独特的优势和适用领域。以下是一些主流的3D建模软件&#xff1a; 1. Autodesk 3ds Max 概述&#xff1a;3ds Max是一款功能丰富的建模和动画软件&#xff0c;广泛用于电影、游戏和虚拟现实等领域。 特点&#xff1a;…...

Android Studio 加载多个FLutter项目

按顺序操作即可 选择工程 选择Modules, 导入 module 选中创建module 选择要导入的目录&#xff0c;只选择主目录&#xff0c;下面的文件不要选 添加完成&#xff0c;点击ok后&#xff0c;会进行导入 最终导入成功...

SealSuite 一站式 IT 管理与办公安全解决方案,助力出海企业夯实数字化底座

数字化办公时代&#xff0c;企业升级 IT 基础设施&#xff0c;已不再是选择题&#xff0c;而是必答题。 数字化办公时代&#xff0c;企业为何要升级 IT 基础设施&#xff1f; 随着时代变化与科技进步&#xff0c;人们的工作方式也发生了巨大变化。如今&#xff0c;远程办公、全…...

l超市售货管理系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;会员管理&#xff0c;供应商信息管理&#xff0c;商品管理&#xff0c;出入库管理&#xff0c;公告管理&#xff0c;轮播图信息 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告&#xff0c;…...

systemverilog、verilog的部分常用内部函数

1. $ceil 作用&#xff1a;将给定的实数或浮点数向上取整。示例&#xff1a;$ceil(3.2) 返回 4。 2. $floor 作用&#xff1a;将给定的实数或浮点数向下取整。示例&#xff1a;$floor(3.9) 返回 3。 3. $value$plusargs 作用&#xff1a;从命令行读取传递给仿真器的参数。…...

Python趣味绘图案例

文章目录 系列文章趣味绘图案例1. 绘制简单的正方形2. 绘制五角星3. 绘制同心圆4. 绘制彩虹弧5. 绘制螺旋线6. 绘制六边形7. 绘制花形图案8. 绘制波浪线9. 绘制柱状图10. 绘制饼图 系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Pyt…...

P3588 [POI2015] PUS

~~~~~ P3588 [POI2015] PUS ~~~~~ 总题单链接 思路 ~~~~~ 这道题的关键点在于线段树优化建图。 ~~~~~ 对每条限制新建一个虚电 p p p&#xff0c;将输入的 x 1 ∼ k x_{1\sim k} x1∼k​ 连向 p p p&#xff0c;再将 p p p 连向区间内单的其他点&#xff0c;建完图后拓扑排…...

指针(四)

指针和数组笔试题解析 一维数组 字符数组 &#xff08;没有\0&#xff09; 字符数组&#xff08;有\0&#xff09; 重点讲一下printf("%d\n", strlen(*p))&#xff1b; 这个strlen函数中是从地址开始寻找&#xff0c;而非元素本身&#xff1b;假设计算的是元素本…...

0902,DEQUE,LIST,VECTOR

目录 01_vector.cc 02_vector.cc 作业 01STL包括哪些组件&#xff1f;各自具有哪些特点&#xff1f; 02 序列式容器包括哪些&#xff1f;他们之间有哪些异同&#xff1f; 03 下面程序有什么错误&#xff1f; 04 创建和初始化vector的方法&#xff0c;每种都给出一个实例…...

LeetCode 每日一题 2024/9/2-2024/9/8

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/2 3153. 所有数对中数位不同之和9/3 2708. 一个小组的最大实力值9/4 2860. 让所有学生保持开心的分组方法数9/5 3174. 清除数字9/6 3176. 求出最长好子序列 I9/7 3177. 求…...

Linux中的Vim文本编辑器

Linux中的Vim是一个非常强大的文本编辑器&#xff0c;它提供了丰富的命令来支持各种文本编辑操作。以下是一个Vim常用命令的详细总结&#xff0c;涵盖了基本操作、编辑命令、移动光标、查找替换、保存退出等多个方面。 一、基本操作 启动Vim vim&#xff1a;直接启动Vim编辑器…...

rancher搭建k8s及jenkins自动化部署

1、准备环境 角色IP用途k8s-rancher-master192.168.3.63master节点k8s-rancher-node01192.168.3.64node节点k8s-rancher-node02192.168.3.66node节点k8s-rancher-server192.168.2.33rancher-server节点注: 服务器名需要配置不同,相同服务器名不能加入node节点 在所有节点进行…...

vue el-dialog嵌套解决无法点击问题

产生原因: 当你在 el-dialog 上嵌套另一个 el-dialog 窗口时&#xff0c;可能会遇到内部对话框无法点击的问题。这通常是由于嵌套对话框的遮罩层&#xff08;overlay&#xff09;或其他样式问题造成的。 解决方案: 如果你的 el-dialog 组件支持 append-to-body 属性&#xff…...

c# c++程序 交互

目录 一、两种不同程序写的进程交互 1、定义交互消息 2、定义C进程发来的消息ID 3、定义C进程交互的句柄 及给C进程发送的消息ID 4、定义交互消息所需的数据类型 5、引入所需的系统函数 6、给主进程发消息 7、写入本进程主窗口句柄 8、处理发来的交互消息 一、两种不…...

解决ruoyi框架中使用pagehelper插件分页查询后对数据进行对象转换后失效问题

一、场景重现 使用rouyi框架时&#xff0c;可以看到很多分页查询&#xff0c;如&#xff1a; //-----------SysConfigController------------- GetMapping("/list") public TableDataInfo list(SysConfig config) {startPage();List<SysConfig> list config…...