colmap三维重建与bug记录(更新中)——Ubuntu版本(包含colmap的编译)

一、colmap的编译(含报错处理)

1.1编译

一般使用官网的方法:

Installation — COLMAP 3.9-dev documentationhttps://colmap.github.io/install.html需要先注意这些:不过有的电脑不用管这些也能编译出来,应该是已经装好或者设置好了,所以这里视自己电脑实际环境的情况而定

ac59fcbcfb2c3f0b2c5f7cfc428e8307.png

上面在 Ubuntu 22.04 下这些命令是安装并添加环境变量,可以先查看自己系统里面有没有gcc和g++,一般都是有的,如果电脑有这些,可以查看自己带的版本,然后修改上面的gcc-*和g++-*

wheris gcc
whereis g++

然后,进入编译过程:

sudo apt-get install \
    git \
    cmake \
    ninja-build \
    build-essential \
    libboost-program-options-dev \
    libboost-filesystem-dev \
    libboost-graph-dev \
    libboost-system-dev \
    libeigen3-dev \
    libflann-dev \
    libfreeimage-dev \
    libmetis-dev \
    libgoogle-glog-dev \
    libgtest-dev \
    libsqlite3-dev \
    libglew-dev \
    qtbase5-dev \
    libqt5opengl5-dev \
    libcgal-dev \
    libceres-dev
git clone https://github.com/colmap/colmap.git
cd colmap
mkdir build
cd build
cmake .. -GNinja
ninja
sudo ninja install

1.2碰到的bug

(1)nvcc fatal:Unsupported gpu architectur "compute_native"

b7d38dfbed7b21bae3c7f05a70ae99ea.png

解决:github上有大神解决了,先检查显卡的计算能力,然后重新cmake,绿色框所示

nvcc fatal : Unsupported gpu architecture 'compute_native' · Issue #2464 · colmap/colmap · GitHubDescribe the bug The following commands succeed. git clone https://github.com/colmap/colmap.git cd colmap mkdir build cd build cmake .. -GNinja It fails at cmake .. -GNinja. The full printed infomation: [36/211] Building CUDA object src/...https://github.com/colmap/colmap/issues/2464#topf8a917ff4d08995eb8220b8301e2e438.png

(2)大片报错libfreeimage.so: undefined reference to TIFFFieldName@LIBTIFF_4.0。。。

93c22dd3b92124c1d9a224771472f5de.png

a17cb038609c8304e9b3e4c7c8a44989.png

解决:因为与anaconda3下面的QT5冲突了,修改cmakelist.txt,删除build,重新执行cmake即可

colmap安装 libfreeimage.so: undefined reference to TIFFFieldName@LIBTIFF_4.0_libfreeimage.so.3: undefined symbol: tifffielddata-优快云博客https://blog.youkuaiyun.com/u012796629/article/details/106230156?spm=1001.2014.3001.5506可以看到我的cmake文件执行时,确实用了anaconda3下面的QT5,并且有warning:

48475acef27d2e1445a0567e04e2d359.png

899dd88c11abf0b0670f63964e32cbdc.png

安装上面的链接修改cmakelist.txt,删除build,重新执行cmake,ninja,install,没有报错。

3aeb343ee594d035952719c2e261188e.png

815eb7f9906b531153185144670820a1.png

d22fae350c81ce7992db82ba12e1fb69.png

499752968a7f29a21d918ad5bfc0c0df.png

1a8beca99bd6a0f1279a33fb92d46962.png

(3)小bug,vim冲突打不开

和这一篇完全相同:

Linux Vim提示:E325: ATTENTION 解决方案_linux e325-优快云博客https://blog.youkuaiyun.com/weixin_62892290/article/details/131660528?spm=1001.2014.3001.5506

(4)collect2: fatal error: ld terminated with signal 9 [Killed]

解决:这是在虚拟机或者wsl中的Linux系统内编译colmap时报的错,主要是因为虚拟机的内存不够了,所以被kill,增大内存即可,参考

collect2: fatal error: ld terminated with signal 9 [Killed]-优快云博客https://blog.youkuaiyun.com/m0_47696151/article/details/132011222?spm=1001.2014.3001.5506

(5)[database.cc:1493]sqlite error :disk i/o error,特征匹配过程中数据库SQLite报错导致崩溃,这是colmap的本身的一个bug,不定时出现

在后续使用两两匹配或者vocabtree匹配的时候,出现下面这种报错:

66c63e8bc26a463f9ef624e8ac19bbb7.png

这是数据库的bug,主要是因为线程的问题,匹配的时候默认的是多线程,如果嫌改c++代码麻烦,可以用命令把匹配过程改成单线程,只不过会慢一些:

09f2b4a94e2a4aff8fc77655a0e58245.jpg

 这个参数默认-1是多线程,把他换成1就是单线程。

如果要修改colmap的代码,这里借鉴了高人的解决办法,修改colmap下面的特征匹配相关的c++文件,

23ac37287d094d818d80a64f34eba801.png

关于c++17的版本修改如下:

66cd226111894ba69b98c402a0592038.png

因为之前大神那里是c++14,他使用的是

acf5e97c446f412aaa8d82fe460a6d96.png

所以用在c++17中编译会报错:

4ae707960d344c70864f332454232992.png

(6)如何卸载编译的colmap

73565d75d5594c2b931833d1a4927a9a.png

c323435a5faf4434a2172340c21228be.png

e2d02c0fdd794312a19c90d30d3c6ac6.png

ad4ba85ab7b24f3896fc784cc396a29c.png

二、使用colmap在终端中进行三维重建

有点小遗憾,Ubuntu系统里用的数据集比较大,只跑出了稀疏重建的结果,稠密重建太吃算力了,才330张图,计算深度被kill了好几次,死机好几次,最后fuse的时候数据都加载不完就被kill,显卡是4080+16GB显存,计算开销实在是夸张!后面会具体提到这个问题

总体命令可以参考官网的example:

Command-line Interface — COLMAP 3.9-dev documentationhttps://colmap.github.io/cli.html有不知道的命令可以colmap -h查看参数形式

# The project folder must contain a folder "images" with all the images.
$ DATASET_PATH=/path/to/dataset

$ colmap feature_extractor \
   --database_path $DATASET_PATH/database.db \
   --image_path $DATASET_PATH/images

$ colmap exhaustive_matcher \
   --database_path $DATASET_PATH/database.db

$ mkdir $DATASET_PATH/sparse

$ colmap mapper \
    --database_path $DATASET_PATH/database.db \
    --image_path $DATASET_PATH/images \
    --output_path $DATASET_PATH/sparse

$ mkdir $DATASET_PATH/dense

$ colmap image_undistorter \
    --image_path $DATASET_PATH/images \
    --input_path $DATASET_PATH/sparse/0 \
    --output_path $DATASET_PATH/dense \
    --output_type COLMAP \
    --max_image_size 2000

$ colmap patch_match_stereo \
    --workspace_path $DATASET_PATH/dense \
    --workspace_format COLMAP \
    --PatchMatchStereo.geom_consistency true

$ colmap stereo_fusion \
    --workspace_path $DATASET_PATH/dense \
    --workspace_format COLMAP \
    --input_type geometric \
    --output_path $DATASET_PATH/dense/fused.ply

$ colmap poisson_mesher \
    --input_path $DATASET_PATH/dense/fused.ply \
    --output_path $DATASET_PATH/dense/meshed-poisson.ply

$ colmap delaunay_mesher \
    --input_path $DATASET_PATH/dense \
    --output_path $DATASET_PATH/dense/meshed-delaunay.ply

下面开始具体实例

2.1特征提取

colmap feature_extractor --image_path input --database_path database.db --ImageReader.camera_model OPENCV --ImageReader.single_camera 0

990a0ba4138a8c748a94979720916d0d.png

可以看到这些参数,以及我自己的设定,主要是路径和相机模型那些东西

2.2特征匹配

colmap exhaustive_matcher --database_path database.db

6b2efe1408137029afb31b6e9540bae8.png

2.3稀疏重建

首先要先创建一个文件夹,一般命名为sparse,重建好会生成一个子文件夹0,在0下面是重建好的模型,包括三个文件:image.bin,camera.bin,point3D.bin

mkdir sparse
colmap mapper --database_path database.db --image_path input --output_path sparse

de48797c0deb6fd753696b198d1621c1.png

转换格式为txt:

colmap model_converter --input_path sparse/0 --output_path sparse/0 --output_type TXT

看看稀疏重建的效果:

56e8f702be7c6f38985bd273498ac6ec.png

2.4去畸变(开始稠密重建)

也要先创建一个文件夹,一般命名为dense

mkdir dense
colmap image_undistorter --image_path input --input_path sparse/0 --output_path dense

2.5计算深度图

colmap patch_match_stereo --workspace_path dense --PatchMatchStereo.write_consistency_graph true

145cd17e5a54c7e5614012df1e46bd77.png

这里问题来了,因为内存或者显存等原因被kill:

9429cd60132e2c5c28d081470ead5f4d.png

查看了官网的FAQ,有一些设置可以避免计算深度的时候被kill:

b40427b07fc7f5e86cd05ff57fe450dd.png

就是说设置降低一下图片的分辨率,图像原本是5800*3958,我这里设置最大尺寸3600,才勉强跑完深度计算。下图为计算好的深度图

colmap patch_match_stereo --workspace_path dense --PatchMatchStereo.write_consistency_graph true --PatchMatchStereo.max_image_size 3600

8e48e1bfc7a2538111ce744c17c376c4.png

2.6fuse

又又又爆了,稠密重建太吃内存了!但是到了这一步稠密重建算是ok了,命令是没有问题的,问题在于机器本身。这里仅仅放上shell命令。事实上,稠密重建并不推荐传统的这些方法,深度学习已经做的很好了,刚好这里引入一下,后面即将更新3D Gaussian Splatting!!!

colmap stereo_fusion --workspace_path dense --output_path dense/fused.ply --StereoFusion.max_image_size=3600

 

 

 

 

 

 

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值