去年就说尝试使用google的Ceres-Solver来拟合光谱,但是看到安装稍微复杂(主要笔记本的系统版本太老,一些依赖包需要手动安装),最后就放弃了。昨天到今天决心一定要装上它,编译出一个例子来。九曲十八弯之后,终于算是成功了。以下简述一下安装过程。
Ceres Solver 是google开源的一个求解非线性最优化问题的库,据说提供了非常多接口,使用起来高效,方便。对应的github下载地址是 Ceres Solver。听起来和mpfit很像。
安装面临的首个问题就是怎么下载,由于github的访问速度非常慢,只能首先用 gitee 来导入对应的github仓库,然后从 gitee 上来下载。这里帮 gitee 做一点宣传,码云在国内的访问速度非常快,提供的服务也非常好,使用起来很方便。日常的代码通过码云来同步,完全不用担心下载速度的问题。
在编译安装之前需要安装一些依赖,主要的依赖有以下这些
sudo apt install cmake sudo apt install libgoogle-glog-dev sudo apt install libatlas-base-dev sudo apt install libeigen3-dev sudo apt install libsuitesparse-dev
这里有两个问题,一个问题是我的系统是 Ubuntu 16.04,apt提供的 eigen 版本太老,无法编译通过,只能手动下载更新版本的 Eigen。Eigen的安装很容易,这里不再赘述,需要说明的是,安装Eigen后编译还是提示找不到 Eigen/core ,搜索发现原来是路径的问题,需要手动加一个软链接,方便编译器找到对应的文件
sudo ln -s /usr/local/include/eigen3/Eigen /usr/local/include/Eigen
参见:ubuntu 16.04 + eigen3 安装(解决 fatal error: Eigen/Core: No such file or directory)
另一个是使用默认 suitesparse 生成的 Ceres 是静态库,合并它生成的最终的可执行文件有好几兆,尝试添加官方推荐的另一个软件源,但是始终连接不上,遂作罢。
之后编译安装的过程一切顺利,后续测试网上找的例子时碰到一些问题。g++ 在编译链接可执行文件的时候需要告诉可能会引用哪些库。半天曲折的搜索尝试后,总算编译成功。执行的编译命令如下:
g++ mytest.cpp -std=c++11 -o mytest -lceres -lglog -pthread -lcxsparse -lopencv_core
对应的示例代码来自:Ceres Solver安装与入门使用
一个额外的收获是知道原来可以通过调用一些系统命令来查找对应的依赖库,如
g++ mytest.cpp -std=c++11 -o mytest -lceres -lglog -pthread -lcxsparse `pkg-config –libs opencv`
参见:
https://stackoverflow.com/questions/13904117/compiling-and-linking-opencv-in-ubuntu-12-04
https://groups.google.com/forum/#!topic/ceres-solver/h0nM0RPSgq4
https://www.cnblogs.com/zjulion/p/10935338.html
https://blog.csdn.net/cqrtxwd/article/details/78956227
https://www.cnblogs.com/xiaowangba/p/6313933.html
Visits: 356