视觉里程计VO-特征点法

摘要:
视觉里程表的主要问题是如何基于图像来估计相机运动。根据是否需要提取特征,VO实现方法分为特征点法的前端和无特征提取的直接法的前端。基于特征点的前端方法一直被认为是视觉里程表的主流方法。它运行稳定,对光和动态对象不敏感。这是目前比较成熟的解决方案。计算机视觉邻域的研究人员设计了许多比角点更稳定的局部图像特征,如SIFT、SURF、ORB等。ORB特征是目前非常有代表性的实时图像特征。

视觉里程计的主要问题是如何根据图像来估计相机运动,VO的实现方法,按照是否需要提取特征,分为特征点法的前端以及不提取特征的直接法前端。基于特征点法的前端,长久以来被认为是视觉里程计的主流方法,它运行稳定,对光照、动态物体不敏感,是目前较为成熟的解决方案。

计算机视觉邻域的研究者们,设计了许多比角点更加稳定的局部图像特征,比如SIFT,SURF,ORB等。特征点由关键点(Key-point)和描述子(Descriper)两部分组成。SIFT(Scale Invariant Feature Transform 尺度不变特征变换)计算量大,普通 PC 的 CPU还无法实时地计算 SIFT 特征,进行定位与建图。所以在 SLAM 中我们甚少使用这种“奢侈”的图像特征。ORB(Oriented FAST and Rotated BRIEF)特征则是目前看来非常具有代表性的实时图像特征。它改进了 FAST 检测子 不具有方向性的问题,并采用速度极快的二进制描述子BRIEF,使整个图像特征提取的环节大大加速。

根据匹配点对,估计相机运动

1. 当相机为单目时,我们只知道 2D 的像素坐标,因而问题是根据两组 2D 点估计运动。该问题用对极几何来解决。
2. 当相机为双目、RGB-D 时,或者我们通过某种方法得到了距离信息,那问题就是根据两组 3D 点估计运动。该问题通常用 ICP 来解决。
3. 如果我们有 3D 点和它们在相机的投影位置,也能估计相机的运动。该问题通过 PnP求解。

 2D-2D对级几何

视觉里程计VO-特征点法第1张

视觉里程计VO-特征点法第2张

 本质矩阵E由于满足对级约束,所以E满足尺度等价性,矩阵E具有5个自由度,表明我们可以最少使用5对点来计算E矩阵,但是E的内在非线性性质使得求解线性方程时比较麻烦。可使用经典的8点法在线性框架下求解。

视觉里程计VO-特征点法第3张

 视觉里程计VO-特征点法第4张

 求得E后,根据奇异值分解,恢复相机的R,t

单应矩阵H

单应矩阵描述了两个平面之间的映射关系,如果场景中的特征点都位于同一平面上,则可以通过单应性来进行运动估计。

视觉里程计VO-特征点法第5张

 openCV相关函数:

findFundamentalMat()  计算基础矩阵

findEssentialMat()  计算本质矩阵

findHomography()  计算单应矩阵

recoverPose()  从本质矩阵中恢复旋转和平移

triangulatePoints()  通过三角化计算空间点位置

3D:2D PnP

PnP(Perspective-n-Point)描述了当我们知道了n个3D空间点以及它们的投影位置时,如何估计相机所在的位姿。PnP不需要使用对极约束,可以在很少的匹配点中获得较好的运动估计,是一种重要的姿态估计方法。

PnP求解有很多求解方法,如仅用三对点估计的P3P,直接线性变换DLT,非线性优化Bundle Adjustment。SLAM中通常的做法是先使用P3P/EPnP等方法估计相机位姿,然后构建最小二乘优化问题对估计值进行调整(Bundle Adjustment)

Bundle Adjustment

Bundle Adjustment是一个最小化重投影误差的问题,同时对位姿和空间点进行优化。

视觉里程计VO-特征点法第6张

  openCV相关函数:

solvePnP()  Finds an object pose from 3D-2D point correspondences. This function returns the rotation and the translation vectors that transform a 3D point expressed in the object coordinate frame to the camera coordinate frame.

3D-3D ICP

可采用SVD方法以及非线性优化方法

免责声明:文章转载自《视觉里程计VO-特征点法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Access-Control-Allow-Origin,Reason: Multiple CORS header 'Access-Control-Allow-Origin' not allowedvue3.0用vue-awesome-swiper下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

opencv 仿射变换 投射变换, 单应性矩阵

仿射 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变。 getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6. warpAffine():对输入图像进行仿射变换 estimateAffine3D...

RNN学习笔记

传统的语言模型在预测序列中的下一个单词时只会考虑到前面的有限个单词,RNN与之不同,RNN网络会根据前面已经出现的所有输入来调整整个网络。下图是RNN网络的典型结构: Xt表示在t时刻的输入,ht表示t时刻的隐藏层状态,yt表示t时刻的输出。每一个隐藏层都有许多的神经元,这些神经元将上一层的输入做线性变换(矩阵乘法,也就是乘以权重),然后再使用非线性激活...

使用numpy教你复习线性代数基础

楔子 下面我们来一起复习一下线性代数的基础知识,并同时使用numpy进行演示,所以需要你有一些关于numpy的知识(但不需要太多)。另外在线性代数中,存在行列式和矩阵,它们长得都差不多,都类似于二维表的格式。但是行列式要求其行数和列数必须相等,但是矩阵则没有此要求,而我们在创建在numpy中创建行列式和矩阵的时候均使用numpy.array这个函数,这个函...

消元法求解线性方程组

这里的消元法,主要是针对矩阵$A$可逆的情况下(如果$A$不可逆消元后不好回代),即线性方程组只有唯一解的情况下,有多解的情况的解法在后面介绍。 目前我们用于解线性方程组的方法依然是Gauss消元法。在Gauss消元法中,我们将右侧向量b与A写在一起作为一个增广矩阵进行同步的操作,这就默认了对A与b的操作数是相等的且每换一个b就要重复一遍对...

React Native拆包及热更新方案 · Solartisan

作者:solart 版权声明:本文图文为博主原创,转载请注明出处。 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行部分业务线的开发,也有不少使用 Hybrid 技术的公司转向了 React Native 。要说 React Native 最能吸引开发者的地方那就是其拥有前...

零基础入门深度学习(5)

无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就out了?现在救命稻草来了,《零基础入门深度学习》系列文章旨在讲帮助爱编程的你从零基础达到入门级水平。零基础意味着你不需要太多的数学知识,只要会写程序就行了,...