转自菠菜僵尸 http://www.cnblogs.com/shepherd2015/p/5848430.html

bundle adjustment原理(1)

那些光束平差的工具,比如SBA、SSBA之类的虽然好,然而例子和教程都不够多且不够详细,让初学者难以上手。

要传入的参数虽然有解释,然而却也不是十分清楚其含义,具体要怎么生成,生成为什么形式。

我在折腾了一段时间后也还是没成功,逼得我自己找这方面的资料学习,想要更了解bundle adjustment的原理。

想着干脆自己写一个简单的bundle框架练练手,就算写不成也将有助于让这些工具正常工作起来。

三维重建的最后一步是光束平差,又称bundle adjustment,本文介绍一下bundle adjustment的数学原理。

主要是参考 https://www.coursera.org/learn/robotics-perception/home/welcome 第4周里头的内容。

本文做一些数学上的推导以及将资料中的各种公式的含义细化。

自己在推导过程中发现了上述课程ppt中的一些细节地方的公式有错。

2016-09-07 10:24:33

除了上面的资料外,还参考了另一篇文献 “SBA: A Software Package for Generic Sparse Bundle Adjustment”,在bundle adjustment的wiki下以及MATLAB R2016a自带的bundleAdjustment函数中都参考了这篇文献。这篇文献和上述课程ppt中的变量设置略有不同,但大体框架是一样的。

整个 bundle adjustment 的目标是重投影误差最小,所以可以分为两个部分:

1,将某个误差函数的值最小化。这是一个最优化问题,用的是L-M算法。我已经写了一篇L-M算法的博客。

2,将重投影误差的误差函数的具体表达式写出来,套到上面的L-M算法里头去。

假设读者已经有一些最优化的知识。

先从只有1个点、1个相机讲起:

2个摄像机1个点的情况:

2个摄像机2个点的情况:

假如有3个摄像机,4个点,则J的大致情形如下,里头的含义模仿上面很容易搞清楚:

对于列来讲,前面3列对应着3个摄像机的变量,后面4列对应着4个点的变量。

那么函数f对变量p和x的偏导怎么求?只有用MATLAB的符号推导才能搞出来,手算非常容易出错

MATLAB代码如下:

被调用的函数sym_mat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function rtn = sym_mat(x,m,n)
% 生成符号矩阵,第一个参数是一个符号,后面两个参数是符号矩阵的尺寸
% 如果你想生成符号矩阵[x11 x12; x21 x22]只需输入sym_mat(x,2,2)
% 但事先要先声明符号x,用syms x
% 如果你只需要生成一维矩阵,sym_mat会生成一个列向量,如sym_mat(x,2);
% 例子:
% syms x;
% A = sym_mat(x,3,4) 返回一个3 x 4的符号矩阵
 
if nargin == 2
    for i=1:m
        rtn(i)=sym([inputname(1),num2str(i)]);
    end   
    rtn = rtn.';
elseif nargin == 3
    for i = 1:m
        for j = 1:n
            rtn(i,j) = sym([inputname(1),num2str(i),num2str(j)]);
        end
    end
end

符号推导部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clear all;clc;close all;
 
syms P;
P = sym_mat(P,3,4);
P(3,4) = 1
P_var = symvar(P)
 
syms X;
X = [sym_mat(X,3);
    1]
X_var = symvar(X)
 
uvw = P*X;
 
u = uvw(1,:);
v = uvw(2,:);
w = uvw(3,:);
 
f = ...
    [u/w;
     v/w];
 
f_P = jacobian(f,P_var)
f_X = jacobian(f,X_var)
 
J = [f_P f_X]
sym_in_J = symvar(J)

f_P 代表函数 f 对 P  求导,得到 2 x 11 的矩阵

f_X 代表函数 f 对 X 求导,得到 2 x 3 的矩阵

结果很复杂,就不贴出来了。

具体计算矩阵J的值的时候,把变量替换成相应的值就可以了,MATLAB中有subs函数,如果用c++写,

则要自己写一个函数,把值传进去算矩阵J的值。

对于多点多相机的矩阵J,计算不同部分的 f_P 和 f_X,然后把它们组装成一个大的矩阵即可。

先写到这里。。。

bundle adjustment原理(1)转载的更多相关文章

  1. bundle adjustment原理(1)

    那些光束平差的工具,比如SBA.SSBA之类的虽然好,然而例子和教程都不够多且不够详细,让初学者难以上手. 要传入的参数虽然有解释,然而却也不是十分清楚其含义,具体要怎么生成,生成为什么形式. 我在折 ...

  2. bundle adjustment 玩具程序

    结合 bundle adjustment原理(1) 和 Levenberg-Marquardt 的 MATLAB 代码 两篇博客的成果,调用MATLAB R2016a中 bundleAdjustmen ...

  3. 机器人学 —— 机器人视觉(Bundle Adjustment)

    今天完成了机器人视觉的所有课程以及作业,确实是受益匪浅啊! 最后一个话题是Bundle Adjustment. 机器人视觉学中,最顶尖的方法. 1.基于非线性优化的相机位姿估计 之前已经在拟合一篇中, ...

  4. Bundle Adjustment光束平差法概述

    http://blog.csdn.net/abcjennifer/article/details/7588865 http://blog.csdn.net/ximenchuixuezijin/arti ...

  5. HashMap工作原理(转载)

    转载自:http://www.importnew.com/7099.html  HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用Hash ...

  6. TCP/IP协议原理【转载】

    前述        各种L2数据网具有不同的通信协议与帧结构,其网络节点设备可以是各种类型的数据交换机(X.25.FR.Ethernet和ATM等分组交换机):而L3数据网(IP网或internet) ...

  7. Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

  8. 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)

    从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言   在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...

  9. 梯度提升树(GBDT)原理小结(转载)

    在集成学习值Adaboost算法原理和代码小结(转载)中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boos ...

随机推荐

  1. 【springmvc+mybatis项目实战】杰信商贸-6.重点知识回顾

    1.重点知识回顾 Maven1)覆盖仓库文件,实际企业开发,公司会架一个测试服务器,在测试服务器中架私服.我们开发人员的程序,都连接私服.当本地没有项目中要使用的jar,Myeclipse maven ...

  2. ubuntu10.10安装使用vnc

    原文发表于:2010-12-15转载至cu于:2012-07-21 搭安全试验的环境,在vmware上安装了ubuntu10.10(大学的时候用过,最早用的好像是6系列吧).安装好后想用远程桌面控制, ...

  3. Linux内核学习笔记(5)-- 进程调度概述

    进程调度程序是多任务操作系统的基础,它是确保进程能有效工作的一个内核子系统,负责决定哪个进程投入运行.何时运行以及运行多长时间.只有通过进程调度程序的合理调度,系统资源才能够最大限度地发挥作用,多进程 ...

  4. Python 函数内省

    函数内省(function introspection) 除了__doc__属性, 函数对象还有很多属性,对于下面的函数,可以使用dir()查看函数具有的属性: def factorial(n): r ...

  5. ES6的新特性(14)——Iterator 和 for...of 循环

    Iterator 和 for...of 循环 Iterator(遍历器)的概念 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Ma ...

  6. 大学网站UI设计分析(以学校领导/历届领导为例)

    第一次的冲刺阶段让我过了一把PM的瘾,第一阶段的冲刺完成以后第一感觉就是PM不好当,在大学里做个课程设计当个PM相对而言还是比较容易的,但是我明白,当我们走向工作岗位以后,面临的情况会比学校的情况的复 ...

  7. 第二章:Internet地址结构

    引言 本章主要介绍了: 如何为Internet中的设备分配IP地址. 有助于理由可扩展性的地址结构分配方式. 特殊用途的地址. 表示IP地址 IPv4地址 长32位,采用点分四组或点分十进制来表示. ...

  8. .net 错误处理

    第一步在页面中写OnError方法: protected override void OnError(EventArgs e) { Exception ex = Server.GetLastError ...

  9. 【acm】杀人游戏(hdu2211)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2211 杀人游戏 Time Limit: 3000/1000 MS (Java/Others)    M ...

  10. 【第五周】alpha发布之小组评论

    对于昨天的阿尔法发布,有那么几点需要说一下: 1,对这次阿尔法发布的过程,我们组还是基本顺利的,由于之前吃过亏,这次我提前试用了一下投影仪,做了些调试,之后的发布过程起码设备上是正常的. 2,我们的项 ...