视觉SLAM中的深度估计问题
一、研究背景
视觉SLAM需要获取世界坐标系中点的深度。
世界坐标系到像素坐标系的转换为(深度即Z):

深度的获取一共分两种方式:
a)主动式
RGB-D相机按照原理又分为结构光测距、ToF相机

ToF相机原理
b)被动
被动式无法精确得到点的深度值,因此存在深度的估计问题,按照主流相机的种类可以分为双目相机估计以及单目相机估计。
接下来详细介绍双目系统以及单目SLAM系统的深度估计问题
二、双目系统
双目相机模型如下图所示:

(图源《视觉SLAM十四讲》)

要计算深度z,需要已知世界坐标系中一点在左相机与右相机中对应的像素坐标UL与UR,即视差d。
获取d关键在于双目匹配,即左相机与右相机中的像素坐标对应的世界坐标系中的同一点。
举例:
- ORB-SLAM2基于特征点获取视差:FAST特征点+BREIF算子。

- 块匹配算法(对图像灰度值的操作)
- SAD(Sum of Absolute Difference)
- SSD(Sum of Squared Distance)
- NCC(Normalized Correlation)
得到匹配到的像素必须满足通过对极约束:

三、单目相机
针孔相机模型为:

相机坐标系下为(xC,yC,zC),像素坐标系为(u,v),归一化坐标系为(u0,v0)
3.1 三角化估计深度
通过两处观察同一个夹角,从而确定该点的距离

在通过对极几何求得R,t后,R,t已知


通过优化方法可求得上式中右边的最小二乘解,三角化的矛盾:平移增大,测量的精度会变高,但是可能会导致匹配失效。
ORB-SLAM单目中的三角化代码如下,可作参考:
void Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D)
{
cv::Mat A(,,CV_32F);
A.row() = kp1.pt.x*P1.row()-P1.row();
A.row() = kp1.pt.y*P1.row()-P1.row();
A.row() = kp2.pt.x*P2.row()-P2.row();
A.row() = kp2.pt.y*P2.row()-P2.row();
cv::Mat u,w,vt;
cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);
x3D = vt.row().t();
x3D = x3D.rowRange(,)/x3D.at<float>();
}
3.2 深度滤波器
本质上为卡尔曼滤波估计深度
假设深度服从某种分布,最后深度的方差不断减少并收敛
以SVO为例:
SVO估计深度流程如下:

SVO中点服从高斯均匀分布:

点深度满足分布:



3.3 与监督学习结合

[]Tateno, K., Tombari, F., Laina, I., & Navab, N. (, July). CNN-SLAM: Real-time dense monocular SLAM with learned depth prediction. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) (Vol. ).
[] Eigen D, Fergus R. Predicting depth, surface normals and semantic labels with a common multi-scale convolutional architecture[C]//Proceedings of the IEEE International Conference on Computer Vision. 2015: 2650-2658.
3.4 与非监督学习结合

总结一下思想:

矩阵T21的估计值,深度估计网络根据单目图像,输出深度的估计值。该值再结合左右视图的变换矩阵TLR,以及相机的内参K,可以从左图重构出右图,还可以把左图的特征映射到右图。重构图和特征与真值的差异构成了损失函数,利用反向传播算法可以不断优化网络。
Zhan, H., Garg, R., Weerasekera, C. S., Li, K., Agarwal, H., & Reid, I. (, March). Unsupervised Learning of Monocular Depth Estimation and Visual Odometry with Deep Feature Reconstruction. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. -).
3.5 与半监督学习结合

监督学习部分 ground-truth depth由激光雷达提供,无监督学习部分由双目相机的图像训练。损失函数的构成:预测深度与groud-truth的差,左图与右图+左深度图重构的左图的光度误差,右图与左图重构的光度误差,泛化损失:对深度和灰度求梯度。
Kuznietsov, Y., Stückler, J., & Leibe, B. (, July). Semi-supervised deep learning for monocular depth map prediction. In Proc. of the IEEE Conference on Computer Vision and Pattern Recognition (pp. -).
四、总结

视觉SLAM中的深度估计问题的更多相关文章
- 视觉SLAM中相机详解
视觉SLAM中,通常是指使用相机来解决定位和建图问题. SLAM中使用的相机往往更加简单,不携带昂贵的镜头,以一定的速率拍摄周围的环境,形成一个连续的视频流. 相机分类: 单目相机:只是用一个摄像头进 ...
- 视觉SLAM中的数学基础 第三篇 李群与李代数
视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换 ...
- Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一
Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...
- 视觉SLAM中的数学基础 第二篇 四元数
视觉SLAM中的数学基础 第二篇 四元数 什么是四元数 相比欧拉角,四元数(Quaternion)则是一种紧凑.易于迭代.又不会出现奇异值的表示方法.它在程序中广为使用,例如ROS和几个著名的SLAM ...
- 第六篇 视觉slam中的优化问题梳理及雅克比推导
优化问题定义以及求解 通用定义 解决问题的开始一定是定义清楚问题.这里引用g2o的定义. \[ \begin{aligned} \mathbf{F}(\mathbf{x})&=\sum_{k\ ...
- 视觉SLAM中的数学基础 第四篇 李群与李代数(2)
前言 理解李群与李代数,是理解许多SLAM中关键问题的基础.本讲我们继续介绍李群李代数的相关知识,重点放在李群李代数的微积分上,这对解决姿态估计问题具有重要意义. 回顾 为了描述三维空间里的运动,我们 ...
- 视觉SLAM关键方法总结
点"计算机视觉life"关注,置顶更快接收消息! 最近在做基于激光信息的机器人行人跟踪发现如果单独利用激光信息很难完成机器人对行人的识别.跟踪等功能,因此考虑与视觉融合的方法,这样 ...
- 《视觉SLAM十四讲》学习日志(二)——初识SLAM
小萝卜机器人的例子: 就像这种机器人,它的下面有一组轮子,脑袋上有相机(眼睛),为了让它能够探索一个房间,它需要知道: 1.我在哪——定位 2.周围环境怎么样——建图 定位和建图可以理解成感知的 &q ...
- 《视觉SLAM十四讲》第2讲
目录 一 视觉SLAM中的传感器 二 经典视觉SLAM框架 三 SLAM问题的数学表述 注:原创不易,转载请务必注明原作者和出处,感谢支持! 本讲主要内容: (1) 视觉SLAM中的传感器 (2) 经 ...
随机推荐
- QTP基本方法4------手动写入信息到测试结果报告中
可以使用写代码的方式添加结果信息到测试结果报告中. 结构:reporter.ReportEvent result,object,details,path result:状态:4种状态:micPass. ...
- iOS之UIButton扩大按钮的响应区域
在开发中有时会遇见设计图里按钮设计的特别小,这时会用到手动扩大UIButton的响应范围,下面有两个解决办法: 第一种方法:创建一个类目:UIButton+EnlargeTouchArea .h文件 ...
- js基础(闭包)
1. "闭包就是跨作用域访问变量." [示例一] var name = 'wangxi' function user () { // var name = 'wangxi' fun ...
- #leetcode刷题之路24-两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表.你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3->4, 你应该返回 2-> ...
- makefile中的一些参数说明
#obj = main.o sub.o add.o div.o mul.osrc = $(wildcard *.c) #搜索.c文件 可以加路径 obj = $(patsubst %.c, %.o, ...
- vue-网易云音乐
vuejs仿写网易云音乐webapp 1.项目API来源 2.项目地址 3.项目主要截图 4.功能 音乐播放,搜索及主要页面的展示,用户登录部分及登录后才能获取的数据还未实现 5.技术 ...
- mysql如何批量删除数据表
-- 注意这里的`是英文输入法状态下,主键盘数字1的左边的键.drop table `user`,`c_class`;
- ElasticSearch优化系列五:机器设置(硬盘、CPU)
硬盘对集群非常重要,特别是建索引多的情况.磁盘是一个服务器最慢的系统,对于写比较重的集群,磁盘很容易成为集群的瓶颈. 如果可以承担的器SSD盘,最好使用SSD盘.如果使用SSD,最好调整I/O调度算法 ...
- T+API实现
目前用友的T+,官方提供了APi给用户直接调用,但是必3须申请,而且还必须是企业用户,估计是收费的. 这边接到一个开发外包,调用其他应用的数据同步到t+里,我首先想到的就是直接调用t+提供的APi,这 ...
- 05.kafka提前准备工作:搭建zookeeper集群环境
总体参考:http://www.cnblogs.com/zhangs1986/p/6564839.html 搭建之间同步下spark01.02.03的环境 复制/opt/flume这个文件夹到 spa ...