当前位置: 首页 > 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;
}

运行结果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数学建模常用工具总结
  • FPGA搭建XDMA中断模式的PCIE通信架构,简单读写测试,提供7套工程源码和技术支持
  • 【sensor】激光雷达的分类和优缺点(六)
  • Linux下基于TCP协议的简易服务器实现(C语言)
  • dubbo 服务消费原理分析之应用级服务发现
  • UI(五)常用布局总结
  • RDP最小化之后仍然保持UI渲染的方法
  • php 实现推荐算法
  • 建模导论的最后一个视频笔记
  • 内存序学习笔记(一)——表达式求值顺序
  • 深入提示工程:解锁ChatGPT的无限潜能,掌握AI时代的智能对话技巧
  • iOS——线程安全、线程同步与线程通信
  • 模型训练套路(一)
  • [数据集][目标检测]街道乱堆垃圾检测数据集VOC+YOLO格式94张1类别
  • 【数学建模】2024数学建模国赛B题(word论文+matlab):生产过程中的决策问题
  • 【391天】每日项目总结系列128(2018.03.03)
  • Apache Spark Streaming 使用实例
  • Git初体验
  • java2019面试题北京
  • markdown编辑器简评
  • PhantomJS 安装
  • rabbitmq延迟消息示例
  • 设计模式走一遍---观察者模式
  •  一套莫尔斯电报听写、翻译系统
  • 用jquery写贪吃蛇
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #考研#计算机文化知识1(局域网及网络互联)
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计大学生兼职系统
  • (六)Flink 窗口计算
  • (算法二)滑动窗口
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • .cfg\.dat\.mak(持续补充)
  • .NET Core 2.1路线图
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 反编译_.net反编译的相关问题
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .Net环境下的缓存技术介绍
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • @EnableAsync和@Async开始异步任务支持
  • @RequestMapping-占位符映射
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Angular] 笔记 7:模块
  • [C/C++]关于C++11中的std::move和std::forward
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [ffmpeg] x264 配置参数解析
  • [Git][分支管理][上]详细讲解
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
  • [LeetCode]: 145: Binary Tree Postorder Traversal
  • [leetcode]swap-nodes-in-pairs