KeyFrameDatabase部分的学习总结
倒数几个cpp文件了,让我们争取一天之内,把剩余的都看完吧,加油加油!400行代码,走起
.h文件
头文件中包含的头文件有:
- vector、list和set的容器
- KeyFrame.h
- Frame.h
- ORBVocabulary.h
头文件中维护的变量(protected)有:
ORB词汇描述的指针
存放list的容器,list内存放的是关键帧的指针
线程锁对象
头文件中的函数方法有:
构造函数
添加关键帧的函数
删除关键帧的函数
清空关键帧的函数
回环检测候选关键帧的函数
检测重定位候选关键帧的函数
function by function
老规矩,先看看.cpp中包含的头文件(除了自身的头文件之外)
- KeyFrame.h
- 词袋中的词袋向量头文件
KeyFrameDatabase()
构造函数
函数的参数列表:ORB的词汇的引用
将维护变量中的词汇指针指向传入的那个变量
设置存放list容器的大小为词汇变量的size
add()
添加关键帧的函数
函数的参数列表:关键帧的指针
上锁线程锁
- 循环遍历传入的关键帧的词袋向量
- 在词袋first索引处存入这帧关键帧
(因为之前没看词袋部分的内容,所以对于词袋向量的map不太了解,后面再补充学习)
- 在词袋first索引处存入这帧关键帧
erase()
删除关键帧的函数
函数的参数列表:关键帧的指针
上锁线程锁
- 循环遍历传入的关键帧的词袋向量
- 取出词袋first索引处的关键帧链表
- 循环遍历这个链表
- 如果取出的关键帧就在这list内,将其删除,break
clear()
清空函数
将存放list的容器清空
重新设置这个容器的大小,大小为词汇向量的size
DetectLoopCandidates()
检测回环候选的函数
函数的参数列表:关键帧类型的指针和最小得分
获取和传入的关键帧连接的关键帧set
定义存放关键帧类型指针的list(分享词袋的关键帧)
上锁线程锁
- 循环遍历传入关键帧的词袋向量
- 取出词袋向量first对应的关键帧list
- 循环遍历list中的关键帧
- 取出一帧关键帧
- 判断这帧关键帧中的闭环使用信息
- 如果是当前传入的这帧关键帧
- 将这帧关键帧内的闭环words置0
- 判断传入的该关键帧连接的关键帧中是否有这帧
- 如果没有
- 将这一关键帧的闭环队列信息赋值传入关键帧的帧号
- 将这一关键帧存入上面定义的共享words的容器内
- 在这一关键帧中的闭环words++
如果共享关键帧的容器为空,直接return空的关键帧vector
定义存放得分和关键帧指针的pair的list(lScoreAndMatch)
定义int类型的最大的公共词汇,初始化0
- 循环遍历共享words的关键帧
- 取出一帧关键帧,取出这关键帧内的闭环words
- 找出最大的闭环words的数量
定义最小的公有words数量为0.8*最大公有words数量
定义int得分为0
- 循环遍历共享words的关键帧
- 取出一帧关键帧
- 如果这帧的闭环words数量大于上面定义的阈值
- 得分++
- 将传入关键帧的词袋向量和这帧关键帧的词袋向量传入词汇变量的score()函数
- 将socre()得到的打分赋值给这一关键帧内的闭环得分
- 如果打分大于传入的最小阈值
- 将这一关键帧和打分make pair存入那个得分匹配容器
如果得分匹配容器为空,直接返回空的vector
定义存放pair<打分 关键帧指针>的list
定义最好的Acc得分为传入的最小得分
- 将这一关键帧和打分make pair存入那个得分匹配容器
- 循环遍历得分匹配容器
- 取出一帧关键帧
- 取出这一关键帧的前10帧最好的Covisibility关键帧
- 取这一帧对应的打分,赋值给最好的得分和acc得分
- 定义最好的关键帧指向当前取的这一关键帧
- 循环遍历取出这帧关键帧的前10帧关键帧
- 取出一帧关键帧
- 如果这帧关键帧的闭环信息等于传入这帧关键帧的帧号且取出这帧的闭环words大于最少的公共words
- acc得分加上这帧关键帧的闭环得分
- 如果这帧关键帧的闭环得分大于最后的得分
- 将最好的关键帧赋值为这帧关键帧
- 最好的打分也赋值为这帧的闭环得分
- 将acc得分和最好的关键帧make pair存入acc得分和匹配容器内
- 如果acc得分大于最好的acc得分,将acc得分赋值给最好的acc得分
定义能保留下来的最小的分数要求,这个要求为0.75*最好的acc打分
定义存放关键帧指针的set(spAlreadyAddedKF)
定义存放关键帧指针的容器(vpLoopCandidates)
该容器的大小预留acc打分和匹配容器的大小
- 循环遍历acc打分和匹配容器内的关键帧
- 判断打分是否大于最低要求
- 取出这帧关键帧
- 判断已经添加的容器内是否有了这一帧
- 在没加过这一帧的情况下,将其存入闭环候选帧内
- 将这一帧也存入已经存入的关键帧的容器内(spAlreadyAddedKF)
返回闭环候选帧容器
- 判断打分是否大于最低要求
DetectRelocalizationCandidates()
检测重定位候选的函数
函数的参数列表:Frame指针的普通帧
定义存放关键帧指针的list(lKFsSharingWords,共享words)
上锁线程锁
- 循环遍历词袋向量容器
- 取出索引对应的关键帧list
- 循环遍历list内的关键帧
- 取出一帧关键帧
- 如果这一帧关键帧的重定位记录不是当前传入的这帧的帧号
- 将这一帧的重定位word赋值为0
- 将这一帧的询问重定位的帧号赋值为当前帧的帧号
- 将这一帧存入共享word的关键帧的容器内
- 将这一帧的重定位words++
如果共享words的容器为空,直接返回空的关键帧vector
定义最大公有的words为0
- 循环遍历共享words的容器内的关键帧
- 如果取到的这帧重定位words大于最大的共享words
- 将这个words赋值给最大的共享words
定义最小的公有words为0.8*最大的共享words
定义存放pair的list(lScoreAndMatch),打分和关键帧make pair
定义得分为0
- 将这个words赋值给最大的共享words
- 如果取到的这帧重定位words大于最大的共享words
- 循环遍历共享words的关键帧
- 取出一帧关键帧
- 如果该帧的重定位words大于最低的要求
- 得分++
- 调用词汇的score()函数,计算这帧的打分
- 将这个打分赋值给该帧的重定位打分
- 将这个打分和这帧make pair之后存入得分和匹配的容器内
如果得分和匹配的容器为空,直接返回空的关键帧容器
定义存放pair的list(lAccScoreAndMatch)
定义最好的acc打分,初始化为0
下面的过程和候选闭环关键帧差不多
- 循环遍历打分和匹配list
- 取出一帧关键帧
- 获取这帧的前10帧最好Covisibility关键帧
- 初始化最好的得分为取出的这一帧的打分
- 初始化acc得分为最好的得分
- 定义并初始化最好的关键帧为当前取出的这帧
- 循环遍历这帧关联的前10帧最好Covisibility关键帧
- 取一帧关键帧
- 如果这帧的询问重定位的帧不是当前传入的这帧,直接continue
- acc得分加上这帧的重定位得分
- 如果这帧重定位的得分大于最好的得分
- 将最好的关键帧改为这一帧
- 这一帧的重定位得分赋值给最好的得分
- 将最好的关键帧和acc得分make pair存入得分和匹配的容器内
- 如果acc得分大于最好的acc得分,最好的acc得分改为acc得分
定义最小得分要求为0.75*最好的acc得分
定义存放关键帧指针的set(spAlreadyAddedKF)
定义存放关键帧指针的容器(vp重定位Candidates)
该容器的大小预留acc打分和匹配容器的大小
- 循环遍历acc打分和匹配容器内的关键帧
- 判断打分是否大于最低要求
- 取出这帧关键帧
- 判断已经添加的容器内是否有了这一帧
- 在没加过这一帧的情况下,将其存入重定位候选帧内
- 将这一帧也存入已经存入的关键帧的容器内(spAlreadyAddedKF)
返回重定位候选帧容器
- 判断打分是否大于最低要求
马上就要看到整个系统了,坚持坚持!
时间:2019年09月17日
作者:hhuchen
机构:河海大学机电工程学院