在Ubuntu的Conda环境中正确安装COLMAP的方法及问题排查
在Ubuntu Conda环境中安装并使用COLMAP的问题与解决思路
问题背景
我想在Ubuntu的Conda环境里用COLMAP处理图像,但不确定正确的安装方法。COLMAP在另一个Conda环境能正常运行,但不清楚环境差异和当前问题原因,需要明确的解决思路或方案。
已尝试的安装方式及问题
方式1:通过sudo apt install colmap安装
基础功能正常,但运行目标代码时出现特征匹配失败,报错信息如下:
Exhaustive feature matching ============================================================================== Shader not supported by your hardware! ERROR: SiftGPU not fully supported ERROR: SiftGPU not fully supported ==== running: mkdir colmap_sparse ==== running: colmap mapper --database_path colmap.db --image_path "images" --output_path colmap_sparse ============================================================================== Loading database ============================================================================== Loading cameras... 1 in 0.000s Loading matches... 0 in 0.000s Loading images... 10 in 0.000s (connected 0) Building correspondence graph... in 0.000s (ignored 0) Elapsed time: 0.000 [minutes] WARNING: No images with matches found in the database.
问题根源:apt安装的预编译版本默认启用SiftGPU,但你的RTX A2000不支持对应的Shader,导致特征提取/匹配步骤完全失败,数据库里没有生成任何匹配数据。
方式2:遵循官方源码编译指南安装
执行cmake ..时失败,指定gcc/g++版本(CC=/usr/bin/gcc-8 CXX=/usr/bin/g++-9 cmake ..)也无效,出现CUDA相关错误:
CMake Error at cmake/CMakeHelper.cmake:121 (add_library): Target "colmap" links to target "CUDA::cudart" but the target was not found. Perhaps a find_package() call is missing for an IMPORTED target, or an ALIAS target is missing? Call Stack (most recent call first): src/CMakeLists.txt:65 (COLMAP_ADD_STATIC_LIBRARY)
问题根源:Conda环境干扰了系统CUDA的路径检测——base环境的CUDA能正常使用,但当前Conda环境的环境变量覆盖了系统CUDA路径,导致CMake找不到CUDA库。
解决思路与方案
针对apt安装版本的临时修复
如果不想编译源码,可以强制COLMAP使用CPU版本的SIFT特征提取,避开SiftGPU的兼容性问题:
- 特征提取命令添加参数
--SiftExtraction.use_gpu 0 - 特征匹配命令添加参数
--SiftMatching.use_gpu 0
示例完整命令:
colmap feature_extractor --database_path colmap.db --image_path images --SiftExtraction.use_gpu 0 colmap exhaustive_matcher --database_path colmap.db --SiftMatching.use_gpu 0 colmap mapper --database_path colmap.db --image_path images --output_path colmap_sparse
注:这种方法性能会低于GPU版本,适合临时测试场景。
源码编译的正确步骤(解决CUDA链接问题)
- 退出当前Conda环境:执行
conda deactivate,确保编译时使用系统原生环境变量,避免Conda干扰CUDA检测。 - 确认并设置系统CUDA路径:
执行which nvcc,确保输出为/usr/local/cuda-11.8/bin/nvcc,如果不是,手动配置环境变量:export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH - 安装完整编译依赖:
sudo apt install git cmake build-essential libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libboost-test-dev libeigen3-dev libsuitesparse-dev libfreeimage-dev libmetis-dev libgoogle-glog-dev libgflags-dev libsqlite3-dev - 克隆源码并编译:
git clone https://github.com/colmap/colmap.git cd colmap mkdir build && cd build # 明确指定系统CUDA编译器路径,避免CMake找错 cmake .. -DCMAKE_CUDA_COMPILER=/usr/local/cuda-11.8/bin/nvcc make -j$(nproc) sudo make install - 在Conda环境中使用编译好的COLMAP:编译完成后,回到目标Conda环境直接运行
colmap即可——编译好的二进制文件会安装到系统路径,Conda环境默认可以访问系统路径。
复用正常运行的Conda环境
如果不想重新编译,可以直接克隆那个能正常运行COLMAP的环境:
conda create --name new_colmap_env --clone old_working_env
之后在新环境中验证COLMAP功能即可。
关键注意事项
- Linux下apt安装的预编译COLMAP并非完全不能用,只是部分GPU特性可能和硬件不兼容,切换到CPU模式即可规避。
- 源码编译时必须退出Conda环境,确保CMake使用系统原生的CUDA和编译器。
- RTX A2000完全支持CUDA 11.8,编译时指定对应版本的CUDA编译器即可正常适配。
内容的提问来源于stack exchange,提问作者Baker Herrin
相关产品推荐
相关产品推荐

