您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > sba一个通用的稀疏光束法平差的软件包
如果你来到这个页面来寻找一个通用的Levenberg-Marquardt算法的C/C++实现,请看levmar引言:本页面是关于sba,一个通用的稀疏光束法平差的C/C++软件包。它基于GNU通用公共许可证GPL分发的。光束法平差(BA)是作为每个基于特征的多视重建视觉算法的最后一步,用来获得最佳的三维结构和运动(如相机矩阵)参数估计。提供初始估计,BA同时精化运动和结构参数,通过最小化观测和预测的图像点之间的投影误差。最小化一般通过Levenberg-Marquardt(LM)算法来辅助完成。然而,由于许多未知的因素作用于最小投影误差,一个通用的LM算法的实现(如MINPACK的lmder)当应用于BA背景下的定义的最小化问题时,会带来极高的计算代价。幸运的是,在基本的法方程中不同的三维点和相机参数相互之间影响较小,呈现一种稀疏的块结构(如图)。Sba利用这种稀疏的特性,使用LM算法的简化的稀疏变量来降低计算的复杂度。Sba是通用的,因为它保证了用户对于相机和三维结构的描述参数的定义的完全控制。因此,它事实上可以支持任何多视重建问题的显示和参数化。比如任意投影相机,部分的或完全标定的相机,由固定的三维点进行外方位元素(即姿态)的估计,精化本征参数,等等。用户要想在这类问题中使用sba,只需要提供合适的程序对这些问题和参数来计算估计的图像投影和他们的函数行列式(Jacobian)。用来计算解析的函数行列式可以是手头的代码,或者使用支持符号微分的工具(如maple)生成的代码,或者通过自动微分技术获得的代码。也可以使用近似的函数行列式,辅之以有限差分的方法。另外,sba包含了检查用户提供的函数行列式的一致性的程序。就我们的知识之所及,sba是第一个并且也是当前独一无二的的软件包,因为他能够不受版权限制以源代码形式放置在任何工程中。作为sba的效率的一个指标,我们在这里说明,sba的单次测试已经涉及54台相机和5207三维点,产生了24609个图像投影。相应的最小化问题依赖于15999个变量,sba使用非最优的BLAS在IntelP4@1.8GHzrunningLinux机器上大约7秒钟内解决。如果没有BA的稀疏实现,那么这种规模的问题会变得非常棘手。又一个光束法平差库,由德国斯图加特大学发布。名字很怪,不知道全称是什么。引言程序DGAP实现了光束法平差的摄影测量方法,由HelmutSchmidandDuaneBrown发明。它基于图像和目标的几何关系的中心投影,使用最小二乘法。特点Camera-/self-/simultan标定,连同作者Brown,EbnerandGruen建议附加的参数。两者可选的图像模型:直接线性变换(DLT)和仿射变换。不同测量位置和/或姿态数据(GPS支持的空三、直接地理参考)的集成。精确的计算内外几何参数测试附加参数的意义计算协方差(新!)和相关性新:对分格摄影机图像(framecameraimagery)的扩展的摄影测量模型。新:线扫描仪(linescanner)图像的直接地理参考。新:空三(aerialtriangulation,AT)的样例,GPS支持的空三并且直接地理参考。新:ADS-40线扫描仪图像的直接地理参考样例。版权/许可Copyright(C)2005DirkStallmannThisprogramisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralPublicLicenseaspublishedbytheFreeSoftwareFoundation;eitherversion2oftheLicense,or(atyouroption)anylaterversion.Thisprogramisdistributedinthehopethatitwillbeuseful,butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyofMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.SeetheGNUGeneralPublicLicenseformoredetails.YoushouldhavereceivedacopyoftheGNUGeneralPublicLicensealongwiththisprogram;ifnot,writetotheFreeSoftwareFoundation,Inc.,59TemplePlace-Suite330,Boston,MA02111-1307,USA.下载地址:依赖库genlib2提供了各种子程序以及模板类。可以有选择的使用LAPACK和BLAS。LAPACK是一个Fortran77库,用来解数字线性代数中最常见的问题。它又依赖于基本的线性代数子程序BLAS。BLAS也是一个Fortran77库,提供优化的向量和矩阵操作。两个库都是自由软件,并且拥有版权。LAPACK和BLAS可在netlib上获得:下编译DGAP,可以使用Cygnus的GNU-win32开发工具包“Cygwin”(),版本1.3.6或者更高。LAPACK/BLAS库在Cygwin下依然可用。安装在UNIX或者Cygwin下编译1、在同一目录下解压压缩包。tarxzfgenlib2-$RELEASE.tar.gztarxzfdgap-$RELEASE.tar.gz2、编译genlib2库:cdgenlib2-$RELEASEmake3、重命名这个目录为genlib2或者创建一个符号链接:cd..ln-sgenlib2-$RELEASEgenlib24、编译DGAP程序cd..ln-sgenlib2-$RELEASEgenlib2为了安装DGAP只需要从主目录中复制程序dgap到/usr/binor/usr/local/bin.。SparseBundleAdhustment1.5使用指南Sparsebundleadjustment即稀疏集束调整,现在广泛应用于计算机视觉领域,基本成为最后优化的标准算法,就是在已经得到的初始摄像机参数和三维点数据的基础针对投影误差进行优化,得到使得均方投影误差最小意义下的Motion和Structure。其算法的核心是利用Levenberg-Marquardt算法,由于视觉中问题的特殊性,造成矩阵稀疏,从而针对此特性进行求解。这里介绍的是使用比较多的一个工具函数库,由希腊学者ManolisI.A.Lourakis和AntonisA.Argyros开发,网址为:。这里我主要翻译下其中接口函数的使用说明:需要使用的结构体是structsba_crsm,定义如下:structsba_crsm{intnr,nc;//稀疏矩阵的行和列intnnz;//非0元素数量int*val;//非0元素存储空间,大小为nnzint*colidx//非零元素的列下标,大小为nnzint*rowptr;//val中开始一行的位置,大小为:nr+1,rowptr[nr]=nnz}本结构体用于保存稀疏矩阵的元素(根据其定义可以看出,其存储过程其实对于稀疏矩阵按行扫描,得到非零元素出现的行和列,然后用colidx存储列下标,rowptr存储数据中新的一行出现的位置,非零结果存在val中。)SparseBundleAdjustment通过函数sba_motstr_levmar_x()执行,函数原型如下:intsba_motstr_levmar_x(constintn,constintm,constintmcon,char*vmask,double*p,constintcnp,constintpnp,double*x,constintmnp,void(*func)(double*p,structsba_crsm*idxij,int*wk1,int*wk2,double*hx,void*adata),void(*fjac)(double*p,structsba_crsm*idxij,int*wk1,int*wk2,double*hx,void*adata),void*adata,intitmax,intverbose,doubleopts[3],doubleinfo[10];函数运行成功终止则返回达到最小需要的迭代次数,否则输入-1。当前版本中假设观测向量的协方差矩阵为单位矩阵。函数的核心是通过LU分解求解线性系统,使用LAPACK实现。下面是用I,O分别表示输入和输出:n:3D点的数量。(I)m:摄像机的数量(图像)(I)mcon:从第一个摄像机开始不需要修正参数的摄像机的数量。当我们将世界坐标系与第一个摄像机的坐标对齐的时候,第一个摄像机矩阵保持为[I0](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中评估!--[if!vml]--!--[endif]--处的稀疏雅可比行列式!--[if!vml]--!--[endif]--(I)adata:指向可能的额外数据的指针,传递给func,fjac。主要是为了避免对于全局变量的直接应用(I)itmax:Levenberg-Marquardt迭代的最大次数。(I)verbose:冗长程度。0表示冷静的操作,大的值对应着增加冗长级别。(I)opts:Levenberg-Marquardt算法中最小化参数选项,!--[if!vml]--!--[endif]--,分别对应着初始衰减项的尺度因子和结束的终止门限(I);info:关于最小化输出的信息,如果不需要可以设置为NULL。(O)info[0]:!--[if!vml]--!--[endif]--初始参数估计的误差。主要到info[0]除以所有的图像点观测的数量对应着初始均方投影误差;info[1-4]:(!--[if!vml]--!--[endif]--,!--[if!vml]--!--[endif]--,!--[if!vml]--!--[endif]--,!--[if!vml]--!--[endif]--),全部是在!--[if!vml]--!--[endif]--计算得到的。类似于info[0],info[1]除以图像观测点的数量得到最终的均方投影误差;info[5]:总的迭代次数;info[6]:
本文标题:sba一个通用的稀疏光束法平差的软件包
链接地址:https://www.777doc.com/doc-5066819 .html