win7下用VS编译SBA(摄影测量光束法平差程序库)

我在学习区域网平差过程,自己编写平差程序,在解算方程过程中,变量的改正量总是达不到规定的阈值,偶然间发现sba,简直不能再爽了,sba是稀疏光束网平差库,可以根据自己的情况去修改代码,得到自己的BA程序。接下来从这个几个方面介绍刚刚接触的sba。


sba简介

这个网站涉及sba,一个用于通用稀疏软件包调整的C / C ++包,它是在GNU通用公共许可证(GPL)下分发的。束调整(BA)几乎不变地用作每个基于特征的多视图重建视觉算法的最后一步,以获得最佳的3D结构和运动(即相机矩阵)参数估计。提供初始估计,BA通过最小化观察和预测图像点之间的再投影误差来同时精细化运动和结构。最小化通常在Levenberg-Marquardt(LM)算法的帮助下进行。然而,由于大量的未知数有助于最小化再投影误差,当应用于在BA的上下文中定义的最小化问题时,LM算法(例如MINPACK的lmder)的通用实现导致高计算成本。

幸运的是,对于不同3D点和相机的参数之间缺乏交互作用导致显示稀疏块结构的基本正态方程(点击这里作为示例)。 sba通过采用导致相当大的计算增益的LM算法的定制的稀疏变体来利用这种稀疏性。 sba是通用的,因为它授予用户对描述相机和3D结构的参数的定义的完全控制。因此,它几乎可以支持多视图重建问题的任何表现/参数化,诸如任意投影相机,部分或完全本征校准的相机,来自固定3D点的外部取向(即姿态)估计,内部参数的细化等。用户必须做的来适应sba到任何这样的问题是为它提供用于计算估计的图像投影和他们的雅可比的问题和参数化的适当的例程。用于计算分析雅可比行列式的程序可以手动编码,用支持符号分化的工具(例如,枫木)生成,或者使用自动分化技术获得。还有一种替代方法是在有限差分的帮助下近似雅可比矩阵。此外,sba包括用于检查用户提供的雅可比的一致性的例程。据我们所知,sba是第一个也是目前唯一一个以自由软件形式发布的软件包。

sba已经实施,特别强调灵活性和性能效率。它本质上是专门适合在SfM问题中经常遇到的“箭头”类型的稀疏的专用LM变体。为了实现这一点,sba采用一种方案,其将正常矩阵分割成不同的相机和结构块,并通过采用点子矩阵的稀疏Schur补码来求解(稀疏)正规方程。通过采用这种方案,sba可以有效地处理非常大的重建问题。有关sba背后的理论的更多细节可以在文档中找到。
作为其效率的指示,这里指出,已应用sba的中等大小的测试问题涉及54个摄像机和5207个3D点,产生24609个图像投影。相应的最小化问题依赖于15999个变量,并且在Intel P4@1.8 GHz运行的Linux上使用未优化的BLAS在大约7秒内由sba解决。没有BA的稀疏实现,这种大小的问题将简单地是棘手的。更多内容请参考sba官网

sba编译

1、下载sba库

sba官网下载sba1.6软件包,下载之后直接解压。

2、下载预编译好的Lapack库文件

clapack网站 上下载BLAS.LIB, CLAPACK.lib, LIBF2C.lib,debug版和release版都可以,看心情。

3、cmake生成vs工程

cmake官网 下载cmake软件并安装。新建一个文件夹sba_build存放生成的vs工程。source code 选择解压好的sba,where to build th binaries 选择新建好的文件夹。点击configure ,然后配置红框中的项目,配置好后点击configure,最后生成即可。

cmake配置

4、vs工程配置

vs打开生成的工程,将eucsbademo工程右键设为启动项目,配置eucsbademo工程,在忽略待定库里面填写,libcmt.lib,如下:

这里写图片描述

否则生成就会出现错误这里,如果只需sba.lib,可以将eucsbademo工程删除,再进行编译,不用配置vs工程。

sba常见问题

vs运行例子

生成成功之后,在sba-1.6_build\demo\Release文件夹里面有 eucsbademo.exe,可以通过cmd调用,格式为:eucsbademo 7cams.txt 7pts.txt calib.txt。数据文件在sba直接解压后的demo文件里面。cmd调用无法查看源代码,可以将eucsbademo.c的main函数里面的路径修改,就可以调试了。我修改的如下:

int main(int argc, char *argv[])
{

char *camsfname = "D:\\sba_code\\mysba\\sba-1.6_build\\data\\7cams.txt";
char *ptsfname = "D:\\sba_code\\mysba\\sba-1.6_build\\data\\7pts.txt";
char *calibfname = "D:\\sba_code\\mysba\\sba-1.6_build\\data\\calib.txt";

int cnp=6, /* 3 rot params + 3 trans params */
    pnp=3, /* euclidean 3D points */
    mnp=2; /* image points are 2D */

  if(0){
    fprintf(stderr, "Usage is %s <camera params> <point params> [<intrinsic calibration params>]\n", argv[0]);
    exit(1);
  }

  if(1){ /* fixed intrinsics */
    fprintf(stderr, "Starting BA with fixed intrinsic parameters\n");
    sba_driver(camsfname, ptsfname, calibfname, cnp, pnp, mnp, quat2vec, vec2quat, cnp+1, "-", "-");
  }
  else{
    cnp+=5; /* 5 more params for calibration */
    if(readNumParams(argv[1])-1==cnp+5){ /* with distortion */
      cnp+=5; /* 5 more params for distortion */
      fprintf(stderr, "Starting BA with varying intrinsic parameters & distortion\n");
      sba_driver(argv[1], argv[2], NULL, cnp, pnp, mnp, quat2vec, vec2quat, cnp+1, "-", "-");
    }
    else{
      fprintf(stderr, "Starting BA with varying intrinsic parameters\n");
      sba_driver(argv[1], argv[2], NULL, cnp, pnp, mnp, quat2vec, vec2quat, cnp+1, "-", "-");
    }
  }

  return 0;
}

sba数据文件的解释

==================一般======================
此目录包含eucsbademo,这是使用sba进行欧几里德束调整的示例。
有关sba的文档,请参阅ICS / FORTH TR-340。 eucsbademo实现两个变体
欧几里得BA:a)假设内在因素是固定的,用于相机姿态和场景结构的BA
所有相机相同,b)相机内在的BA,姿态和场景结构假设
摄像机内在因素和摄像机内在因素,失真,姿势和场景的BA
结构假设内在和失真在相机之间变化。

**对于a),eucsbademo接受3个文件名作为参数:
它们是相机运动(即姿态)参数的初始估计
估计3D点参数以及3D点图像投影和
相机内在校准参数。相机运动参数的文件有
每个摄像机(即帧)的单独线路,每行包含7个参数(a 4
旋转的元素四元数和用于平移的3元素矢量)。回转
四元数具有标量部分作为它们的第一元素,即以角度TH旋转
围绕单位向量U =(Ux,Uy,Uz)应指定为
cos(TH / 2)Ux * sin(TH / 2)Uy * sin(TH / 2)Uz * sin(TH / 2)。
3D点和图像投影的文件由形式的线组成

X Y Z NFRAMES FRAME0 x0 y0 FRAME1 x1 y1 …

每个对应于单个3D点。 X Y Z是点的欧几里德3D坐标,
NFRAMES是点的投影可用的图像的总数和每个
的NFRAMES后续三元组FRAME x y指定所讨论的3D点投射
到图像FRAME中的像素x y。例如,行

100.0 200.0 300.0 3 2 270.0 114.1 4 234.2 321.7 5 173.6 425.8

指定投影到3点(270.0,114.1)的3D点(100.0,200.0,300.0),
(234.2,321.7)和(173.6,425.8)分别在图像2,4和5中。像素坐标
使用公共惯例,即从图像的左上角测量
正x轴从左到右,y从上到下。相机和3D
点索引从0开始计数。

**对于b),eucsbademo接受2个文件名作为参数,特别是定义的文件
相机内在和运动参数的初始估计和定义初始
以及3D点参数以及3D点图像投影的估计。
相机参数的文件对于每个相机具有单独的行,每行
包含12个参数(五个内在参数按焦距顺序在x像素,
主点坐标以像素为单位,宽高比[即焦点/焦点X]和偏差因子,
加上用于旋转的4元素四元数和用于平移的3元素矢量)。
用于3D点和图像投影的文件的格式与所解释的相同
对于上述情况a)。也可以选择要保持固定的参数的数量
(例如,固定偏斜,固定纵横比和偏斜,固定纵横比,偏斜和主点)
检查sba_driver()的前几行。

**对于c),eucsbademo接受2个文件名作为参数,特别是定义的文件
相机内在性,失真和运动参数的初始估计以及定义
3D点参数的初始估计以及3D点图像投影。
相机参数的文件对于每个相机具有单独的行,每行
包含17个参数(五个内在参数按焦距顺序在x像素,
主点坐标以像素为单位,宽高比[即焦点/焦点X]和偏差因子,
五个失真参数向量kc(更多如下)加上用于旋转的4元素四元数
和用于翻译的3元素矢量)。
用于3D点和图像投影的文件的格式与所解释的相同
对于上述情况a)。也可以选择要保持固定的参数的数量
(例如,固定偏斜,固定纵横比和偏斜,固定纵横比,偏斜和主点)
检查sba_driver()的前几行。
类似地,可以选择要保持固定的失真参数的数量
(例如固定的6th / 4/2阶径向失真,固定的切向失真)。

采用的失真模型是Bouguet使用的,参见
http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/parameters.html

根据该模型,规定了径向和切向失真
通过具有以下元素的五矢量kc:

kc [0]是二阶径向失真系数
kc [1]是4阶径向失真系数
kc [2],kc [3]是切向失真系数
kc [4]是6阶径向失真系数

更具体地,假设x_n =(x,y)=(X / Z,Y / Z)是针孔图像投影
并且令r ^ 2 = x ^ 2 + y ^ 2。失真图像投影定义为

x_d =(1 + kc [0] * r ^ 2 + kc [1] * r ^ 4 + kc [4] * r ^ 6)* x_n + dx,

dx =(2 * kc [2] * x * y + kc [3] (r ^ 2 + 2 x ^ 2),kc [2] (r ^ 2 + 2 y ^ 2) kc [3] * x * y)。
像素坐标中的失真点由K * x_d给出,K是内在函数。

注意,上面使用了基于零的索引,Bouguet的页面符合
Matlab的约定和使用基于1的索引!

=====================点对点=========================
开始于ver。 1.5,sba支持将BA纳入协方差信息
用于图像点。为了接受这种协方差,eucsbademo扩展了点文件格式
上面定义的形式的线

X Y Z NFRAMES FRAME0 x0 y0 covx0 ^ 2 covx0y0 covx0y0 covy0 ^ 2 FRAME1 x1 y1 covx1 ^ 2 covx1y1 covx1y1 covy1 ^ 2 …

换句话说,协方差矩阵简单地遵循对应的图像坐标。
也可以通过仅指定上限来稍微减小文件大小
协方差矩阵的三角形部分。 covx0 ^ 2 covx0y0 covy0 ^ 2等

旋转参数化======================
在上述所有a),b)和c)案例中,eucsbademo程序使用a描述旋转
局部旋转表示:给定初始旋转估计R 0,精确旋转
R可以因式分解为R = Rs * R0,其中Rs是要估计的小旋转。初始
对应于零旋转的估计用于Rs,即四元数等于
(1,0,0,0)。 eucsbademo程序仅使用向量在内部参数化
部分相应的四元数,即每个摄像机3个参数:假设为正
标量分量w,前者可以从矢量部分(x,y,z)中唯一地确定,
因为w = sqrt(1-x ^ 2-y ^ 2-z ^ 2)。

====================文件====================
eucsbademo.c:主演示程序
readparams.c:从文本文件读取初始运动和结构估计的函数
imgproj.c:用于估计给定摄像机上某个3D点的投影的函数。也
包括用于评估对应的雅可比行列式的代码
eucsbademo.h:函数原型
readparams.h:函数原型

calib.txt:所使用的摄像机的固有校准矩阵K(仅用于固定K测试情况)

7cams.txt:涉及7个摄像机的测试案例的初始运动参数(固定K)
7camsvarK.txt:7个相机测试案例的初始内在和运动参数(不同K)
7pts.txt:7照相机测试用例的初始结构参数

9cams.txt:涉及9台摄像机的测试案例的初始运动参数(固定K)
9camsvarK.txt:9个相机测试用例的初始内在和运动参数(变化K)
9pts.txt:9个摄像机测试用例的初始结构参数

54cams.txt:涉及54台摄像机的测试案例的初始运动参数(固定K)
54camsvarK.txt:54照相机测试用例的初始内在和运动参数(不同K)
54camsvarKD.txt:54照相机测试案例的初始内在,失真&运动参数(变化K&失真kc)
54pts.txt:54照相机测试用例的初始结构参数

================== COMPILING ======================
演示程序是在sba的编译期间构建的

示例代码====================
命令
eucsbademo 7cams.txt 7pts.txt calib.txt
产生以下输出:

起始BA具有固定的内在参数
SBA使用465 3D点,7帧和1916图像投影,1437变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,没有协方差,没有失真,固定内在

SBA在17个迭代中返回17,原因2,错误0.675396 [初始19.0947],18/17 func / fjac evals,24 lin。系统
经过时间:0.34秒,340.00毫秒
而命令
eucsbademo 7camsvarK.txt 7pts.txt
产生以下输出:
以不同的内在参数开始BA
SBA使用465 3D点,7帧和1916图像投影,1472变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,无协方差,无失真,可变内在函数(2固定)

SBA在150迭代中返回150,原因3,错误0.659201 [初始19.0947],153/150 func / fjac evals,170 lin。系统
经过时间:5.29秒,5290.00毫秒

对于9相机的情况,
eucsbademo 9cams.txt 9pts.txt calib.txt
产生
起始BA具有固定的内在参数
SBA使用559 3D点,9帧和2422图像投影,1731变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,没有协方差,没有失真,固定内在

SBA在17个迭代中返回17,原因2,错误0.619559 [初始8.17604],18/17 func / fjac evals,25 lin。系统
经过时间:0.45秒,450.00毫秒

eucsbademo 9camsvarK.txt 9pts.txt
产生
以不同的内在参数开始BA
SBA使用559 3D点,9帧和2422图像投影,1776变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,无协方差,无失真,可变内在函数(2固定)

SBA在150迭代中返回150,原因3,错误0.600039 [初始8.17603],154/150函数/ fjac evals,180lin。系统
经过时间:6.90秒,6900.00毫秒

对于54相机的情况,
eucsbademo 54cams.txt 54pts.txt calib.txt
产生
起始BA具有固定的内在参数
SBA使用5207 3D点,54帧和24609图像投影,15945变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,没有协方差,没有失真,固定内在

SBA在21次迭代中返回21,原因2,错误0.176473 [初始2.14707],22/21 func / fjac evals,29 lin。系统
经过时间:7.99秒,7990.00毫秒
打字
eucsbademo 54camsvarK.txt 54pts.txt
产生
以不同的内在参数开始BA
SBA使用5207 3D点,54帧和24609图像投影,16215变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,无协方差,无失真,可变内在函数(2固定)

SBA在36迭代中返回36,原因2,误差0.134928 [初始2.14707],36/36函数/ fjac evals,47lin。系统
经过时间:28.58秒,28580.00毫秒

eucsbademo 54camsvarKD.txt 54pts.txt
产生
起始BA具有不同的内在参数和失真
SBA使用5207 3D点,54帧和24609图像投影,16485变量

方法BA_MOTSTRUCT,专家驱动程序,分析雅可比,无协方差,可变失真(3固定),可变内在函数(2固定)

SBA在34迭代中返回34,原因2,错误0.128779 [初始2.14707],34/34 func / fjac evals,44 lin。系统
经过时间:55.17秒,55170.00毫秒

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值