自动驾驶-机器人-slam-定位面经和面试知识系列04之高频面试题(02)

这个博客系列会分为C++ STL-面经、常考公式推导和SLAM面经面试题等三个系列进行更新,基本涵盖了自己秋招历程被问过的面试内容(除了实习和学校项目相关的具体细节)。在知乎和牛客(牛客上某些文章上会附上内推码)也会同步更新,全网同号(lonely-stone或者lonely_stone)。
关于高频面试题和C++ STL面经,每次我会更新10个问题左右,每次更新过多,害怕大家可能看了就只记住其中几个点。(在个人秋招面试过程中,面试到后面,发现除了个人项目和实习经历外,个人所记录的内容基本能涵盖面试官能问到的)
(另外个人才疏学浅,如果所分享知识中出现错误,请大家指出,避免误导其他人)

1. 简单描述特征点法和直接法的优缺点

  • 特征点法:
    • 优点:精确,直接法属于强假设;运动过大时,只要匹配点在像素内,则不太会误匹配,鲁棒性好。
    • 缺点:关键点提取、描述子计算和匹配等耗时长;特征点丢失则场景无法使用;只能构建稀疏地图
  • 直接法:
    • 优点:省去计算特征点和描述子时间;可以用在特征缺失场景(如白墙);可以构建稠密和半稠密地图
    • 缺点:易受光照和模糊影响;运动微小或者运动慢或者采样频率高(可以用图像金字塔改善);非凸性

2. 直接法与特征点法的优缺点

如果面试官只是简单问问就答上面的简易版本,如果面试官是想根据这种对基础的SLAM理解来考察的话(特点就是:面试官询问这个问题时并不着急,并且你感觉他想多了解的时候),就具体按照下面的理解进行交流。
直接法最大的贡献在于,以更整体、更优雅的方式处理了数据关联问题。特征点法需要依赖重复性较强的特征提取器,以及正确的特征匹配,才能得到正确地计算相机运动。而直接法并不需要一一对应的匹配,只要先前的点在图像当中有合理的投影残差,我们就认为这次投影是成功的。而成功与否,主要取决于我们对地图点深度以及相机位姿的判断,并不在于图像局部看起来是什么样子。
直接法的优势:

  • 相比特征点法(只使用了特征点周围的信息),直接法使用了图像中全部的信息(半直接法只用了边缘梯度)。
  • 节省特征提取与匹配的大量时间,易于移植到嵌入式系统中,以及与IMU进行融合;
  • 使用的是像素梯度而不必是角点,可以在特征缺失的场合使用,如环境中存在许多重复纹理或是缺乏角点,但出现许多边缘或光线不明显区域;
  • 可以进行稠密或半稠密的地图重建。

直接法的劣势:

  • 一般对相机要求较高,需要全局快门相机,进行光度标定等操作;
  • 灰度不变是一个很强的假设,难以满足(易受曝光和模糊影响)
  • 单像素区没有区分度,需要计算图像块或是相关性;
  • 直接法成功的前提,是目标函数从初始值到最优值之间一直是下降的,然而图像非凸。因此需要有一个相当不错的初始估计,还需要一个质量较好的图像;
  • 难以实现地图复用、回环检测、丢失后的重定位等:除非存储所有的关键帧图像,否则很难利用先前建好的地图;即使有办法存储所有关键帧的图像,那么在重用地图时,我们还需要对位姿有一个比较准确的初始估计——这通常是困难的。

数据关联和位姿估计,在直接中是耦合的,而在特征点法中则是解耦的。耦合的好处,在于能够更整体性地处理数据关联;而解耦的好处,在于能够在位姿不确定的情况下,仅利用图像信息去解数据关联问题。所以直接法更擅长求解连续图像的定位,而特征点法则更适合回环检测与重定位。此外,稀疏直接法更适用于实时性较高而计算资源有限的场合。

3. 特征点法和直接法的BA有何不同

误差函数不同。特征点法是重投影误差,直接法是光度误差
雅克比矩阵不同

4. 光流法和直接法有何不同

光流法仅估计了像素间的平移,但没有使用相机结构,没有考虑相机的旋转和图像缩放,边界点追踪效果差;

5. 单目、双目和深度相机对比

  • 单目:成本低,搭建简单,但有尺度不确定性,需要专门初始化
  • 双目:不需要专门初始化,能计算深度,基线距离越大,测量距离越远,可以用于室内外,但标定较为复杂,视差计算比较浪费计算资源。
  • 深度:测量范围窄,噪声大,易受日光干扰,无法测量透射材料,主要用于室内

6. 常用的边缘检测算子和优缺点

边缘检测一般分为三步:分别是滤波、增强、检测。基本原理都是用高斯滤波器进行去噪,之后再用卷积内核寻找像素梯度。常用以下三种

  • canny算子:一种完善的边缘检测算法,抗噪能力强,用高斯滤波平滑图像,用一阶偏导的有限差分计算梯度的幅度值和方向,对梯度幅值进行非极大抑制,采用双阈值检测和连接边缘。
  • sobel算子:一阶导数算子,引入局部平均运算,对噪声具有平滑作用,抗噪声能力强。计算量较大,但定位精度不高,得到的边缘比较粗,适用于精度要求不高的场合。
  • laplacian算子:二阶微分算子,具有旋转不变性,容易受噪声影响,不能检测边缘的方向,一般不直接用于检测边缘,而是判断明暗变化。

7. RANSAC方法

此算法的基本假设是样本中既存在正确数据,也存在异常数据。然后假设给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。算法优点是可以鲁邦的估计模型参数,即从大量包含外点的数据中估计出高精度的参数;缺点则是它计算参数的迭代次数没有上限,如果认为设置上限,可能得到的结果不是最优的,甚至是错误的结果。
RANSAC算法在slam中主要用于剔除误匹配。其目的是找到最优的单应矩阵H使得满足该矩阵的数据点个数最多,其中求H或者orbslam中求F都是采用八点法:ransac具体算法步骤:

8. PROSAC算法

此算法是ransac算法的改进,其主要引入了对匹配点对的评估函数Q。评估函数主要功用是用来评价匹配点对的质量(或者叫对模型的相关程度),通常计算匹配点对描述子的欧氏距离为该点对的质量,得到质量后便有以下步骤计算:

  1. 把匹配点对按其质量高低降序排序,选取质量大于阈值的n个数据;
  2. 从n个点对中随机剔除m个,用剩余的点对来拟合计算模型(单应矩阵H),记录与该模型的距离小于一定阈值的点对个数,即为内点个数;
  3. 若内点的数目大于设定阈值数目,则返回内点和模型,否则继续迭代,重复2;

9. 视差与深度的关系?视差出现在单目中是为什么?

视差与深度的关系就是那个算视差的图;视差在单目系统中可以用于初始化和判断是否关键帧。初始化是看相机是否产生了有效的移动;判断是否关键帧也是类似原理。

10. 八点法原理和过程

在对极几何中,F是3x3,但是因为F存在尺度等价性和不满秩两个约束,故自由度为7,所以理论上只需要7对点,然而该结果可能会给出F的3个解,且所有3个解都要通过检验来选择。因此通常会选择8对点来构建超定方程,然后通过最小二乘,并添加强迫约束来求解。

11. Eigen库在class中的那个宏定义EIGEN_MAKE_ALIGNED_OPERATOR_NEW

  • 作用:用于在EIgen的C++库中启用对齐内存分配
  • 原因概述:Eigen是一个流行的C++线性代数库,提供了一套用于向量和矩阵操作的类和函数。对齐内存分配对于在具有SIMD(单指令多数据)指令(如Intel的SSE和AVX)的现代处理器上进行高效计算至关重要。默认情况下,C++使用new运算符为对象分配内存。然而,通过new分配的内存不能保证按照SIMD指令的要求进行对齐。这可能导致使用Eigen进行矢量化计算时性能下降。为了解决这个问题,Eigen提供了EIGEN_MAKE_ALIGNED_OPERATOR_NEW宏。当在类定义中使用此宏时,它会重载该类的new和delete运算符,确保为Eigen类型正确对齐内存分配。通常将此宏放置在类的私有部分

12. 直接法估计相机位姿时,并不需要提取特征点,而是通过优化匹配点的像素值误差(也称光度误差)估计位姿,但会面临快速运动,光照变化等的挑战,如果让你改善该问题,你会采用哪些方法来提高跟踪质量(精度,速度,鲁棒性等)?

从算法角度来说,通常会采用图像金字塔方式,按照从粗到细的方式迭代计算位姿,首先对待匹配的两幅图做分层抽样,先对层数高的、图像尺寸小的层进行匹配,将匹配的结果作为初始值,继续匹配图像尺寸大的层。
另外,在粗配准时,通过将图像中的高频信息滤掉,可以降低因为相机大的移动造成的锯齿效应的影响,并且可以增大算法的在相机移动距离较大时算法的收敛性。

13. 简述一下你对卡方检验的理解。

卡方检验是一种用途很广的计数资料的假设检验方法。属于非参数检验,主要是比较两个及两个以上样本率(构成比)以及两个分类变量的关联性分析。根本思想在于比较理论频数和实际频数的吻合程度或者拟合优度问题。
ORB-SLAM中卡方检验的作用:当事实与期望不符合情况下使用卡方分布用来检验拟合程度和两个变量的独立性。在ORB-SLAM中卡方检验用来检测剔除外点

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

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

相关文章

【Vue3】watch 监视 ref 定义的数据

【Vue3】watch 监视 ref 定义的数据 背景简介开发环境开发步骤及源码参数说明 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努…

【C++进阶学习】第八弹——红黑树的原理与实现——探讨树形结构存储的最优解

二叉搜索树:【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 AVL树: ​​​​​​【C进阶学习】第七弹——AVL树——树形结构存储数据的经典模块-CSDN博客 前言: 在前面,我们已经学习了二叉搜索树和…

PCIe 6.0为什么需要14-bit tag

1.TLP中的tag是什么 在PCIe TLP(Transaction Layer Packet)中,tag是分配给特定Non-Posted Request的编号,协议要求CPL/CPLD中的tag 与对应non-post request TLP中的tag保持一致,因此Requester可以使用tag来识别CPL…

Windows通过命令查看mac : getmac

要查看本机网卡mac,可以通过ipconfig /all 显示,但输出内容过多 可以通过getmac命令查看 示例 C:\Users\Desktop> getmac物理地址 传输名称暂缺 没有硬件 1C-1B-B5-04-E2-7D \Device\Tcpip_{80096E40-D51D-490C-9AF7-…

Java 扫雷游戏

程序分析 使用Java编写的扫雷游戏界面程序,主要内容总结如下: Frame类继承自JFrame,构建了扫雷游戏的界面。 包含文本框text、标签nowBomb和setBomb、按钮start、面板MenuPamel和bombPanel等组件。通过jbInit方法进行初始化设置,…

note24:表分区规范

目录 分区设计原则 分区维护 存储方式及分布键规范 分区设计原则 表分区用于解决数据量特别大的表的问题,比如事实表,解决办法就是将表分成很多小且更容易管理的部分。 表分区参考以下几个原则 (1)表是否足够大?…

免费【2024】springboot 趵突泉景区的智慧导游小程序

博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

MATLAB基础:数组

今天我们继续学习MATLAB中的数组 我们在学习MATLAB时了解到,MATLAB作者秉持着“万物皆可矩阵”的思想企图将数学甚至世间万物使用矩阵表示出来,而矩阵的处理,自然成了这门语言的重中之重。 数组基础 在MATLAB中,数组是一个基本…

十、SpringBoot 统⼀功能处理【拦截器、统一数据返回格式、统一异常处理】

十、SpringBoot 统⼀功能处理 1. 拦截器【HandlerInterceptor、WebMvcConfig】1.1 拦截器快速⼊⻔⾃定义拦截器:实现HandlerInterceptor接⼝,并重写其所有⽅法注册配置拦截器:实现WebMvcConfigurer接⼝,并重写addInterceptors⽅法…

堆(c++)

堆是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。 堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。 常见的堆有二叉堆、斐波那契堆等。 堆是非线性数据结构&#…

初识C++ · map和set的使用

目录 前言: 1 set 2 map 前言: 在前面阶段,我们已经学习了stl里面的部分容器,比如vector,list,deque等,这些容器都被称为序列式容器,也就是每个值之间式没有关联的,那么今天介绍的容器&…

【笔记本触摸屏】超级好用技巧

选中文字:点一下要复制的文字开头,按住shift键不放,然后点一下你想要的文字结尾滚动:双指向 水平 或者 垂直 方向滑动放大或者缩小: 将两个手指放在触摸板上,让后收缩后者拉伸显示更多命令(类似于右键单击&…

四十九、 通过境内数据交易所进行跨境数据贸易应考虑哪些跨境数据合规问题?

根据中国信通院数据显示,2023 年我国数字经济规模可达 56.1 万亿元, 数字经济占 GDP 比重接近于第二产业,占国民经济的比重,达到 40%以上。伴随数字技术兴起以及各项数字经济相关的政策和法律的落地,以跨境数据流动为底层支撑的跨…

智能音箱和普通音箱有什么区别

智能音箱和普通音箱在多个方面存在显著的区别,主要包括设计目的、功能特点、连接方式、音质表现以及交互方式等。 一、设计目的和功能特点 智能音箱:设计目的不仅仅是为了播放音乐,更重要的是集成了语音识别和语音交互功能,成为…

IGV.js | 载入自己下载的gtf文件

1.安装 htslib-1.20 https://www.htslib.org/doc/tabix.html J3$ cd ~/Downloads/ $ wget https://github.com/samtools/htslib/releases/download/1.20/htslib-1.20.tar.bz2 $ tar jxvf htslib-1.20.tar.bz2编译安装: $ cd htslib-1.20/ $ ./configure --prefix/…

ts -> class -> abstract

在TypeScript中,你可以直接使用abstract关键字来定义抽象类和抽象方法。抽象类不能被实例化,而抽象方法必须在派生类中被实现。以下是一个具体的例子: abstract class Animal {name: string;constructor(name: string) {this.name name;}//…

C#中的Action

C#中的Action是一种委托类型,‌用于引用不返回值的方法。‌Action可以接受0到16个参数,‌并且不返回任何值。‌它是一种通用的委托类型,‌非常方便用于处理不同参数和不同函数签名的情况。‌Action的用法包括声明Action委托类型、‌创建Actio…

vue的三大核心知识点

响应式: 监听data属性getter setter(包括数组)模板编译: 模板到render函数再到vnodevdom: patch(elem, vnode)和patch(vnode, newVnode) vue组件初次渲染过程 解析模板为render函数(或在开发环境已完成,vue-loader&a…

WIX Toolset 3.11 对本地化的支持方案

1.准备主题文件和本地化文件 WIX Toolset种主题文件为xml文件,负责配置控件的布局, 本地化文件为wxl文件,负责配置待加载的字符串,主题文件根据ID加载需要显示的文字内容。考虑到英文和中文字符长度大小不一,所以这里…

渗透测试——prime1靶场实战演练{常用工具}端口转发

文章目录 概要信息搜集 概要 靶机地址:https://www.vulnhub.com/entry/prime-1,358 信息搜集 nmap 扫网段存活ip及端口 找到除了网关外的ip,开放了80端口,登上去看看 是一个网站,直接上科技扫一扫目录 python dirsearch.py -u …