LM算法在相机标定的应用共有三处。

(1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参。OpenCV中对应的函数为findExtrinsicCameraParams2。

(2)单目标定中,在内外参都不固定的情况下,计算最佳内外参。OpenCV中对应的函数为calibrateCamera2。

(3)双目标定中,在左右相机的内外参及左右相机的位姿都不固定的情况下,计算最佳的左右相机的内外参及最佳的左右相机的位姿矩阵。OpenCV中对应的函数为stereoCalibrate。

本文文阅读前提是你已经对LM(Levenberg-Marquardt)算法有足够的了解。因为本文主要是分析LM算法在相机标定中应用。

本文的分析是基于OpenCV的源码,所以可参见OpenCV的源码阅读此文。

0变量设置

设标定板上角点数为m,标定过程中拍摄n幅视图(对双目标定而言,左右相机各抓取n幅视图)。

关于相机的成像模型和畸变模型,我这里就不占空间了,详见OpenCV官方文档或相关论文。我用如下函数表示:

其中,(u,v)是像素坐标,(X,Y,Z)是世界坐标,R=(r1, R2, R3)T是旋转外参,T=(T1, T2, T3)T是平移外参,A=(fx, fy, cx, cy)T是投影内参,D=(k1, k2, p1,p2, k3, k4, k5, k6, s1, s2, s3, s4, a, b)T是畸变内参。

纵所周知,(u,v)是存在畸变的(后文称之为畸变坐标),我们用(uu,vv)表示(u,v)对应的非畸变的坐标(后文称之为标准坐标)。我们用findChessboardCorners提取的角点坐标就被当作是标准坐标。

1计算最佳外参

在内参固定的情况下,我们需要计算最佳外参。于是成像模型简化为:

对于m个角点则有如下方程:

其中(Xi, Yi, Zi)是已知项。计算雅可比矩阵如下:

由J可得J和JTJ。

若给定初值(R0, T0)则可得畸变角点序列uv=(u1,v1, u2,v2,…,um,vm)T。若findChessboardCorners获得的标准角点序列为uuvv=(uu1, vv1, uu2, vv2, …, um, vm)T,则误差序列为E=uv-uuvv。于是最终的方程为:

解方程后可得更精确的(R1, T1)=(R0, T0)-σ。

注意:以上可能与其它LM算法介绍有些差异。按大多数LM算法的介绍文档应是E=uuvv-uv, (R1, T1) = (R0, T0) +σ。不过仔细观察会发现最终结果其实一样的。我只不过是为了与OpenCV中源码对应才这样写的。

2计算最佳内外参

在内外参都不固定的情况下,成像模型应为:

与计算最佳外参不同。计算最佳外参是针对一幅视图,优化目标是使此幅视图的重投影误差最小。而计算最佳内外参,是针对多幅视图,优化目标是使所有视图的重投影误差之和最小。每幅视图有各自的外参,但共用相同的内参。所以每幅视图像上的角点仅对内参和各自的外参存在偏导,对其它视图的外参的偏导为0。于是雅可比矩阵为:

其中,Jini和Jexi是第i幅视图对内参和自身外观的雅可比矩阵。Jini是n×18矩阵(因为18个内参所以18列),Jexi是n×6矩阵(因为6个外参所以6列),所以J是(n*n)×(18+6*n)的矩阵。

可算得:

3计算最佳左右相机的内外参及最佳左右相机的位姿矩阵

此步骤中的优化参数是两相机间的位姿矩阵(R, T),两相机的内参(A1, D1, A2, D2)及左两机外参序列(R1i, T1i)。其中左相机的外参(R2i, T2i)=(RR1i, RT1i+T)。于是左相机每幅视图上的角点只对(A1, D1, Ri, Ti)有偏导,对其它参数的偏导为0。而右相机每幅视图上的角点只对(R, T, A2, D2, R1i, T1i)有偏导,对其它参数的偏导为0。其中,对(R, T, R1i, T1i)的偏导来源于对(R2i, T2i)的偏导。

未完,待续。

相机标定:关于用Levenberg-Marquardt算法在相机标定中应用的更多相关文章

  1. 相机标定过程(opencv) + matlab参数导入opencv + matlab标定和矫正

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 辛苦原创所得,转载请注明出处 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  2. 张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)

    使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些? 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的 ...

  3. matlab实现高斯牛顿法、Levenberg–Marquardt方法

    高斯牛顿法: function [ x_ans ] = GaussNewton( xi, yi, ri) % input : x = the x vector of 3 points % y = th ...

  4. ZeroMQ接口函数之 :zmq_z85_decode – 从一个用Z85算法生成的文本中解析出二进制密码

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_z85_decode zmq_z85_decode(3)         ØMQ Manual - ØMQ/4.1 ...

  5. 算法效果AB测试中的PV-UV不对称性

    (转载请注明原创于潘多拉盒子) 算法效果的AB测试,是指在相同的应用场景下,对比不同算法的效果.通常的做法是,按照PV或UV随机分配流量到算法上,计算算法的CTR或转化率进行对比.为了表述简单,我们假 ...

  6. C++11新特性应用--介绍几个新增的便利算法(不更改容器中元素顺序的算法)

    总所周知.C++ STL中有个头文件,名为algorithm.即算法的意思. The header<algorithm>defines a collection of functions ...

  7. 机器学习、深度学习、和AI算法可以在网络安全中做什么?

    本文由  网易云发布. 本文作者:Alexander Polyakov,ERPScan的首席技术官和联合创始人.EAS-SEC总裁,SAP网络安全传播者. 现在已经出现了相当多的文章涉及机器学习及其保 ...

  8. 实现一个算法,寻找字符串中出现次数最少的、并且首次出现位置最前的字符 如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少)。并且比其他只出现一次的字符(如"d")首次出现的位置最靠前。

    实现一个算法,寻找字符串中出现次数最少的.并且首次出现位置最前的字符如"cbaacfdeaebb",符合要求的是"f",因为他只出现了一次(次数最少).并且比其 ...

  9. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

随机推荐

  1. ios 程序学习

    马上着手开发iOS应用程序:五.提交应用与寻找信息 2013-01-11 15:36 佚名 apple.com 我要评论(0) 字号:T | T 本文介绍了您已经学习完如何开发一个优秀的iOS应用之后 ...

  2. dll的编写和使用

    备忘: 1-1: def方式创建:VC6找不到stdafx.h,所以创建空工程,stdafx 里面功能太高端,不用不影响.DLL工程建立好后,新建一CPP文件,叫dlltest.cpp,直接去copy ...

  3. html a 链接标签title属性换行鼠标悬停提示内容的换行效果

    鼠标经过悬停于对象时提示内容(title属性内容)换行排版方法,html title 换行方法总结. html的title属性默认是显示一行的.如何换行呢? 这里DIVCSS5总结介绍两种换行方法为大 ...

  4. ACM 矩阵题目整理

    先从最基础的矩阵快速幂加速递推开始. HDU 1005 Number Sequence |f[n-2],f[n-1]|* |0 B| =|f[n-1], B*f[n-2]+A*f[n-1]|=|f[n ...

  5. CSS3特性 盒模型 动画

    转发自0101后花园 CSS3中的动画功能分为Transitions和Animations功能,这两种功能都可以通过改变CSS中的属性值来产生动画效果. 一.Transitions 语法:transi ...

  6. 电子词典的相关子函数db.c程序

    整个电子词典是分块做的:包含的Dic_Server.c,Dic_Client.c,db.c,query.c,xprtcl.c,dict.h,xprtcl.h,dict.txt(单词文件) 下面是db. ...

  7. asp.net 动态添加自定义控件

    前两天一直纠结asp.net动态添加控件后,后台获取不到控件的问题,查看了网上很多的回答,可能自己的理解有误或者自己所掌握的知识有限,都没有解决我遇到的问题,经过两天的研究,终于把问题解决了. 我这里 ...

  8. augustus, gene prediction, trainning

    做基因组注释 先用augustus训练,然后再用maker做基因注释 augustus提供一些训练好的,如果有和你的物种非常接近的,直接用提供的,没有的话再自己训练. 网址: http://bioin ...

  9. Xcode中使用debug模式和release模式

    在开发过程中,我们经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程.但是一个发布的程序,里面带有太多的NSLog输 ...

  10. MyBatis架构(转)

    本文来自http://www.bubuko.com/infodetail-549184.html 如果不太熟悉MyBatis使用的请先参见MyBatis官方文档,这对理解其架构设计和源码分析有很大好处 ...