本节目录如下:
29、3D地图点是怎么存储的?表达方式?
以ORB SLAM2为例,3D地图点是以类的形式存储的,在类里面除了
- 存储3D地图点的空间坐标;
- 同时还存储了3D点对应的(多个)图像点的描述子(其实就是BRIEF描述子),用来快速进行与特征点的匹配;
- 同时还用一个map存储了与其有观测关系的关键帧以及其在关键帧中的Index等等。
class MapPoint
{
// ...
protected:
// Position in absolute coordinates
cv::Mat mWorldPos;
// Keyframes observing the point and associated index in keyframe
std::map<KeyFrame*,std::tuple<int,int> > mObservations;
// For save relation without pointer, this is necessary for save/load function
std::map<long unsigned int, int> mBackupObservationsId1;
std::map<long unsigned int, int> mBackupObservationsId2;
// Mean viewing direction
cv::Mat mNormalVector;
// Best descriptor to fast matching
cv::Mat mDescriptor;
// Reference KeyFrame
KeyFrame* mpRefKF;
long unsigned int mBackupRefKFId;
// Tracking counters
int mnVisible;
int mnFound;
// Bad flag (we do not currently erase MapPoint from memory)
bool mbBad;
MapPoint* mpReplaced;
// For save relation without pointer, this is necessary for save/load function
long long int mBackupReplacedId;
// Scale invariance distances
float mfMinDistance;
float mfMaxDistance;
Map* mpMap;
std::mutex mMutexPos;
std::mutex mMutexFeatures;
std::mutex mMutexMap;
};
30、地图点的构建方法有哪些?
(1)ORB SLAM2中是根据三角化的方法确定地图点的,利用匹配好的两个点构建AX=b的方程,然后利用SVD分解去最小奇异值对应的特征向量作为地图点坐标。,参考多视图几何总结——三角形法。
(2)在SVO中是利用深度滤波器进行种子点深度更新,当种子点深度收敛后就加入了地图构建地图点。
31、RGB-D的SLAM和RGB的SLAM有什么区别?
32、边缘检测算子汇总
边缘检测一般分为三步,分别是滤波、增强、检测。基本原理都是用高斯滤波器进行去噪,之后在用卷积内核寻找像素梯度。常用有三种算法:canny算子,sobel算子,laplacian算子。
canny算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅值和方向,对梯度幅值进行非极大值抑制,采用双阈值检测和连接边缘。
sobel算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强,计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。
laplacian算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。
(1) Canny算子
Canny边缘检测算法可以分为以下5个步骤:
(1)使用高斯滤波器,以平滑图像,滤除噪声。
(2)计算图像中每个像素点的梯度强度和方向。
(3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
(4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
(5)通过抑制孤立的弱边缘最终完成边缘检测。
这里值得细究的非极大值抑制算法和双阈值滤波算法,如下:
要进行非极大值抑制,就首先要确定像素点C的灰度值在其8值邻域内是否为最大。图中中蓝色的线条方向为C点的梯度方向,这样就可以确定其局部的最大值肯定分布在这条线上,也即出了C点外,梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。因此,判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断,C点灰度值小于这两个点中的任一个,那就说明C点不是局部极大值,那么则可以排除C点为边缘。这就是非极大值抑制的工作原理。
左侧是没有经过非极大值抑制的梯度,右侧是经过非极大值抑制后的梯度, 完成非极大值抑制后,会得到一个二值图像,非边缘的点灰度值均为0,可能为边缘的局部灰度极大值点可设置其灰度为128。
Canny算法中减少假边缘数量的方法是采用双阈值滤波算法,选择两个阈值,根据高阈值得到一个边缘图像,这样一个图像含有很少的假边缘,但是由于阈值较高,产生的图像边缘可能不闭合,未解决这样一个问题采用了另外一个低阈值。在高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像边缘闭合。
如上图所示,E1为低阈值滤波的结果,E2为高阈值滤波的结果。
以下几种边缘检测算子相比之下就简单很多,更像一个卷积核操作,他们的区别更像是卷积核不同,如下:
(2) Sobel算子
Sobel算子是典型的基于一阶导数的边缘检测算子,由于该算子中引入了类似局部平均的运算,因此对噪声具有平滑的作用,能更好地消除噪声的影响。Sobel算子对于像素的位置的影响做了加权,与Prewitt算子、Roberts算子相比效果更好。
水平检测模板:
垂直检测模板:
计算梯度大小:
计算梯度方向:
Sobel算子的升级版是Isotropic Sobel算子, 即各向同性的Sobel算子,也是加权平均算子,权值反比于邻点与中心点的距离,各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。
(3)Roberts算子
Roberts算子: 是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子,采用对角线方向相邻两象素之差近似梯度幅值检测边缘,两个交叉梯度的算子模板分别是:
(4)Prewitt算子
Prewitt算子: 是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。
水平检测模板:
垂直检测模板:
Prewitt算子对噪声有抑制作用,抑制噪声的原理是通过像素平均,但是像素平均相当于对图像的低通滤波,所以Prewitt算子对边缘的定位不如Roberts算子,与Sobel算子类似,只是权值有所变化,但两者实现起来功能还是有差距的,据经验得知Sobel要比Prewitt更能准确检测图像边缘。
(5)Laplacian算子
Laplacian算子: 是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈,因此只适用于无噪声图象。存在噪声情况下,使用Laplacian算子检测边缘之前需要先进行低通滤波。所以,通常的分割算法都是把Laplacian算子和平滑算子结合起来生成一个新的模板。离散拉普拉斯算子模板如下:
33、SLAM中采用逆深度的原因?
逆深度(Inverse depth)是近年来SLAM研究中出现的一种广泛使用的参数化技巧。在极线搜索和块匹配中,我们假设深度值满足高斯分布。然而仔细想想会发现,深度的正太分布确实存在一些问题:
(1)实际想表达的是:这个场景深度大概是5—10米,可能有一些更远的点,但近处肯定不会小于相机焦距(或者认为深度不会小于0)。这个分布并不是像高斯分布那样,形成一个对称的形状。它的尾部可能稍长,而负数区域则为0.
(2)在一些室外应用中,可能存在距离非常远,乃至无穷远处的点。我们的初始值中难以覆盖这些点,并且用高斯分布描述他们会有数值计算上的困难。
于是,逆深度应运而生。人们在仿真中发现,假设深度的倒数(也就是逆深度),为高斯分布是比较有效的。随后,在实际应用中,逆深度也具有更好的数值稳定性,从而成为一种通用的技巧。
34、SFM和SLAM里面的BA有什么区别?
网上好像没有什么关于这个问题的探讨,SFM的BA应该是不需太注重实时的,而SLAM里面通过Local Map或者滑动窗口算法保证BA的实时性。因为我并没有做过SFM,所以对这个理解不一定对,但是面试官说差不多就是这样。
35、ORB SLAM里面的Local Map和VINS-Mono里面的滑窗法有什么区别?
Local Map优化的是当前帧以及和其有共视关系的关键帧的位姿,以及当前帧和共视帧看到的地图点,没有涉及边缘化保留先验信息的操作,而VINS-mono的滑窗法相对复杂,需要考虑通过边缘化进行先验信息的保留等操作。
36、ORB SLAM有什么缺点?
(1)提取特征点和描述子速度相对较慢,如果将ORB SLAM一致到手机等嵌入式平台上达不到实时要求;
(2)地图是稀疏点云;
(3)对于动态物体敏感。
37、给一组点云,从中提取平面。
结合《点云地面去除的两种方法》来说。
还有就是随机抽样一致算法,RANSAC算法也可以做。
38、BA中,相机位姿很快接近真值,但地图点却不能很快的收敛,这是为什么?
问题:给你m相机n个点的bundle adjustment。当我们在仿真的时候,在迭代的时候,相机的位姿会很快的接近真值。而地图点却不能很快的收敛这是为什么呢?
解答:约束相机位姿的方程远多于约束地图点的方程。
39、介绍经典的视觉SLAM框架
视觉SLAM总结——ORB SLAM2中关键知识点总结
视觉SLAM总结——SVO中关键知识点总结
视觉SLAM总结——LSD SLAM中关键知识点总结
40、特征点法与直接法误差模型、Jacobian推导
41、介绍下VO
里程计一词来源于汽车,轮式里程计可以通过对车轮的转动得知汽车的运动距离。
对于机器人而言,简单的说里程计就是机器人的运动轨迹,即求解机器人在每一时刻的位姿表示,有6个*度;
视觉里程计,机器人携带相机作为外传感器,根据实时的视频流(也就是相机图像信息)估计机器人的位姿变换,即6*度(位置和姿态),例如使用单目相机称为单目视觉里程计,两个相机称为立体视觉里程计。
41、RPE、ATE的RMSE分别是什么?
(1) 相对位姿误差(Relative pose error):相对位姿误差在一定的时间间隔内测量轨迹的局部精度。因此,相对位姿误差对应的轨迹,这是特别有用的视觉里程计系统评价的漂移。
根据这些误差,我们建议计算平移分量的所有时间索引上的均方根误差(RMSE),如
(2)绝对轨迹误差(Absolute pose error):全局一致性可以通过比较估计和groundtruth轨迹之间的绝对距离来评估。由于两个轨迹都可以在任意坐标系中指定,所以它们首先需要对齐,
与相对位姿误差相似,我们建议在平移分量的所有时间指标上计算均方根误差,即
RPE考虑平移和旋转误差,而ATE只考虑平移误差。
参考文章:
1、https://www.freesion.com/article/35571024388/#6.%20%E4%BB%8B%E7%BB%8D%E4%B8%8BVO 3D VISION、SLAM求职宝典 | SLAM知识篇(D1,重点 )
2、https://blog.csdn.net/weixin_44580210/article/details/91790044 Jichao_Peng 《视觉SLAM总结——视觉SLAM面试题汇总》