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

OpenCV图像拼接(8)用于实现并查集(也称为不相交集合)数据结构类cv::detail::DisjointSets

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::detail::DisjointSets 类是OpenCV库中用于实现不相交集合(也称为并查集)数据结构的类。该数据结构常用于处理动态连接性问题,特别是在需要高效地合并集合和查找集合代表元素的场景中非常有用。它广泛应用于图像处理、计算机视觉任务中的图分割、连通域标记等。

主要成员函数

  • 构造函数
    DisjointSets(int elem_count);
    根据给定的元素数量初始化不相交集。这通常涉及初始化parent和rank(或size)数组,使得每个元素都是自己的父节点,并且初始秩或大小为0或1。

  • findSetByElem
    int findSetByElem(int elem);
    查找指定元素所属集合的代表元素。此过程通常包括路径压缩优化,即在查找的同时将沿途的所有节点直接连接到根节点,以加速后续查询。

  • mergeSets
    void mergeSets(int elem1, int elem2);
    合并包含两个指定元素的集合。此过程通常采用按秩(或按大小)合并的策略,即将较矮(或较小)的树作为子树连接到较高的(或较大的)树上,以保持整体树结构尽可能扁平。

  • reset
    void reset();
    重置不相交集对象的状态,使其回到初始化后的状态。所有元素再次成为它们自己的父节点,所有秩或大小重置为其初始值。

请注意,由于 cv::detail::DisjointSets 是定义在 cv::detail 命名空间下,这意味着它可能是为内部使用设计的,或者至少不是库的公共API的一部分。因此,它的具体实现细节可能在不同版本之间有所变化,也可能没有详细的官方文档描述。

使用这个类时,你主要关注的是如何利用它提供的高效机制来管理一组不相交的动态集合,特别是当你需要频繁进行合并和查找操作时。例如,在图像处理任务中,如分割算法、边缘检测等场景下,该类可以提供强有力的支持。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::detail;
using namespace std;int main()
{// 初始化不相交集,假设我们有10个元素int num_elements = 10;DisjointSets djs( num_elements );// 合并一些集合djs.mergeSets( 0, 1 );  // 合并包含元素0和元素1的集合djs.mergeSets( 1, 2 );  // 现在0, 1, 2都在同一个集合中djs.mergeSets( 3, 4 );  // 合并包含元素3和元素4的集合// 查找某些元素所属的集合代表元素cout << "Find set representative for element 0: " << djs.findSetByElem( 0 ) << endl;cout << "Find set representative for element 2: " << djs.findSetByElem( 2 ) << endl;cout << "Find set representative for element 3: " << djs.findSetByElem( 3 ) << endl;cout << "Find set representative for element 5: " << djs.findSetByElem( 5 ) << endl;  // 未被合并的元素// 手动重置不相交集djs = DisjointSets( num_elements );// 再次查找元素0所属的集合代表元素,应该返回其自身,因为它现在是一个独立的集合cout << "After manual reset, find set representative for element 0: " << djs.findSetByElem( 0 ) << endl;return 0;
}

运行结果

Find set representative for element 0: 1
Find set representative for element 2: 1
Find set representative for element 3: 4
Find set representative for element 5: 5
After manual reset, find set representative for element 0: 0

相关文章:

OpenCV图像拼接(8)用于实现并查集(也称为不相交集合)数据结构类cv::detail::DisjointSets

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::DisjointSets 类是OpenCV库中用于实现不相交集合&#xff08;也称为并查集&#xff09;数据结构的类。该数据结构常用于处理动态连接…...

opencv图像处理之指纹验证

一、简介 在当今数字化时代&#xff0c;生物识别技术作为一种安全、便捷的身份验证方式&#xff0c;正广泛应用于各个领域。指纹识别作为生物识别技术中的佼佼者&#xff0c;因其独特性和稳定性&#xff0c;成为了众多应用场景的首选。今天&#xff0c;我们就来深入探讨如何利…...

记一道CTF题—PHP双MD5加密+”SALT“弱碰撞绕过

通过分析源代码并找到绕过限制的方法&#xff0c;从而获取到flag&#xff01; 部分源码&#xff1a; <?php $name_POST[username]; $passencode(_POST[password]); $admin_user "admin"; $admin_pw get_hash("0e260265122865008095838959784793");…...

Text2SQL推理类大模型本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法工程师一职,获得CSDN博客之星第一名,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得多项AI顶级比赛的Top名次,其中包括阿里云、科大讯飞比赛第一名…...

机器学习的一百个概念(3)上采样

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...

Electron应用生命周期全解析:从启动到退出的精准掌控

一、Electron生命周期的核心特征 1.1 双进程架构的生命周期差异 Electron应用的生命周期管理具有明显的双进程特征&#xff1a; 主进程生命周期&#xff1a;贯穿应用启动到退出的完整周期渲染进程生命周期&#xff1a;与浏览器标签页相似但具备扩展能力进程间联动周期&#…...

AI渗透测试:网络安全的“黑魔法”还是“白魔法”?

引言&#xff1a;AI渗透测试&#xff0c;安全圈的“新魔法师” 想象一下&#xff0c;你是个网络安全新手&#xff0c;手里攥着一堆工具&#xff0c;正准备硬着头皮上阵。这时&#xff0c;AI蹦出来&#xff0c;拍着胸脯说&#xff1a;“别慌&#xff0c;我3秒扫完漏洞&#xff0…...

分秒计数器设计

一、在VsCode中写代码 目录 一、在VsCode中写代码 二、在Quartus中创建工程与仿真 1、建立工程项目文件md_counter 2、打开项目文件&#xff0c;创建三个目录 3、打开文件trl&#xff0c;创建md_counter.v文件 4、打开文件tb&#xff0c;创建md_counter_tb.v文件 5、用VsCod…...

Flink介绍——发展历史

引入 我们整个大数据处理里面的计算模式主要可以分为以下四种&#xff1a; 批量计算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式计算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互计…...

12. STL的原理

目录 1. 容器、迭代器、算法 什么是迭代器? 迭代器的作用&#xff1f; 迭代器的类型&#xff1f; 迭代器失效 迭代器的实现细节&#xff1a; 2. 适配器 什么是适配器&#xff1f; 适配器种类&#xff1a; 3. 仿函数 什么是仿函数&#xff1f; 仿函数与算法和容器的…...

OSPFv3 的 LSA 详解

一、复习&#xff1a; OSPFv3 运行于 IPv6 协议上&#xff0c;所以是基于链路&#xff0c;而不是基于网段&#xff0c;它实现了拓扑和网络的分离。另外&#xff0c;支持一个链路上多个进程&#xff1b;支持泛洪范围标记和泛洪不识别的报文&#xff08;ospfv2 的行为是丢弃&…...

python 原型链污染学习

复现SU的时候遇到一道python原型链污染的题&#xff0c;借此机会学一下参考&#xff1a; 【原型链污染】Python与Jshttps://blog.abdulrah33m.com/prototype-pollution-in-python/pydash原型链污染 文章目录 基础知识对父类的污染命令执行对子类的污染pydash原型链污染打污染的…...

Windows 图形显示驱动开发-WDDM 2.4功能-GPU 半虚拟化(十一)

注册表设置 GPU虚拟化标志 GpuVirtualizationFlags 注册表项用于设置半虚拟化 GPU 的行为。 密钥位于&#xff1a; DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\GpuVirtualizationFlags 定义了以下位&#xff1a; 位描述0x1 ​ 为所有硬件适配器强制设置…...

入栈操作-出栈操作

入栈操作 其 入栈操作 汇编代码流程解析如下&#xff1a; 出栈操作 其 出栈操作 汇编代码流程解析如下&#xff1a;...

C++ 多态:面向对象编程的核心概念(一)

文章目录 引言1. 多态的概念2. 多态的定义和实现2.1 实现多态的条件2.2 虚函数2.3 虚函数的重写/覆盖2.4 虚函数重写的一些其他问题2.5 override 和 final 关键字2.6 重载/重写/隐藏的对比 3. 纯虚函数和抽象类 引言 多态是面向对象编程的三大特性之一&#xff08;封装、继承、…...

传统策略梯度方法的弊端与PPO的改进:稳定性与样本效率的提升

为什么传统策略梯度方法&#xff08;如REINFORCE算法&#xff09;在训练过程中存在不稳定性和样本效率低下的问题 1. 传统策略梯度方法的基本公式 传统策略梯度方法的目标是最大化累积奖励的期望值。具体来说&#xff0c;优化目标可以表示为&#xff1a; max ⁡ θ J ( θ )…...

我的机器学习学习之路

学习python的初衷 • hi&#xff0c;今天给朋友们分享一下我是怎么从0基础开始学习机器学习的。 • 我是2023年9月开始下定决心要学python的&#xff0c;目的有两个&#xff0c;一是为了提升自己的技能和价值&#xff0c;二是将所学的知识应用到工作中去&#xff0c;提升工作…...

Spring Boot 的自动装配

Spring Boot 的自动装配&#xff08;Auto Configuration&#xff09;是其核心特性之一&#xff0c;通过智能化的条件判断和配置加载机制&#xff0c;极大简化了传统 Spring 应用的配置复杂度。其原理和实现过程可概括为以下几个关键点&#xff1a; 一、核心触发机制&#xff1a…...

Python数据可视化-第3章-图表辅助元素的定制

教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第3章-图表辅助元素的定制 本章主要介绍了图表辅助元素的定制&#xff0c;包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范围和刻度标签、添加标题和图例、显示网格、添加参考线和参考区域、添加注释文…...

`git commit --amend` 详解:修改提交记录的正确方式

文章目录 git commit --amend 详解&#xff1a;修改提交记录的正确方式1. 修改提交信息2. 补充遗漏的文件3. 结合 --amend 进行交互式修改4. 已推送提交的修改总结 git commit --amend 详解&#xff1a;修改提交记录的正确方式 git commit --amend 用于修改最近一次的提交&…...

Linux系统下C语言fork函数使用案例

一、fork函数的作用 生成一个子进程&#xff0c;异步执行某个任务&#xff1b; 二、子进程的作用 1、子进程能复制一份父进程的变量、函数&#xff1b; 2、子进程可以和父进程同时并发执行&#xff1b; 函数语法&#xff1a; pid_t fork() 说明&#xff1a;调用后返回一个进程…...

springboot实现异步导入Excel的注意点

springboot实现异步导入Excel 需求前言异步导入面临的问题实现异步如何导入大Excel文件避免OOM&#xff1f;异步操作后&#xff0c;如何通知导入结果&#xff1f;如何加快导入效率&#xff1f;将导入结果通知给用户后&#xff0c;如何避免重复通知&#xff1f; 优化点完结撒花&…...

Linux练习——有关硬盘、联网、软件包的管理

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 #使用nmtui打开文本图形界面配置网络 [rootrhcsa0306 ~]# nmtui #使用命令激活名为 ens160 的 NetworkManager 网络连接 [rootrhcsa0306 ~]# nmcli c up ens160 #通…...

论文阅读:GS-Blur: A 3D Scene-Based Dataset for Realistic Image Deblurring

今天介绍一篇 2024 NeurIPS 的文章&#xff0c;是关于真实世界去模糊任务的数据集构建的工作&#xff0c;论文作者来自韩国首尔大学 Abstract 要训练去模糊网络&#xff0c;拥有一个包含成对模糊图像和清晰图像的合适数据集至关重要。现有的数据集收集模糊图像的方式主要有两…...

经典动态规划问题:爬楼梯的多种解法详解

引言 今天我们要解决一个经典的算法问题——爬楼梯问题。这个问题看似简单&#xff0c;但蕴含了多种解法&#xff0c;从递归到动态规划&#xff0c;再到组合数学&#xff0c;每种方法都有其独特的思路和优化方式。本文将详细讲解四种解法&#xff0c;并通过代码和图解帮助大家…...

Kubernetes深度解析:云原生时代的容器编排引擎

一、背景与演进 1. 容器革命的必然产物 Kubernetes&#xff08;K8s&#xff09;诞生于2014年&#xff0c;是Google基于其内部Borg系统的开源实现。在传统单体应用向微服务架构转型的浪潮中&#xff0c;容器技术&#xff08;如Docker&#xff09;解决了应用打包和环境隔离问题…...

Cocos Creator Shader入门实战(七):RGB不同算法效果的实现,及渲染技术、宏定义、属性参数的延伸配置

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 上篇文章&#xff0c;讲解了Cocos Shader如何通过setProperty动态设置材质的属性&#xff0c;以及设置属性时候的一些注意事项&#xff0c;比如&#xff1a; 一、CCEffect部分properties参数的设定后&…...

leetcode102 二叉树的层次遍历 递归

(1) 找出重复的子问题。 层次遍历是每一层的节点从左到右的遍历&#xff0c;所以在遍历的时候我们可以先遍历左子树&#xff0c;再遍历右子树。 需要注意的是&#xff0c;在遍历左子树或者右子树的时候&#xff0c;涉及到向上或者向下遍历&#xff0c;为了让递归的过程中的同…...

Netty源码—10.Netty工具之时间轮二

大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核心字段 6.HashedWheelTimer的构造方法 7.HashedWheelTimer添加任务和执行任务 8.HashedWheelTimer的完整源码 9.HashedWheelTimer的总结…...

算法学习记录:递归

递归算法的关键在于回复现场&#xff0c;dfs&#xff08;&#xff09;函数返回值、结束条件、它的作用。 目录 1.综合练习 2. 二叉树的深搜 1.综合练习 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 关键在画出的决策树当中&#xff0c;前面使用过的2、3&#xff0c;…...