bundle adjustment算法学习

  今天学习了稀疏的光束平差法,基于上一篇博文Levenberg–Marquardt算法学习,这里对学习内容做一个理论梳理。本次内容包括:

  • BA简介
  • BA迭代步长的数学推导
  • 稀疏BA迭代步长的算法求解过程

1.BA简介

   摄像机在静态环境中移动,得到不同时刻拍摄的多幅图像。假设这些图像是同一刚性物体的投影,则可由图像特征对应关系估计出摄像机的运动参数。在计算机视觉中 ,这一过程称为运动分析或由运动重建物体结构(structure frommotion)。

   Bundle Adjustment即光束平差法,作为SFM这种多视重建视觉算法的最后一步,它利用LM算法使得观测的图像点坐标与预测的图像点坐标之间的误差最小。若给定图像特征点的对应关系及初始三维点,BA可以同时精化这些特征点对应的3D坐标及相应的相机参数。

   Bundle Adjustment的名字由来于空间中每个物点和相机光学中心“发射”出的光束,人们可以根据这些光束对结构和视角参数进行调节,获得空间结构及视角参数的最优解。

2.BA迭代步长的数学推导

   以下推导来自对希腊人论文的翻译:”The Design andImplementation of a Generic Sparse Bundle Adjustment Software Package Based onthe Levenberg-Marquardt Algorithm”
   假设空间中有n个三维物点,现在围绕这些物点拍摄了m张照片,则第j张图片上看到的第i个物点为xij。Bundle adjustment旨在优化初始多个相机与结构的参数估计,以便于找到合理的参数使得我们能够精确计算出m张照片中n个物点的空间坐标。更具体的说,每个相机j用向量aj表示(内参和外参),每个三维物点i用向量bi表示。为了简化问题,假设现在所有的图片中能看到所有物点(不看到也没关系,后边的矩阵相应位置为0呗)。BA的核心问题就是最小化下面的重投影误差函数(非线性):

  函数Q(aj,bi)表示物点bi在相机aj下的投影坐标,也是我们的预测值。函数d(x,y)表示观测的图像坐标与预测的图像坐标之间的欧氏距离。

  现在我们用向量P代表m个投影矩阵和n个三维物点所有参数:

    J是关于投影关系f的雅各比矩阵,是迭代步长,使得我们获取合理的P让残差函数最小(阻尼因子的处理见后文)。上述方程同之前LM算法那篇文章里的迭代公式几乎一样(因为此处的协方差矩阵是单位矩阵)。此外由于各个照片与三维物点之间的参数没有交集,我们发现上述公式其实是非常稀疏的。简便期间,我们举个简单的例子:

    假设现在有m=3张照片拍摄了n=4个物点,即观测坐标X与参数几何P分别为:

  由于各个照片与三维物点之间的参数没有交集,比如对于不属于当前相机的二维图像坐标的偏导数为0,对于不属于当前三维物点投影的二维图像坐标的偏导数为0

  那么对于投影函数关系X’=f(P),它的偏导数集合,也就是雅可比矩阵J可以写成:

观测矩阵X的协方差矩阵是对角块结构的:

将协方差矩阵和雅可比矩阵代入LM的迭代方程,方程的左边将是如下形式:

若定义:

  则LM迭代公式的左侧可以写成:

 LM迭代公式的右边为:

若定义:

    完整的LM迭代公式如下:

再次简化,如果定义:

  那么迭代方程可以进一步简化成:

  将U*,W,V*代入(1),那么(1)的左边为:

    反过来倒过去的定义,只是为了公式更清晰的展示,发现规律:我们发现对于任意数量的n物点和m照片均可以求解 LM的迭代步长。如果点k没有在照片l中出现,那么Akl=0并且Bkl=0.接下来我们介绍下基于LM的稀疏BA的迭代步长的算法流程。

3.稀疏BA迭代步长的算法求解过程

算法输入:

m个初始相机参数aj,j=1,…,m;n个初始三维物点坐标bi,i=1,…,n,观测的特征点坐标xij(第j张图第i个点),LM算法的阻尼因子μ

 

算法输出:

基于LM的稀疏BA的迭代步长的解

 

算法流程:

  计算偏导数矩阵,Q表示投影函数,i=1,…,n,j=1,…,m

 将Uj和Vi的主对角线元素上加上阻尼因子μ,我们得到Uj*和Vi

  计算Yij=WijVi*-1

  按照(1)(2)式计算LM迭代步长:

   现在有了迭代步长,我们把迭代步长的计算步骤嵌入标准的LM算法流程使得重投影残差最小。至于阻尼因子是否要用信頼域的方法,随便吧,已经够麻烦的了,反正代码用现成的接口opencv和openmvg都有。

下面是我的想法:

 BA的目标是帮我们求得相机参数和三维坐标,每次LM迭代修改的都是参数集合P(由相机内外参数和三维点坐标组成),而观测向量X每次都是恒定的。这里初始参数P0作用和LM博文中函数拟合的初始参数一样。

而初始参数P0是怎么获取的呢?

  当空间物体结构参数未知时,SFM问题可以分为两类:单目视觉下的二维特征对应和多目视觉下的三维特征对应。

  采用二维特征对应关系估计相对运动需要给定先验的空间尺度信息, 这为单目视觉里程计的实现带来一定的不便(就是拿个相机对着某个物体不同角度拍N张照片,计算的3D点都是假的)。如果相机已经标定,可以利用各个照片上特征点的对应关系,并在极几何性质帮助下,求出相机的外部参数R是真的,T只是方向,反推的3D点也是up-to-scale的。咱就利用这些东西作为初始P0.

  三维特征对应关系下求解运动估计问题的一般方法为: 首先采用双目或多目摄像机三维重建得到空间物体的三维数据; 然后由二维图像特征对应关系建立空间物体的三维特征对应, 进而进行三维运动问题求解. 三维数据的信息量远高于二维图像, 因此三维运动估计问题的求解大为简化. 但是, 由于立体视觉中三维重建过程对像素误差有放大作用, 三维运动估计的结果对图像点误差非常敏感, 需要采取一定的措施对三维重建结果进行优化以提高运动估计精度。我认为双目测距由于baseline已知,咱可以根据disparity恢复出真正的3D坐标。然后各个相机之间的RT,同样利用之前的极几何性质,可以求出来。然后把相机参数和3D坐标作为初始值P0.

  另外,BA所使用的每张图片的二维特征点和图片像素比起来是稀疏的,所以最终还原的三维空间也是稀疏的,只能看个大概。

时间: 2025-01-31 05:52:42

bundle adjustment算法学习的相关文章

Levenberg–Marquardt算法学习

  本次是对Levenberg–Marquardt的学习总结,是为之后看懂sparse bundle ajdustment打基础.这篇笔记包含如下内容: 回顾高斯牛顿算法,引入LM算法 惩罚因子的计算(迭代步子的计算) 完整的算法流程及代码样例 1.      回顾高斯牛顿,引入LM算法  根据之前的博文:Gauss-Newton算法学习   假设我们研究如下形式的非线性最小二乘问题:   r(x)为某个问题的残差residual,是关于x的非线性函数.我们知道高斯牛顿法的迭代公式:   Lev

计划如期完成,老师也给我回邮件了,继续坚持,努力。(顺便求推荐数据结构和算法学习的两本书)

问题描述 国庆二号号出去玩了一天,陪女朋友看"心花路放"(很赞的电影,推荐),购物,吃饭,然后剩下的六天假期都是在半学习半休闲的态度下度过的,因为女朋友和我一起在自习室,再加上国庆实在是有些懈怠心理.一期java语法基础包括集合框架,jdbc,sql,IO流,线程都简单的认识了,只局限于简单的使用(线程真的是认识的简单的不能再简单了).因为这些资料都是培训班的资料,所以做一个总结吧,培训班还是的确有独到之处的,目的性强,实用性强,速成性强,如果只有半年时间的话,我相信选择培训班是个很好

python算法学习之计数排序实例_python

python算法学习之计数排序实例 复制代码 代码如下: # -*- coding: utf-8 -*- def _counting_sort(A, B, k):    """计数排序,伪码如下:    COUNTING-SORT(A, B, k)    1  for i ← 0 to k // 初始化存储区的值    2    do C[i] ← 0    3  for j ← 1 to length[A] // 为各值计数    4    do C[A[j]] ← C[A

OTSU算法及其改进算法学习

   这篇文章还是来自斯坦福课后作业hw2_3,主要是结合一个例子介绍otsu算法[亦称为大律算法,小日本]及其改进算法.    本文将先介绍老外的题目.解题思路及maltab解答,然后分析otsu算法步骤,末了给出opencv实现.     老外的题目:Binarization of Scanned Book Pages 题目大意: 网上图书服务,比如百度文库需要将大量藏书数字化.首先,书的每一页将被扫描.然后,这些扫描图片将被二值化,并通过字符识别引擎OCR处理,即图片转字符.对于传统书籍[

Efficient Color Boundary Detection with Color-opponent Mechanisms算法学习笔记

这是一篇基于视觉颜色机制的边缘检测论文,原文分中文和英文版 中文版链接:中文版PDF 英文版链接:英文版PDF 项目主页:http://www.neuro.uestc.edu.cn/vccl/projcvpr2013.html 以下是我个人学习该算法后的理解,希望各位看官批评指正! 整个算法可分为以下几步: 1.输入一张彩色图像 2. 分别提取R-G-B三种颜色信息,并计算Y颜色信息,进行高斯滤波得到 3.设置连接权重ω ,通过式(1)得到R+wG和wR+G两种连接权值的的结果 $$Srg.Sg

知其所以然(以算法学习为例)

原文发表于2008年 其实下文的绝大部分内容对所有学习都是同理的.只不过最近在正儿巴经地学算法,而后者又不是好啃的骨头,所以平时思考总结得就自然要比学其它东西要多一些. 问题:目前几乎所有的算法书的讲解方式都是欧几里德式的.瀑布式的.自上而下的.每一个推导步骤都是精准制导直接面向目标的.由因到果,定义.引理.定理.证明一样不少,井井有条一丝不乱毫无赘肉.而实际上,这完全把人类大脑创造发明的步骤给反过来了.看起来是阳关大道,实际上车马不通. 而对读者来说,这就等于直接告诉你答案&做法了,然后让你去

SPFA算法学习笔记

一.理论准备         为了学习网络流,先水一道spfa.         SPFA算法是1994年西南交通大学段凡丁提出,只要最短路径存在,SPFA算法必定能求出最小值,SPFA对Bellman-Ford算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变.为什么队列为空就不改变了呢?就是因为要到下一点必须经过它的前一个邻接点..SPFA可以处理负权边.很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之

C5.0算法学习

  C5.0是决策树模型中的算法,79年由J R Quinlan发展,并提出了ID3算法,主要针对离散型属性数据,其后又不断的改进,形成C4.5,它在ID3基础上增加了队连续属性的离散化.C5.0是C4.5应用于大数据集上的分类算法,主要在执行效率和内存使用方面进行了改进. C4.5算法是ID3算法的修订版,采用GainRatio来加以改进方法,选取有最大GainRatio的分割变量作为准则,避免ID3算法过度配适的问题. C5.0算法则是C4.5算法的修订版,适用于处理大数据集,采用Boost

算法学习之百钱买百鸡

   百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, 用100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. ~~~~~~~~~ #include <stdio.h> #include <stdlib.h> int main(void) {     int i=0,j=0,k=0;     for (i=1;i<20;i++){         n=n++;