DSO之光度标定
光度标定(Photometric Camera Calibration)是DSO(Direct Sparse Odometry)论文中比较特别的一部分。常规的vSLAM不太考虑光度标定的问题。比如基于特征点的vSLAM,由于特征描述一般会有光照不变性,对图像的亮度值并不敏感。而在直接法(direct method)中,由于姿态估计以图像的亮度值为出发点,亮度值的准确度会影响算法的精度和稳定性。因此,作者引入了光度标定的概念,利用精细的相机成像模型,标定成像过程中的光度参数,并用这些参数校正图像亮度值。
由于本人不是光学专业,文中难免有不准确的地方,还望大家不吝赐教。
参考文献
- Direct Sparse Odometry
- A Photometrically Calibrated Benchmark For Monocular Visual Odometry
- Recovering High Dynamic Range Radiance Maps fromPhotographs
- What is the Space of Camera Response Functions?
- Wikipedia
相机成像原理
一般而言,相机测量的是场景中的光的辐射度(radiance)。成像过程如下图[3]。

radiance用来描述物体表面单位面积上的能量分布,和方向有关。
In radiometry, radiance is the radiant flux emitted, reflected, transmitted or received by a surface, per unit solid angle per unit projected area. For example, radiance in direction of the optical axis of a LED is higher than it's radiance at an angle of 15°.
irradiance用来描述物体表面单位面积总的入射能量,和方向无关。比如,用来描述传感器像元的入射光强(来自于不同方向的环境光的累加)。
In radiometry, irradiance is the radiant flux (power) received by a surface per unit area. Irradiance commonly is used referring to power incident on a surface.
下面详细分析一下各个模块的影响。
光学(镜头和光圈)
除了大家熟悉的小孔成像模型和畸变模型,还会有晕影(vignetting)。以下摘自wiki。
光学晕影是由一个或多个透镜的实际尺寸造成的,后方的元件遮蔽了前方的,导致前端透镜离轴的有效入射光减少,结果是光的强度由图像中心向周围逐渐减弱。光学晕影对镜头的开口相当敏感,只要适当的调整光圈就可以消除,通常缩小2至3格就可以完全消除。
也就是说,假如拍摄一个亮度非常均匀的物体,图像中心和边缘的亮度值并不一致。
如果这些因素都没有影响,那么从scene radiance到sensor irradiance的转化是线性的。

快门
快门影响的是曝光时间。自动曝光模式下,不同场景曝光时间并不一样,会导致同一物体在不同场景下的灰度值产生差异。另外还想提到的是全局快门(global shutter)和卷帘快门(rolling shutter)。全局快门保证所有感光元件的曝光起始时间和间隔是一样的,卷帘快门并不能保证。因此文献中一般推荐使用全局快门。
传感器
传感器(CCD/CMOS)将每个像元接收到的光子通过一系列处理转化为亮度值。这里面涉及到光电效应、ADC、DSP等过程。输入的曝光量和输出的亮度值之间的关系称为响应函数(response function)。响应函数一般来说是非线性的,甚至包含人为调整的成分,比如伽马校正、白平衡、色调、饱和度等。为图像进行伽马编码的目的是用来对人类视觉的特性进行补偿,从而根据人类对光线或者黑白的感知,最大化地利用表示黑白的数据位或带宽。人眼对暗部比较敏感,因此一般选择提高暗部的分辨率。这些因素会非线性地修正曝光量,因此作者希望通过光度标定来补偿它们的影响。
论文解析
下面我们来看看作者在DSO中如何排除这些因素的影响。作者采用的数据集中有两个镜头,一个鱼眼一个广角。上一节提到的三个因素都有影响。
- 用函数V来表示光学模块的影响。V是光学模块的固有属性,作者用一个权重矩阵(和图像一样大)来表示其对每个像元的影响。
- 用t来表示曝光时间。相机有开启自动曝光时,每一帧的t都不相同。
- 用函数G来表示响应函数,其值域是离散的(比如0~255)。G是传感器的固有属性。
用B表示不受光学模块影响的sensor irradiance图像,I表示输出的图像,作者提出的成像模型为(参考文献1式(2))

标定响应函数
响应函数有几种常见的参数模型,比如线性、伽马和基函数。而作者用非参数估计的方法来标定。具体而言,在固定场景下,相机在不同曝光时间下,重复拍照得到一系列图像。由于场景不变,B在不同图像中是一样的,图像亮度值的差异来源于曝光时间和响应函数。因此,作者构建了一个能量误差函数,用迭代的方法求解U=G^{-1}。其中待求解变量为B和U。每步迭代中,先用估计的U求解B,然后用更新的B求解U。具体细节参见文献2第2.3.1节。
实验中,作者采集了1000幅不同曝光的图像,其中的5幅见下图。

文献2图3提供了作者标定出的gamma校正曲线。蓝色是有gamma校正的结果,绿色是没有gamma校正的结果。

标定晕影
假设响应函数G已经标定好了。作者通过大量图像数据,迭代估计V的值。具体而言,从不同角度重复拍摄一个 Lambertian surface,得到一系列图像。作者选择了白墙作为Lambertian surface。理想光照下,墙上的每个点在不同角度下的radiance是均匀的,因此B在不同图像中是一样的。作者并不要求白墙的亮度均匀,因此B中每个点的值是不一样的。场景见下图

利用响应函数的逆得到B'=V*B。作者构建了一个能量误差函数,用迭代的方法求解V。其中待求解变量为B和V。每步迭代中,先用估计的V求解B,然后用更新的B求解V。具体细节参见文献2第2.3.2节。
从不同角度拍摄时,白墙上不同位置的三维点相对于镜头的位置是不一样的,晕影的影响也不一样。因此需要将白墙变换到相机坐标系,引入了姿态估计的问题。作者用了一个AR marker来估计姿态。
文献2中,作者采集了700幅图像,其中的4幅见下图。

文献2图4给出了两个不同镜头模组的晕影。

有光度标定时的处理
通过标定V和G,就可以反解出B(参考文献1式(3))。使用B去做直接法当然要比I准确地多。当然,场景的亮度在不同视角下有差异,这是无法避免的。

一般情形
对于做过光度标定的相机,我们可以用上面的方法处理。对于一般的相机怎么办呢?作者在估计姿态的同时,还估计图像校正参数,用于粗略去除响应函数的影响。具体做法是加入一个affine brightness transfer function。个人理解,这个affine brightness transfer function其实是线性响应函数的逆函数。(似乎也可看做是一种归一化的方式)

这个函数可以校正曝光时间(正比于e^{-a_i})和图像亮度基底(b_i)的影响。晕影不太好建模,作者暂时没有考虑。
因此,总的姿态估计的目标函数为

这里的I指的是校正过的亮度值。当没有光度标定时,G=V=t=1,因此I就是输出图像本身。有光度标定时,I=t*B。
作者还加入正则项来平衡有无光度标定的影响。

当有光度标定时,a_i和b_i可以设为0,也可以不为0(相当于额外的校正,正则项限制了它们不会很大)。当没有光度标定时,lambda_a和lambda_b均为0,也就是说,a_i和b_i不做任何限制,均作为待求参数参与优化。另外,当lambda_a和lambda_b均为无穷时,a_i和b_i必须为0,因此不会优化图像校正的参数(即参考文献1图14中的brightness constancy)。光度标定参数的影响见参考文献1第4.2小结。

思考:一般情形下,是否可以用伽玛响应函数代替线性响应函数?只需要一个额外的参数就可以模拟非线性的情形。
小结
推荐大家有时间看一下参考文献2。想发自内心地吹一波,Engel他们的工作做得真是太细致了。
DSO之光度标定的更多相关文章
- DSO 运行 —— dso_ros + Android 手机摄像头
转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12425855.html 本文要点: dso 配置安装 dso 离线 ...
- 漫谈 SLAM 技术(上)
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:解洪文 导语 随着最近几年机器人.无人机.无人驾驶.VR/AR的火爆,SLAM技术也为大家熟知,被认为是这些领域的关键技术之一.本文对S ...
- SLAM、三维重建,语义相关数据集大全
作者朱尊杰,公众号:计算机视觉life,编辑成员 一 主要针对自动驾驶: 1.KITTI数据集: http://www.cvlibs.net/datasets/kitti/index.php(RGB+ ...
- DSO 代码框架
从数据流的角度讲一遍 DSO 代码框架. DSO 的入口是 FullSystem::addActiveFrame,输入的影像生成 FrameHessian 和 FrameShell 的 Object, ...
- Paper Reading: Stereo DSO
开篇第一篇就写一个paper reading吧,用markdown+vim写东西切换中英文挺麻烦的,有些就偷懒都用英文写了. Stereo DSO: Large-Scale Direct Sparse ...
- DSO windowed optimization 代码 (1)
这里不想解释怎么 marginalize,什么是 First-Estimates Jacobian (FEJ).这里只看看代码,看看Hessian矩阵是怎么构造出来的. 1 优化流程 整个优化过程,也 ...
- DSO论文解读
dso 1.1. Motivation 本文提出的单目视觉测距法的直接和稀疏公式是出于以下考虑因素; (1)直接: 关键点的主要优点之一是它们能够为使用现成的商品相机拍摄的图像中存在的光度和几何失真提 ...
- DSO 优化代码中的 Schur Complement
接上一篇博客<直接法光度误差导数推导>,DSO 代码中 CoarseInitializer::trackFrame 目的是优化两帧(ref frame 和 new frame)之间的相对状 ...
- Omnidirectional DSO: Direct Sparse Odometry with Fisheye Cameras 论文摘要
1. Abstract 通过一种Unified Omnidirectional Model作为投影方程. 这种方式可以使用图像的所有内容包括有强畸变的区域,而现存的视觉里程计方案只能修正或者切掉来使用 ...
随机推荐
- java web学习总结(二十九) -------------------JavaBean的两种开发模式
SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...
- Nessus的安装(Linux)
Nessus有三种安装方式: 1.源文件安装 源文件安装是最复杂的安装方式,用此方式安装可以修改配置参数. 2.rpm安装 rpm安装比起源文件安装更简单一些,它已经把一些底层的东西写好了,用户只要按 ...
- sqlite索引的原理
引言 这篇文章,里面讲到对于一个41G大小.包含百万条记录的数据库进行查询操作,如果利用了索引,可以把操作耗时从37s降到0.2s. 那么什么是索引呢?利用索引可以加快数据库查询操作的原理是什么呢? ...
- Titanium.App.Properties 对象
Titanium.App.Properties是用来管理键值对数据的一个很方便的对象.在保存数据的时候,在Ti.App.Properties.setString相对应的Key的值中设置你要保存的值即可 ...
- android Activity介绍
一般情况下,Android程序的流程都运行在activity中,activity具有自己的生命周期,由系统来控制.可以使用onSaveInstanceState()和onRestoreInstance ...
- 易企秀微场景2016最新完整版V10.5,小编亲测修复众多错误
易企秀V10.5更新说明1.修复拨号英文错误2.修复转送场景问题3.修复设置场景密码乱码问题4.修复前台批量删除客户图片5.修复数据收集分页问题6.修复图片分类错乱问题7.修复音乐和特效冲突问题8.修 ...
- 【代码笔记】iOS-正在加载
一,效果图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...
- SQL优化技术分析-4:其他
ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,有时如果 出于成本方面的考虑ORACLE也可能不会按提示进行.根据实践应用,一般不建议开发人员应用O ...
- Hibernate 系列 04 - Hibernate 配置相关的类
引导目录: Hibernate 系列教程 目录 前言: 通过上一篇的增删改查小练习之后,咱们大概已经掌握了Hibernate的基本用法. 我们发现,在调用Hibernate API的过程中,虽然Hib ...
- JAVA编程思想(第四版)学习笔记----11.4 容器的打印
import static java.lang.System.out; import java.util.ArrayList; import java.util.Collection; import ...
