关于SBA(Sparse Bundle Adjustment)编译以及遇到的一些问题

             本人最近接触了SBA,由于没有人指导,只能在网上搜索资料来进行学习,理解地并不是很深入。但考虑到有很多初学者和我一样,会遇到很多问题,故想整理一下,一算是对自己这些天学习的回顾,二算是给接下来学习的人一些所以帮助。第一次写博客,不当之处,请大家见谅。

        首先,介绍下SBA(Sparse bundle adjustment)即稀疏集束调整,现在广泛应用于计算机视觉领域,基本成为最后优化的标准算法,就是在已经得到的初始摄像机参数和三维点数据的基础针对投影误差进行优化,得到使得均方投影误差最小意义下的Motion和Structure。

      那么SBA怎么编译呢?大家可以在SBA的官网(http://users.ics.forth.gr/~lourakis/sba/)右侧的Download code下下载代码,目前最新的是1.6版本。下载之后我们就可以进行编译。可以在vs2010下编译也可以使用Makedfile.vc进行编译。

 关于后者,这两篇文章对sba的编译写的已经很清楚(http://licong1018.blog.163.com/blog/static/90269784201341311117367/

http://blog.csdn.net/royalvane/article/details/8125388)

我就参照这两篇文章,将他们整合下

  首先进入VC环境。打开cmd命令行,cd进入VC安装目录,运行vcvars32.bat:

  然后进入sba文件夹进行编译,写此文时的最新版本是sba-1.6。执行nmake /f Makefile.vc:

    注意:如果之前没有下载这四个库clapack.lib ,blas.lib,libF77.lib,libI77.lib,会出现第二篇文章的问题,这里有四个库的下载http://download.csdn.net/detail/oliongs/8991141

  

传入参数,即Demo文件夹下的几个数据文件 eucsbademo 7cams.txt 7pts.txt calib.txt

至此,sba的编译基本结束。但细心的同学会注意到有几个问题:

⑴编译的最后有一个LAPACK错误:函数sba_Axb_Chol()中错误的因式分解

   完整的消息是这样的:LAPACK error: the leading minor of order XX isnot positive definite,the factorization could not be completed fordpotf2/dpotrf insba_Axb_Chol()。这意味着增广的法方程的基于Cholesky的算子在某次迭代时出错。理论上,待解决的系统矩阵应该是正定的,这样Cholesky是有效的。然而由于数值误差,并不完全是这样的,并且这时Cholesky也无法因式分解。尽管如此,不会有什么损害,因为当一次迭代出错时,法方程的阻尼增加了,所以在接下去的迭代中它们的矩阵式正定的。换言之,这些错误不会影响收敛。为了阻止sba报错,注释掉sba_levmar.c中的对sba_Axb_Chol()的调用,而去掉sba_Axb_LU()的注释。这样我们就能够使用LU分解来取代Choleskyl来解法方程,并且可以避免警告。然而,注意,LU分解需要更长时间计算,所以以上更改会使sba运行的稍慢一些。

⑵为什么没有结果的输出?

    一般情况下演示程序不产生输出;只有关于最小化的一些统计资料会被打印出来。为了在BA之后打印运动和/或结构参数到stdout,请编辑eucsbademo.c中的函数sba_driver(),并且去掉对prnt变量赋值的注释,将prnt赋值为BA_MOTSTRUCT,BA_MOT 或者 BA_STRUCT

以上就是Makedfile.vc编译的一些过程和一些问题。

   另外,对于VS下的编译,首先要新建一个空的工程(注意是空的,不是控制台什么的),然后将那

些头文件,c文件导入进去,运行会出现一些错误,这还是因为你缺少那个四个静态库的支持,添加之后如下图,再次编译,即可成功。也可以直接下载本人编译成功的(http://download.csdn.net/detail/oliongs/8991683)

关于SBA(Sparse Bundle Adjustment)编译以及遇到的一些问题_第1张图片


最后,关于使用SBA时应传入的的命令行参数,一般分两种情况:

               1.当所有相机的内参数相同时(使用型号相同的相机或者所有相片使用同一相机拍摄)需传入三个命令行参数:按顺序以空格或tab符间隔 cams.txt pts.txt calib.txt。cams.txt为相机外参数文件,描述了每张照片的外参数。

外参数文件格式如下: r a b c Xt Yt Zt    其中r a b c 为投影函数旋转矩阵对应的四元数(r为实部,a b c为虚部)。Xt Yt Zt为平移量。pts.txt为激光点与图像点的匹配文件,格式如下:

                X Y Z nframes frame0 x0 y0 frame1 x1 y1 ...

文件的每一行如上所示。X Y Z为激光点坐标。nframes为该激光点对应的图像点的个数。后面是对nframes个图像点的描述。frame0 x0 y0 表示第frame0幅照片上图像坐标为x0 y0的像点,以此类推。 calib.txt由相机规格和相片大小决定的相机标定文件。跟计算机视觉中的相机标定矩阵一致。可以根据相机焦距、像元大小以及相片的宽度和高度写出相机标定文件calib.txt。比如,我们获得的焦距f = 28.1359mm,像元大小为8u,相片宽度为3000像素,高度为4500像素。那么我们得到的相机标定文件为:(通常不考虑相机坐标轴不平行的情况)

3516.9875 0.0 1500

0.0 3516.9875 2250

0.0 0.0 1.0

             2、当相机的内参数不同时,需传入两个命令行参数:camsvarK.txt pts.txt 因为相机的内参数不同,所以没有统一的相机标定文件。这里,参数pts.txt不变。camsvarK.txt表示了每张照片对应的相机的内外参数。格式如下:

                      fu, u0, v0, ar, s quaternion translation

              fu表示以像素为单位的焦距大小,u0,v0 表示像主点坐标。通常设ar=1,s=0。


           以上是本人亲身操作后得到的一些东西,希望对之后的学习者有所帮助。由于目前还在本科学习阶段,所以对SBA认识不当的地方,还希望大家批评指正。另感兴趣者,可加入q群(414276261)一起讨论成长

你可能感兴趣的:(关于SBA(Sparse Bundle Adjustment)编译以及遇到的一些问题)