Sparse bundle adjustment即稀疏集束调整,现在广泛应用于计算机视觉领域,基本成为最后优化的标准算法,就是在已经得到的初始摄像机参数和三维点数据的基础针对投影误差进行优化,得到使得均方投影误差最小意义下的Motion和Structure。其算法的核心是利用Levenberg-Marquardt算法,由于视觉中问题的特殊性,造成矩阵稀疏,从而针对此特性进行求解。这里介绍的是使用比较多的一个工具函数库,由希腊学者Manolis I.A.Lourakis和Antonis A. Argyros开发,网址为:http://www.ics.forth.gr/lourakis/sba。这里我主要翻译下其中接口函数的使用说明:
需要使用的结构体是struct sba_crsm, 定义如下:
struct sba_crsm{
int nr,nc; // 稀疏矩阵的行和列
int nnz; //非0元素数量
int *val; //非0元素存储空间,大小为nnz
int *colidx //非零元素的列下标,大小为nnz
int *rowptr; //val中开始一行的位置,大小为:nr+1, rowptr[nr] = nnz
}
本结构体用于保存稀疏矩阵的元素
(根据其定义可以看出,其存储过程其实对于稀疏矩阵按行扫描,得到非零元素出现的行和列,然后用colidx存储列下标,rowptr存储数据中新的一行出现的位置,非零结果存在val中。)
Sparse Bundle Adjustment通过函数sba_motstr_levmar_x()执行,函数原型如下:
int sba_motstr_levmar_x(const int n, const int m, const int mcon, char * vmask, double *p, const int cnp, const int pnp, double *x, const int mnp,
void(*func)(double *p, struct sba_crsm * idxij, int *wk1, int *wk2, double *hx, void *adata),
void(*fjac)(double *p, struct sba_crsm * idxij, int *wk1, int *wk2, double *hx, void *adata),
void *adata, int itmax, int verbose, double opts[3], double info[10];
函数运行成功终止则返回达到最小需要的迭代次数,否则输入-1。当前版本中假设观测向量的协方差矩阵为单位矩阵。函数的核心是通过LU分解求解线性系统,使用LAPACK实现。下面是用I,O分别表示输入和输出:
n: 3D点的数量。(I)
m:摄像机的数量(图像)(I)
mcon:从第一个摄像机开始不需要修正参数的摄像机的数量。当我们将世界坐标系与第一个摄像机的坐标对齐的时候,第一个摄像机矩阵保持为[I 0] (I)
vmask:点的可见性标志:mask[(i-1)*m + j -1] = 1 如果点i在图像j中可见,否则为0.需要注意的是点和摄像机的表示从1,2开始而矩阵下标则是从0开始。Vamsk的大小为n*m(I);
p:作为输入,初始参数向量P0 = (a1,a2,…am, b1,b2,…bn)。作为输出,估计的最小值,其大小为m*cnp+n*pnp (I/O);
cnp: 定义一个摄像机的参数数量。例如,欧氏摄像机参数化使用6个参数(3个旋转参数+3个平移参数)。如果使用四元数表述旋转则参数的数量增加到7(4+3)。完整的透视摄像机使用11个参数表示,如果包括全局的尺度因子则参数为12个 (I)
pnp:定义一个3D 点需要的参数数量,对于欧氏几何为3,对于投影空间为4 (I)
x:观测向量X包括所有图像投影,顺序为(x11,x12,…,x1m,….xnm).对于不可见的点,对应的xij消失。最大为n*m*mnp.(I)
mnp:定义一个图像点参数的数量(一般为2) (I)
func:计算估计的参数向量的函数。 (I)
fjac:在jac中评估 处的稀疏雅可比行列式 (I)
adata:指向可能的额外数据的指针,传递给func,fjac。主要是为了避免对于全局变量的直接应用(I)
itmax:Levenberg-Marquardt迭代的最大次数。 (I)
verbose:冗长程度。0表示冷静的操作,大的值对应着增加冗长级别。(I)
opts:Levenberg-Marquardt算法中最小化参数选项, ,分别对应着初始衰减项的尺度因子和结束的终止门限(I);
info:关于最小化输出的信息,如果不需要可以设置为NULL。(O)
info[0]: 初始参数估计的误差。主要到info[0]除以所有的图像点观测的数量对应着初始均方投影误差;
info[1-4]:( , , , ),全部是在 计算得到的。类似于info[0],info[1]除以图像观测点的数量得到最终的均方投影误差;
info[5]:总的迭代次数;
info[6]:结束的原因:
1.过小的
2 过小的
3 迭代次数达到itmax
4 增强法方程矩阵奇异,最小化过程应该从当前解重新开始采用增加的衰减项;
Info[7]:function评价的总的次数;
Info[8]:fjac评价的总的次数;
Info[9]:增强法方程求解总的次数。这个参数一般比总的迭代次数要大,由于在一次LM迭代中,可能需要多个参数进行尝试,每一个都需要对应的增强法方程的求解。
另外Sba还提供了两个函数sba_mot_levmar_x()和sba_str_levmat_x(),分别只对相机参数和结构参数优化投影误差。
个别公式无法显示。