【数据结构】【计算机视觉】并查集(disjoint set)结构介绍
1.简述
在实现多图像无序输入的拼接中,我们先使用surf算法对任意两幅图像进行特征点匹配,每对图像的匹配都有一个置信度confidence参数,来衡量两幅图匹配的可信度,当confidence>conf_threshold,我们就认为这两幅图可以拼接,属于一个全景拼接的集合,然后扩展这个集合就可以确定最大的可拼接集合,排除一些无效的图像,然后进行后续的拼接。
并查集的定义就是并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。即将属于相同集合的元素合并起来,中间需要查找某个元素属于哪个集合,然后需要将两个元素或者集合进行合并处理。
2.结构体及函数定义
下面我们介绍opencv_stitching中使用的互斥集结构和函数的定义
- class DisjointSets
- {
- public:
- //互斥集初始化,元素个数是elem_count
- DisjointSets(int elem_count = 0) { createOneElemSets(elem_count); }
- void createOneElemSets(int elem_count);//创建互斥集
- int findSetByElem(int elem);//查找元素所属的集合
- int mergeSets(int set1, int set2);//合并两个集合
- std::vector<int> parent;//元素所属集合 parent[elem] = set ,元素elem的集合是set
- std::vector<int> size;//集合的包含的元素个数 size[set] = set_size,集合set的元素数是set_size
- private:
- std::vector<int> rank_;//rank_[set] = rank,集合set标记
- };
- /************************************************************************/
- /*
- 创建一个互斥集,尺寸为n
- %参数 int n,输入互斥集的尺寸
- */
- /************************************************************************/
- void DisjointSets::createOneElemSets(int n)
- {
- rank_.assign(n, 0);//设置rank_长度为n,初始值为0
- size.assign(n, 1);//设置size长度为n,初始值为1
- parent.resize(n);//设置parent的长度为n
- for (int i = 0; i < n; ++i)
- parent[i] = i;//parent[elem] = set,初始化每个元素所在的集合
- }
- /************************************************************************/
- /*
- 查找元素所在的集合
- %参数int elem 输入元素
- */
- /************************************************************************/
- int DisjointSets::findSetByElem(int elem)
- {
- //由于互斥集也是树形结构,所以需要向上递归到根节点,即元素所属的最终集合
- int set = elem;
- while (set != parent[set])//如果元素的值与所属集合的值不相同,说明元素是经过集合合并过的,所以要继续向上递归
- set = parent[set];
- int next;
- while (elem != parent[elem])//将之前所有的递归过的元素的集合全改成最终的根节点集合
- {
- next = parent[elem];
- parent[elem] = set;
- elem = next;
- }
- return set;
- }
- /************************************************************************/
- /*
- 合并两个集合
- %参数int set1,int set2 两个集合set1和set2
- */
- /************************************************************************/
- int DisjointSets::mergeSets(int set1, int set2)
- {
- //比较两个集合的rank_,将rank_值小的集合合并到值大的集合中
- if (rank_[set1] < rank_[set2])
- {
- parent[set1] = set2;
- size[set2] += size[set1];
- return set2;
- }
- if (rank_[set2] < rank_[set1])
- {
- parent[set2] = set1;
- size[set1] += size[set2];
- return set1;
- }
- //如果rank_相等,则默认将set1合并到set2中,set2的rank_值+1
- parent[set1] = set2;
- rank_[set2]++;
- size[set2] += size[set1];
- return set2;
- }
模拟程序:
- #include "astdio.h"
- #include "disjointset.h"
- #define conf_threshold 90
- #define num_images 10
- void main()
- {
- int max_comp = 0;
- int max_size = 0;
- vector<int> confident(num_images*num_images);
- DisjointSets comps(num_images);
- //使用随机数模拟多幅图像中每个图像相互匹配的置信度(0-100)
- //另外1与2的匹配置信度和2与1的置信度我们默认相同(实际中是不相同的)
- srand((unsigned)time(NULL));
- for (int i = 0;i<num_images;i++)
- {
- cout<<endl;
- for (int j = 0;j<num_images;j++)
- {
- if (!confident[i*num_images+j])
- {
- confident[i*num_images+j] = rand()%100;
- confident[j*num_images+i] = confident[i*num_images+j];
- }
- if (i == j)
- {
- confident[i*num_images+j] = 100;
- }
- cout<<" "<<confident[i*num_images+j];
- }
- }
- //根据两幅图匹配置信度是否大于conf_threshold来决定是否属于一个全景集合
- for (int i = 0; i < num_images; ++i)
- {
- for (int j = 0; j < num_images; ++j)
- {
- if (confident[i*num_images + j] < conf_threshold)
- continue;
- int comp1 = comps.findSetByElem(i);
- int comp2 = comps.findSetByElem(j);
- if (comp1 != comp2)
- comps.mergeSets(comp1, comp2);
- }
- }
- //找出包含图片最多的全景集合
- for (int i = 0;i< num_images;i++)
- {
- if (i == 0)
- {
- max_comp = 0;
- max_size = comps.size[i];
- }
- else if(comps.size[i]>max_size)
- {
- max_comp = i;
- max_size = comps.size[i];
- }
- }
- //将该集合中的元素打印出来
- cout<<endl<<"images in the max_comp:"<<endl;
- int j = 0;
- for (int i = 0;i<num_images;i++)
- {
- if (comps.findSetByElem(i) == max_comp)
- {
- cout<<++j<<": "<< i<<endl;
- }
- }
- while(1);
- }
输出结果:
【数据结构】【计算机视觉】并查集(disjoint set)结构介绍的更多相关文章
- 【算法与数据结构】并查集 Disjoint Set
并查集(Disjoint Set)用来判断已有的数据是否构成环. 在构造图的最小生成树(Minimum Spanning Tree)时,如果采用 Kruskal 算法,每次添加最短路径前,需要先用并查 ...
- 数据结构 之 并查集(Disjoint Set)
一.并查集的概念: 首先,为了引出并查集,先介绍几个概念: 1.等价关系(Equivalent Relation) 自反性.对称性.传递性. 如果a和b存在等价关系,记 ...
- 数据结构之并查集Union-Find Sets
1. 概述 并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 2. 基本操作 并查集 ...
- 并查集(Disjoint Set)
在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题其特点是看似并不复杂, ...
- 数据结构09—— 并查集(Union-Find)
一.关于并查集 并查集(Union-Find)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.并查集(Union-Find)从名字可以看出,主要它涉及两种 ...
- 【算法导论-36】并查集(Disjoint Set)具体解释
WiKi Disjoint是"不相交"的意思.Disjoint Set高效地支持集合的合并(Union)和集合内元素的查找(Find)两种操作,所以Disjoint Set中文翻译 ...
- 【基本数据结构】并查集-C++
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中.这一类问题近几年来反复出 ...
- 并查集(Disjoint Set Union,DSU)
定义: 并查集是一种用来管理元素分组情况的数据结构. 作用: 查询元素a和元素b是否属于同一组 合并元素a和元素b所在的组 优化方法: 1.路径压缩 2.添加高度属性 拓展延伸: 分组并查集 带权并查 ...
- 数据结构(并查集||树链剖分):HEOI 2016 tree
[注意事项] 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对于35% 的数据,1<=N,Q ...
随机推荐
- 添加wcf服务引用,无法签出当前文件
写了一些wcf服务接口,使用控制台可以正常启动服务,想要测试一下,新建项目添加服务引用,提示:“无法签出当前文件.该文件可能为只读或已锁定,或者您需要手动签出它.” 在网上找了找,有说可能是因为源代码 ...
- Haskell路线
@ 知乎 @ <I wish i have learned haskell> ———— 包括: Ranks, forall, Monad/CPS, monadic parser, FFI ...
- css flex兼容性
我测试了一下css flex的兼容性 已经可以兼容到IE10了呀 为啥MDN上面的IE兼容性还是兼容到IE11 有点更新不及时的感觉
- flink batch wordcount
1.POJO方式 public class WordCountPojo { public static class Word{ private String word; private int fre ...
- NameNode && Secondary NameNode工作机制
NameNode && Secondary NameNode工作机制 1)工作流程 2) fsimage和edits NameNode是HDFS的大脑,它维护着整个文件系统的目录树, ...
- windows平台上MongoDB安装配置
我按照原文方法操作,无法连接mongod服务,可能哪里出了问题. 以下是小页的教程:https://www.cnblogs.com/littlepage/p/10992336.html 视频参考: ...
- Fluter基础巩固之Dart语言详解<一>
在上一篇https://www.cnblogs.com/webor2006/p/11367345.html中咱们已经搭建好了Flutter的开发环境了,而Flutter的开发语言是选用的dart,那么 ...
- rf增加产品的例子
Open Browser http://xxx.xxx.xxx.xxx:1000/portal/login/init.htm gcMaximize Browser Window sleep 2 #Ge ...
- Django-Model操作数据库
查询 models.UserInfo.objects.all() models.UserInfo.objects.all().values('user') #只取user列 models.UserIn ...
- CentOS7配置本地Yum源
从CentOS7官网下载DVD中存在需要的大部分软件,所以在没有网络的情况下可以配置yum源为本地的DVD,下载速度快,软件稳定.1. 如果使用虚拟机,那么就在虚拟机中挂载DVD的iso文件.2. 使 ...