0、            ceres-solver简介

Ceres Solver是一个C++环境下的非线性最小二乘问题的求解工具包,可用来建模并解决大型复杂的非线性最小二乘问题。这个工具包已经广泛被用于很多商业软件中。在google project里面有它的主页: http://code.google.com/p/ceres-solver/

在Google,使用 Ceres Solver 来估测街景车、飞机和卫星的姿态;给 PhotoTours 建立 3D 模型;估测卫星图像传感器的特征等。比如:下面这个视频展示了三个实例(Youtube)。

编译ceres-solver需要依赖eigen、gflags和glog三个库,以及编译时需要cmake来生成工程文件[1]。下表为所需的所有的库下载地址:

名称

下载地址

ceres-solver

https://ceres-solver.googlecode.com/files/ceres-solver-1.6.0.tar.gz

eigen

http://bitbucket.org/eigen/eigen/get/3.2.0.tar.bz2

gflags

https://gflags.googlecode.com/files/gflags-2.0-no-svn-files.tar.gz

glog

https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz

cmake

http://www.cmake.org/files/v2.8/cmake-2.8.12.1-win32-x86.exe

将上面五个库和工具下载好,并且安装好cmake。为了方便编译完之后调用,在一个空文件夹中新建两个目录,include和lib,用来存放ceres-solver编译之后的调用库和头文件。

1、            编译gflags

google开源的gflags是一套命令行参数解析工具,比getopt功能更强大,使用起来更加方便,gflags还支持从环境变量、配置文件读取参数(可用gflags代替配置文件)[2]。

首先编译gflags,解压后就有VS的工程文件,双击打开sln工程文件,编译即可。我只编译了Release版本,编译完之后会在sln所在目录生成的Release文件夹,里面就是编译完的dll(libgflags.dll)和lib(libgflags.lib)。

2、            编译glog

glog 是google的开源日志系统,相比较log4系列的日志系统,它更加轻巧灵活,而且功能也比较完善[3]。接下来编译glog,编译glog与编译gflags完全一样。解压后就有VS的工程文件,双击打开sln工程文件,编译即可。我同样也只编译了Release版本,编译完之后会在sln所在目录生成的Release文件夹,里面就是编译完的dll(libglog.dll)和lib(libglog.lib),此外还有一个静态库的lib(libglog_static.lib)。

编译完成之后,将src目录下的windows下面的glog文件夹拷贝到上面新建的include目录,将Release目录下的dll和lib拷贝到上面新建的lib目录。

3、            编译eigen

eigen是一个用于矩阵运算的模板库,不需要编译,只需要将头文件包含即可[4]。为了方便后续使用,我们需要将eigen库的头文件整理下,具体操作是:将解压目录中的Eigen文件夹拷贝到上面新建的include目录,然后将Eigen文件夹中所有的CMakeLists.txt文件删除,不删除也可以,不影响后续使用。

4、            编译ceres-solver

将ceres-solver解压,然后打开camke工具,将ceres-solver-1.6.0的目录和输出目录分别指定进去,如下图所示:

然后点击Configure按钮,弹出选择编译器,这个根据自己电脑安装的编译器来进行选择,我这里选择Visual Studio 9 2008,如下图所示,然后点击Finish,cmake就开始生成工程文件。

接下里会提示配置错误,如下图所示,点击确定后,我们需要手动修改里面一些依赖库的路径等。

根据提示信息,配置完glog和gflags库的include和lib的路径,如下图所示。

然后再根据提示配置eigen库的路径,Name后面带有AMD字样的全都不用管,默认就行了。需要注意的是,由于VS2008不支持TR1库,所以需要把TR1的选项禁用,如下图所示。

完成上面的步骤,再次点击Configue按钮,如果不提示错误,最下面输出Configuring done字样,说明配置OK,否则重复上面的步骤,直至配置成功。配置成功之后点击Generate按钮,生成sln工程文件。

接下来在build目录里面打开sln文件。打开之后发现一共有70个项目,如果你想全部编译的话,直接在ALL_BUILD工程上右键编译即可。为了节省时间,我只选择编译ceres工程。这个工程编译的结果是一个静态库,也就是我们后续要用的。如果编译过程中提示头文件不能打开,请回到上面的cmake,重新配置相关库的路径。

我在编译ceres-solver-1.6库的时候,提示lower_bound找不到标识符,在文件compressed_col_sparse_matrix_utils.cc开头,添加#include <algorithm>,然后重新编译即可。然后将Release版本也编译下。整个编译时间大致需要5分钟。

编译完成之后,将编译生成的ceres.lib文件重命名为ceres_d.lib(DEBUG版本)和ceres_r.lib(RELEASE版本),然后将两个lib文件拷贝到上面创建的lib文件夹中。将ceres-solver-1.6库中的include目录下的ceres文件夹拷贝到我们之前创建的include目录。

至此,一个ceres-solver的二次开发库就编译完成,以后我们只需要上面的include和lib目录就可以进行调用了。至于为什么ceres-solver需要将debug和release的库同时保留,是因为在编写程序时,debug版本必须调用ceres-solver的debug,release版本必须调用ceres-solver的release版本,否则程序会直接崩溃,所以两个版本都保留。重命名是为了能够在一个lib文件夹中同时存放两个版本的lib。

最终的目录结构如下图所示。

5、            参考资料:

[1] http://www.grandmaster.nu/blog/?page_id=628

[2] http://blog.chinaunix.net/uid-20196318-id-3440642.html

[3] http://www.cnblogs.com/foreveryl/archive/2011/10/14/2212265.html

[4] http://blog.csdn.net/abcjennifer/article/details/7781936

最新文章

  1. 在iis7上如何配置来看到asp报错
  2. Finish 和 Complete 的区别
  3. ADC/DAC的一些参数
  4. js024-最佳实践
  5. 限制&lt;input&gt;输入内容 只允许数字 或者 字母
  6. 【转】Bellman_ford算法
  7. 【C#学习笔记】结构体使用
  8. SQL Server Management Studio 使用作业实现数据库备份
  9. ab安装和使用
  10. JavaWeb中filter的详解及应用案例
  11. Java 中的四种引用及垃圾回收策略
  12. 单独谈谈 Android Cursor 的使用细节
  13. Docker安装weblogic
  14. Windows内置安全主体
  15. #Java学习之路——基础阶段(第五篇)
  16. spak数据倾斜解决方案
  17. Modelsimse10.4如何编译altera库文件以支持IP仿真
  18. 066 linux下时间的修改
  19. sitecore系列教程之改进Sitecore编辑体验的5个步骤
  20. MySql语句中Union和join的用法

热门文章

  1. Git 直接推送到生产服务器
  2. proc文件系统探索 之 根目录下的文件[二]
  3. android MultiDex multidex原理原理下遇见的N个深坑(二)
  4. Dynamics CRM2016 Web API之获取查找字段的text及选项集的text
  5. Button的几种常用的xml背景,扁平化,下划线,边框包裹,以及按压效果
  6. 有一台机器,上面有m个储存空间。然后有n个请求,第i个请求计算时需要占 R[i]个空间,储存计算结果则需要占据O[i]个空间(据O[i]个空间(其中O[i]&lt;R[i])。问怎么安排这n个请求的顺序,使
  7. Maven仓库概述
  8. Android开发学习之路--Drawable mutations
  9. 六星经典CSAPP笔记(2)信息的操作和表示
  10. maven的UnsupportedClassVersionError