ubuntu20.0.4源码安装Colmap流程
系统环境
ubuntu20.0.4,已经预装了cuda toolkit,cuda版本11.8
动机
通过apt install的已编译的版本方式也可以成功安装,但是不支持GPU加速。导致特征点匹配的速度非常慢。在本地机器测试,960*540分辨率上的特征点匹配需要3s钟。使用GPU加速可以减少1到2个数量级。
Colmap用到的SiftGPU,SIFTGPU通过图形硬件管线实现特征提取的并行加速
安装流程:
主要参考官方文档的流程:
https://colmap.github.io/install.html#build-from-source,just
从git上pull下来的Colmap版本是3.13.0,是比较新的代码。
按照官方文档,需要安装依赖软件
Dependencies from the default Ubuntu repositories:

比较顺利,完成安装。
执行cmake命令,报错:

原因:
Ubuntu20.0.4,Apt install cmake的版本是3.16。
然而Colmap的cmake/FindDependencies.cmake:147要求cmake的版本3.17以上。
提升cmake的版本,参考https://www.cnblogs.com/Maker-Liu/p/16550381.html,通过源码安装。
Cmake 3.22安装成功,比较顺利

执行cmake,没有报错:

执行ninja报错

原因:
这个错误是 类型不匹配 导致的:point3D.xyz.data() 返回 const double*(常量指针),但 Ceres Solver 的 IsParameterBlockConstant 函数要求输入 double*(非 const 指针),C++ 不允许直接将 const 指针转换为非 const 指针。
核心原因:
Colmap 代码与你系统中安装的 Ceres Solver 版本不兼容—— 旧版本 Ceres 的 IsParameterBlockConstant 函数参数为非 const 指针,而 Colmap 新版本代码中 point3D.xyz 是 const 类型,导致类型冲突。
Apt install的Ceres是1.14.0,存在接口参数类型问题。在最新的代码中修复了这个问题。
修改办法,不想重新编译Ceres,修改了bundle_adjustment.cc中的代码,总共4处
if (problem.IsParameterBlockConstant(const_cast<double*>(point3D.xyz.data())) &&
继续ninja编译,仍然存在问题:

解决办法:
参考https://blog.csdn.net/qq_30565883/article/details/133778529

编译成功

