bundle adjustment原理(1)转载
转自菠菜僵尸 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 endend |
符号推导部分:
|
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) = 1P_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)转载的更多相关文章
- bundle adjustment原理(1)
那些光束平差的工具,比如SBA.SSBA之类的虽然好,然而例子和教程都不够多且不够详细,让初学者难以上手. 要传入的参数虽然有解释,然而却也不是十分清楚其含义,具体要怎么生成,生成为什么形式. 我在折 ...
- bundle adjustment 玩具程序
结合 bundle adjustment原理(1) 和 Levenberg-Marquardt 的 MATLAB 代码 两篇博客的成果,调用MATLAB R2016a中 bundleAdjustmen ...
- 机器人学 —— 机器人视觉(Bundle Adjustment)
今天完成了机器人视觉的所有课程以及作业,确实是受益匪浅啊! 最后一个话题是Bundle Adjustment. 机器人视觉学中,最顶尖的方法. 1.基于非线性优化的相机位姿估计 之前已经在拟合一篇中, ...
- Bundle Adjustment光束平差法概述
http://blog.csdn.net/abcjennifer/article/details/7588865 http://blog.csdn.net/ximenchuixuezijin/arti ...
- HashMap工作原理(转载)
转载自:http://www.importnew.com/7099.html HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用Hash ...
- TCP/IP协议原理【转载】
前述 各种L2数据网具有不同的通信协议与帧结构,其网络节点设备可以是各种类型的数据交换机(X.25.FR.Ethernet和ATM等分组交换机):而L3数据网(IP网或internet) ...
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)
简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...
- 从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理(转载)
从底层谈WebGIS 原理设计与实现(三):WebGIS前端地图显示之根据地理范围换算出瓦片行列号的原理 1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法, ...
- 梯度提升树(GBDT)原理小结(转载)
在集成学习值Adaboost算法原理和代码小结(转载)中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boos ...
随机推荐
- PHP使用static关键字声明静态属性和静态方法
PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...
- Dubbo背景和简介
转载出处 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. 缺点:单一的 ...
- VisualSVN Server的配置和使用方法
VisualSVN Server的配置和使用方法 VisualSVN Server的配置和使用方法[服务器端] 安装好VisualSVN Server后[安装过程看这里],运行VisualSVN Se ...
- “Hello World!”团队召开的第六次会议
团队“Hello World!”团队召开的第六次会议. 博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.Todo List 六.会议照片 七.燃尽图 一.会议时间 2017年1 ...
- c# byte转docx
问题情境: docx文件放进resource中,再用程序读出来的时候是二进制数组. 解决办法: public string ByteConvertWord(byte[] data, string fi ...
- struts2--文件上传类型3
拦截器栈在<package>标签内 <action>标签外配置 如上我们如果把它定义成默认拦截器的话就不需要在 <action>标签中引入,没有的话需要引入拦截器 ...
- OA--对于每个form表单(<s:iterator>生成)的处理
由于是后台传过来的,我们不知道form 有几个 也不能指定form的id和name,(其实也可以就是可能会冲突我们还是用下面讲的方法把) 之前有想过 对于每个form 里面都有一些参数,举个例子 项目 ...
- [codecademy]css
Great work! You've learned the basics of CSS structure and syntax. We'll continue to build on these ...
- Spark Shuffle之Hash Shuffle
源文件放在github,如有谬误之处,欢迎指正.原文链接https://github.com/jacksu/utils4s/blob/master/spark-knowledge/md/hash-sh ...
- 正规文法转化DFA
#include<string.h>#include<stdio.h>#include<stdlib.h>int main(){ char p[30][30] ...