那些光束平差的工具,比如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:

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 == 2for i=1:mrtn(i)=sym([inputname(1),num2str(i)]);end    rtn = rtn.';
elseif nargin == 3for i = 1:mfor j = 1:nrtn(i,j) = sym([inputname(1),num2str(i),num2str(j)]);endend
end

符号推导部分:

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,然后把它们组装成一个大的矩阵即可。

先写到这里。。。

2016年9月9日21:50:17

转载于:https://www.cnblogs.com/shepherd2015/p/5848430.html

bundle adjustment原理(1)相关推荐

  1. Bundle Adjustment原理及应用(附实战代码)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 虽然现在的轮子很多,但我们在使用过程中会碰到很多问题,而我们经常不知道从哪里下手,说明轮子不是你造的你 ...

  2. SLAM笔记(五)光束平差法(Bundle Adjustment)

    1.什么是光束平差法 前边的八点法,五点法等可以求出闭式解的前提是已经知道确切的点对.但实际情况中往往存在大量的噪声,点与点不是精确地对应甚至出现一些错误匹配.  光束平差法由Bundle Adjus ...

  3. Bundle Adjustment (BA) in vSLAM or SFM

    文章目录 Overview BA as a NonLinear Least Squares Problem Solved with LM JTJ\mathbf{J}^T \mathbf{J}JTJ s ...

  4. SLAM专题(10)- 最小化重投影误差与Bundle Adjustment (BA)

    在SFM(structure from motion)的计算中BA(Bundle Adjustment)作为最后一步优化具有很重要的作用,在近几年兴起的基于图的SLAM(simultaneous lo ...

  5. Bundle Adjustment (BA)简述

    笔者到底想讲些啥? 在SFM(structure from motion)的计算中BA(Bundle Adjustment)作为最后一步优化具有很重要的作用,在近几年兴起的基于图的SLAM(simul ...

  6. ORB_SLAM2代码阅读(5)——Bundle Adjustment

    ORB_SLAM2代码阅读(5)--Bundle Adjustment 1. 说明 2. Bundle Adjustment(BA)的物理意义 3. BA的数学表达 4. BA的求解方法 4.1 最速 ...

  7. 矩阵求逆c语言实现_[V-SLAM] Bundle Adjustment 实现

    SLAM问题的后端有主要有滤波和优化两种方案.目前,普遍认为优化的方法在精度上要超过滤波方法,因为它可以进行多次的线性化.近年来出现的SLAM算法也大都是基于优化的算法(如ORB-SLAM.DSO等) ...

  8. 史上最简SLAM零基础解读(7) - Jacobian matrix(雅可比矩阵) → 理论分析与应用详解(Bundle Adjustment)

    本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始   文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \co ...

  9. OpenCV实现SfM(四):Bundle Adjustment

    http://blog.csdn.net/AIchipmunk/article/details/52433884 OpenCV实现SfM(四):Bundle Adjustment 标签: opencv ...

  10. [论文笔记|VIO]ICE-BA: Incremental, Consistent and Efficient Bundle Adjustment for Visual-Inertial SLAM

    文章目录 摘要 1. 介绍 2. Related Work 3. Framework 3.1. Constraint Functions 3.2. Local and Global Optimizat ...

最新文章

  1. 深入理解计算机系统(2.3)---整数的表示方式精解无符号与补码编码(重要)...
  2. SAR图像变化检测的评价方法
  3. php属性赋值吗,php – 设置类中属性的默认值
  4. STL库的内存配置器(allocator)
  5. Unity学习笔记(一)——C#语法基础
  6. yolo 深度学习_吴恩达深度学习笔记04.卷积神经网络 W3.目标检测(YOLO)
  7. 触控屏c语言程序,触摸屏编程软件 C-more Micro Programming Software V3.0
  8. linux c正则
  9. MOSSE 相关滤波器详解
  10. 华为虚拟机eNSP命令大全(所有命令)
  11. 烧钱,救得了中国游戏吗?
  12. Cross-lingual Document Retrieval using Regularized Wasserstein Distance
  13. 实用技巧(二)——文本工具、自由变换
  14. 类似于陌陌点点和探探首页切换效果
  15. 将汉字数字转换成数字
  16. JavaEE知识点总结详细版(一)计算机是如何进行工作的
  17. COMSOL初级学习之一
  18. 服务器RAID1如何看出有坏硬盘,如何侦测服务器的磁盘阵列有坏硬盘?
  19. CGT Asia 2023第三届亚洲细胞与基因治疗创新峰会将于4月上海召开
  20. ologit模型与logit_Logit模型和Logistic模型有什么区别?

热门文章

  1. 事在四方,要在中央。圣人执要,四方来效
  2. 别人改汝代码,应该怎么办
  3. 管理感悟:没有活跃用户量,谈广告都是开玩笑
  4. 管理感悟:承认错误,善于总结
  5. 软件测试 vb,使用VB6.0进行自动化测试
  6. java定时器 不延时_ScheduledExecutorService 将一个定时任务延迟
  7. mac地址是由多少个bit组成_IPv6系列-详解自动分配IPv6地址
  8. Windows下配置安装Git(一)
  9. 访问webservice,导入xml至本地数据集
  10. 《PhoneGap移动应用开发手册》——1.5节获取设备位置传感器信息