ORB-SLAM2 --- ORBmatcher::SearchBySim3函数

news2025/1/11 7:58:03

目录

1.函数作用

2.函数流程 

3.函数解析 

3.1 准备工作:内参,计算Sim3的逆

3.2 记录已经匹配的特征点 

3.3 通过Sim变换,寻找 pKF1 中特征点和 pKF2 中的新的匹配 

3.4 通过Sim变换,寻找 pKF2 中特征点和 pKF1 中的新的匹配 

3.5 一致性检查,只有在两次互相匹配中都出现才能够认为是可靠的匹配 


1.函数作用

        通过Sim3变换,搜索两个关键帧中更多的匹配点对。

        图像下方的蓝线是我们先前通过SearchByBoW函数预先粗匹配的特征点。

        我们在SearchBySim3函数中要做的是对两帧特征点进行进一步匹配。寻找 pKF1 中特征点和 pKF2 中的新的匹配、寻找 pKF2 中特征点和 pKF1 中的新的匹配。

2.函数流程 

Step 1: 准备工作:内参,计算Sim3的逆

Step 2:记录已经匹配的特征点

Step 3:通过Sim变换,寻找 pKF1 中特征点和 pKF2 中的新的匹配

Step 4:通过Sim变换,寻找 pKF2 中特征点和 pKF1 中的新的匹配

Step 5: 一致性检查,只有在两次互相匹配中都出现才能够认为是可靠的匹配

3.函数解析 

3.1 准备工作:内参,计算Sim3的逆

        函数传入的参数为:第一帧pKF1、第二帧pKF2、两帧的匹配关系vpMatches12、sim3的尺度因子s12,第一帧到第二帧的变换R12、t12、重投影阈值th

        在准备阶段,获取相机的内参fx、fy、cx、cy

        获取从world到camera1的变换:R1w、t1w

        获取从world到camera2的变换:R2w、t2w。        

        关于sim3变换,我们回忆相机的知识:将世界坐标系坐标投影到像素坐标系坐标是这样的:

\begin{bmatrix} u\\v \\1 \end{bmatrix}= \frac{1}{Z} \begin{bmatrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 &1 \end{bmatrix}\begin{bmatrix} X\\Y \\Z \end{bmatrix} = \frac{1}{Z}KP

        我们求出Sim3 的逆:sR12、sR21、t21

        取出关键帧的地图点存放在向量vpMapPoints1、vpMapPoints2中并统计它们的数量,分别存放在变量N1、N2中。

        用bool型向量vbAlreadyMatched1vbAlreadyMatched2记录pKF1,pKF2中已经匹配的特征点,已经匹配记为true,否则false。

3.2 记录已经匹配的特征点 

        我们遍历变量vpMatches12,其中记录着帧1pKF1到帧2pKF2的匹配信息,具体来说:就是如果vpMatches12[3]=5,就意味着第一帧pKF1中的索引为4的特征点和第二帧pKF2的索引为6的特征点匹配成功。

        如果有匹配成功的,记录pKF1中第i个特征点已经匹配成功,vbAlreadyMatched1[i]=true,同时得到该地图点在关键帧pkF2 中的id,记录pKF2中第idx2个特征点在pKF1中有匹配,即vbAlreadyMatched2[idx2]=true;。

        通过这一步,我们填充了vbAlreadyMatched1vbAlreadyMatched2,即标注了匹配信息。

3.3 通过Sim变换,寻找 pKF1 中特征点和 pKF2 中的新的匹配 

        遍历帧pKF1中每一个特征点:

        若该特征点存在对应的地图点或者该特征点已经有匹配点了,跳过。

        地图点是要删掉的,跳过。

        通过Sim变换,将pKF1的地图点投影到pKF2中的图像坐标p3Dc2。深度值为负,跳过。投影到camera2图像坐标 (u,v),判断投影点是否在图像范围内,否则跳过。检测深度值在有效范围内,否则跳过。

        搜索在该区域内的所有候选匹配特征点记录在vIndices里,vIndices存储着帧二中的特征点的索引,该函数的具体解析如下:

ORB-SLAM2 ---- Frame::GetFeaturesInArea函数解析icon-default.png?t=MBR7https://blog.csdn.net/qq_41694024/article/details/128227154        取出帧一pKF1中关于该特征点的描述子,和帧二pKF2中所有待匹配特征点索引vIndices取出特征点进行描述子的汉明距离计算。选出汉明距离最小的(匹配关系最好的)记录最佳匹配的索引bestIdx和最佳汉明距离bestDist,若最佳汉明距离小于我们的阈值TH_HIGH,则认为匹配有效,记录匹配信息vnMatch1[i1]=bestIdx;。

3.4 通过Sim变换,寻找 pKF2 中特征点和 pKF1 中的新的匹配 

        同3.3。

        匹配信息记录在vnMatch2中。

3.5 一致性检查,只有在两次互相匹配中都出现才能够认为是可靠的匹配 

        我们进行帧一pKF1到帧二pKF2的重投影匹配,又进行了帧二pFK2到帧一pKF1的重投影匹配,将投影信息记录在了vnMatch1vnMatch2中。

        一致性检查的目的是检测我们在第一帧投影到第二帧中的信息是否能在第二帧投影到第一帧的信息对上。

        如果对上了,我们更新两帧的匹配关系vpMatches12,返回成功匹配的数量nFound

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins远程SSH部署SpringBoot项目

1.前置环境 前置环境配置:jdk、maven、git 2.在Jenkins配置git凭据 请查看往期文章: https://blog.csdn.net/RookiexiaoMu_a/article/details/122655272?spm1001.2014.3001.5501 3.安装Publish over SSH插件 4.配置SSH Servers 安装完Publish over…

C++蓝桥杯贪心算法

目录 🌼一,1812: [NewOJ Week 5] 排列变换 🌼二,1827: [NewOJ Week 8] 升降数字 🌼三,剑指offer 10-II 青蛙跳台阶问题 🌼四,P1223 排队接水 🌼五,P5650…

npm常用命令

目录1. 构建项目2. 安装包3. 查看安装目录4. 卸载包5. 更新包6. 查看已安装的包7. 使用国内npm镜像源8. 使用yarn1. 构建项目 npm init # 全部使用默认配置 npm init --yes2. 安装包 # 全局安装 npm install 包名 -g # 本地安装 npm install 包名 # 一次安装多个 npm install…

ROS移动机器人开发——硬件引脚

我们使用的32开发板为冰达机器人官方的开发板,类型为STM32RCT6。32章节的目的为,将官方所给源码转化为 官方标准库函数来进行使用 —————————————— 需求提出: 电源 1. 3.3V-200ma供电 2. 输入 9-12.6V 5A 控制&#xff1a…

(十三)JAVA基础语法

目录 前言: 一、包 二、权限修饰符 三、final关键字 四、常量 五、枚举 六、抽象类 七、抽象类:模板方法模式 八、接口 前言: ①包: 在编写Java程序时,随着程序架构越来越大,类的个数也越来越多,这时就会发现管理程序中维护类名称也…

利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图

利用OpenCV的函数calcHist()计算出图像的直方图数据后绘制图像的直方图 在上一篇博文 https://www.hhai.cc/thread-200-1-1.html 中已经对OpenCV的直方图计算函数calcHist()进行了详细介绍。 这篇博文介绍如何用直方图数据绘制直方图。 OpenCV是没有统计图绘制的相关函数的&a…

Verilog语法笔记(夏宇闻第三版)-循环语句

目录 forever语句: repeat语句: while语句: for语句: 在Verilog HDL中存在着四种类型的循环语句,用来控制执行语句的执行次数。 1) forever 连续的执行语句。 2) repeat 连续执行一条语句 n 次。 3) while 执行一条语句直到某个条件不满足。如果一开始条件即…

数据异动分析方法论

注:本文首发于公众号:书剑双修,欢迎关注。 数据异动分析是一类典型的数据分析问题,也是分析师日常工作中会频繁遇到的问题。很多的数据分析面试过程中,都会对这个方面进行考察,以此来判断分析师思考问题的全…

使用IIS服务器搭建一个网站

1、什么是IISIIS全称为Internet Information Services,是一种Web服务组件。通过在自己电脑上安装好IIS服务,就可以把你自己的电脑当作一个网站的服务器。2、搭建一个IIS2.1、开启windows的IIS服务Step1、控制面板——程序——程序和功能——启用或关闭wi…

微软的COM、DOM和COM+

纯粹的为了记录一下 COM 组件对象模型(COM),是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起…

大数据NiFi(九):NiFi集群页面的添加、配置处理器操作

文章目录 NiFi集群页面的添加、配置处理器操作

jdb2/kworker

测试代码出自&#xff1a;块设备IO优化的典型案例分析_papaofdoudou的博客-CSDN博客_kworker/u2:2-2- #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <unistd.h&g…

基础算法 - 常见算法模板题(最简洁写法)【下】

目录 双指针 最长连续不重复子序列​编辑 二进制中1的个数 离散化 区间和 区间合并 双指针 最长连续不重复子序列 思路&#xff1a; 设左右指针 j&#xff0c;i&#xff1b;用 i 遍历数组&#xff0c;对【j&#xff0c;i】范围路径数值出现次数记录若次数大于1&#xff0c;则…

Seata-go 发布 1.0.3,补齐 AT 模式

文&#xff5c;赵新&#xff08;花名&#xff1a;于雨 )蚂蚁集团 Seata 项目开源负责人本文 3902 字 阅读 10 分钟发布概览Seata-go 1.0.3 版本补齐了 AT 模式下对 Insert/Delete 的支持&#xff0c;这意味着除了 “select for update” 外&#xff0c;Seata-go 的 AT 模式与 S…

【c++】 STL的组件简介与容器的使用时机

STL六大组件简介 STL提供了六大组件&#xff0c;彼此之间可以组合套用&#xff0c;这六大组件分别是:容器、算法、迭代器、仿函数、适配器&#xff08;配接器&#xff09;、空间配置器。 容器&#xff1a;各种数据结构&#xff0c;如vector、list、deque、set、map等,用来存放…

ECS概述

1.ECS概述ECS全称Entity-Component-System&#xff08;实体-组件-系统&#xff09;&#xff0c;是基于组合优于继承&#xff08;将不变的部分使用继承以方便复用&#xff0c; 将多变的部分用组合来方便拓展&#xff09;的原则的一种模式&#xff0c;游戏中的每一个单元&#xf…

使用Redis踩过的16个坑

如果你在使用 Redis 时,也遇到过以下这些「诡异」的场景,那很大概率是踩到「坑」了: 明明一个 key 设置了过期时间,怎么变成不过期了? 使用 O(1) 复杂度的 SETBIT 命令,Redis 竟然被 OOM 了? 执行 RANDOMKEY 随机拿出一个 key,竟然也会阻塞 Redis? 同样的命令,为什么…

Linux基础命令学习(Bandit通关)(未完成)

一、前言 Bandit是一个学习Linux的网站&#xff0c;它采用游戏通关的方式来帮助我们学习linux基本使用的命令&#xff0c;十分适合没有基础或基础较弱的同学学习。【虽然是英文但是很容易&#xff0c;用翻译也可】 官网地址是&#xff1a;OverTheWire: Bandit 二、第一~六关…

自从用了这个良心浏览器后,我卸载了UC,太香了

要是以前如果有人问我手机上用什么浏览器好&#xff0c;我肯定一律无脑推荐UC浏览器。一方面它确实功能强大&#xff0c;另一方面是用了很多年已经习惯了&#xff0c;有感情因素在。然而&#xff0c;这次可能要打自己的脸了。 最近&#xff0c;有了个“新欢”&#xff0c;其实…

线程3

一.阻塞队列阻塞队列&#xff0c;也是特殊的队列&#xff0c;虽然也是先进先出的&#xff0c;但是带有特殊功能。阻塞&#xff1a;1.如果队列为空&#xff0c;执行出队列操作&#xff0c;就会阻塞&#xff0c;阻塞到另一个线程往队列中添加元素&#xff08;队列不空为止&#x…