赞
踩
因为最近又要搞一下三维重建相关的研究,所以这个系列的文章又被我拾起来了。这一章主要介绍Linux 下如何通过Colmap 生成可用于MVSNet 网络进行三维重建的自定义数据集,包括通过SFM算法估计到的相机内外参信息和位置配对信息。
具体安装步骤可以查看Colmap的官网:Installation — COLMAP 3.8 documentation
- # 安装编译所需的依赖
- apt-get install git cmake ninja-build build-essential
-
- # 安装libboost 依赖
- apt-get install libboost-program-options-dev libboost-filesystem-dev libboost-graph-dev libboost-system-dev libboost-test-dev libboost-regex-dev
-
- # 安装其它工具的依赖
- apt-get install libeigen3-dev libflann-dev libfreeimage-dev libmetis-dev libgoogle-glog-dev libgflags-dev libsqlite3-dev libceres-dev libcgal-dev
-
- # 安装出现报错的glew和qt5
- apt-get install libglew-dev qtbase5-dev libqt5opengl5-dev libcgal-qt5-dev
我在安装glew和qt5的时候出现报错:"you have held broken packages",原因是我使用的镜像存在问题,有些依赖的安装包版本有误,具体排查方式如下:
报错:libglew-dev : Depends: libgl1-mesa-dev but it is not going to be installed or libgl-dev
那就直接安装:apt-get install libgl-dev
报错:libgl1-mesa-dev : Depends: libx11-xcb-dev but it is not going to be installed
继续直接安装:apt-get install libx11-xcb-dev
报错:libx11-xcb-dev : Depends: libx11-xcb1 (= 2:1.6.4-3ubuntu0.4) but 2:1.6.4-3ubuntu0.5 is to be installed
删除原错误版本的:apt-get remove libx11-xcb1
重新安装glew:apt-get install libglew-dev
安装正常!
如果还是有broken packages的问题,通过相同的方式逐步排查即可。
如果想要编译支持CUDA的版本,还需要安装下面的系统依赖(因为我只需要做SFM就可以,所以没有进行安装):
apt-get install nvidia-cuda-toolkit nvidia-cuda-toolkit-gcc
git clone https://github.com/colmap/colmap
(如果不方便科学上网下载速度比较慢的话,可以在gitee 上点击右上角的+,选择从GitHub 导入仓库,导入到自己gitee 私人仓库中再进行拉取就可以了)
git checkout dev
创建并进入编译目录,并执行编译:
- mkdir build
- cd build
- # 因为我不编译CUDA版本,所以需要改一下参数
- cmake .. -DCUDA_ENABLED=OFF -GNinja
- ninja
在cmake过程中,遇到报错"Could not find LZ4",是因为我环境中没有这个库,解决方法如下,如果发现没有其它的库,也可以用同样的方式进行编译安装即可:
下载源码:1.9.4-1 : lz4 package : Ubuntu
下载完成后解压并进入lz4-1.9.4 目录,执行:
make
make install
在ninja过程中,遇到报错”make_unique is not a member of std“,我一直以为是安装的gcc 或者g++ 有问题,但是7.5.0 版本默认是支持C++14 标准的,最后发现是我apt-get 安装的cmake 版本太低了。从Index of /files 网站上下载cmake 3.26.1 版本并解压到对应目录下,使用bin 目录下的cmake 编译正常。
ninja install
安装完成后执行colmap -h 查看功能正常:
通过源码进行colmap 的安装可能会遇到一些比较诡异的问题,根据官网上操作步骤进行如果存在问题的话,一般是环境问题的可能性比较大。我用的docker 镜像是别人提供的一个ubuntu 18.04.6 的版本,我需要在这个版本上开发,所以遇到了一些问题影响了进度。大家在操作的时候还是选择常用镜像比较好,祝安装顺利,一次成功!
PS:之前也尝试过在RAM 架构上进行colmap 的源码编译和安装,主要就还是系统依赖比较麻烦,缺少哪个都需要进行对应的make 和make install ,解决掉依赖问题之后可以正常安装并运行。
因为我是通过docker 镜像去进行的操作,所以没有GUI 界面操作,而是直接通过命令行进行的稀疏重建。
将待重建图像放到database/images 目录下,然后通过命令行进行特征提取:
colmap feature_extractor --database_path ./database/database.db --image_path ./database/images/ --SiftExtraction.use_gpu 0
在没有编译CUDA只通过CPU进行特征提取的情况下,一定要加上"--SiftExtraction.use_gpu 0",不然会出现报错"Could not connect to any X display",因为colmap 通过GPU 进行特征提取必须要用到GUI 界面。同时也可以通过"--ImageReader.camera_model" 设置相机类型,相机类型已知的情况下,计算结果更精确。
特征提取成功后,执行命令进行特征点匹配:
colmap exhaustive_matcher --database_path ./database/database.db --SiftMatching.use_gpu 0
在没有编译CUDA只通过CPU进行特征点匹配的情况下,一定要加上"--SiftMatching.use_gpu 0"。
特征点匹配成功后,执行命令进行稀疏重建:
- mkdir database/sparse
- colmap mapper --database_path ./database/database.db --image_path ./database/images --output_path ./database/sparse
稀疏重建成功,colmap 得到的三维重建的一些信息都放在database/sparse/0 目录下的bin 文件中了。为了构建后续MVSNet 所用的数据集,需要执行命令将相机和稀疏点云信息保存到txt 文件中。
colmap model_converter --input_path ./database/sparse/0 --output_path ./database/sparse/0 --output_type TXT
执行完成后就可以在database/sparse/0 目录下看到转换出的txt 文件了,其中camera.txt 保存相机内参数,images.txt 保存图片外参数和图片二维特征与三维空间点对应信息,points3D.txt 保存三维空间点在世界坐标系下坐标、RGB值以及在各个影像上的轨迹。
colmap 生成的txt 文件是不能直接在mvsnet 的数据集上使用的,需要通过YoYo 大佬提供的colmap 相机参数转MVSNet 相机参数的脚本colmap2mvsnet.py 进行转换(脚本下载方式可见上一篇)。将sparse/0 目录下的txt 文件拷贝到与images 同级的目录下,执行命令:
python colmap2mvsnet.py --dense_folder /home/mvsnet/
如果有报错"shutil.SameFileError",说明images 文件夹内图像的命名规则已经满足MVSNet 数据集的要求,不需要再重命名,需要将colmap2mvsnet.py 脚本中最后两行拷贝命令注释掉。
脚本执行完成后,可以看到在mvsnet 文件夹下新生成了cams 文件夹(包含相机内外参信息文件)和pair.txt (图片匹配信息)文件,进入images 文件夹,可以看到图片重命名后生成的文件(用于MVSNet网络),将iamges、cams 和pair.txt 文件夹放在同一文件夹下,并命名为scan1 这种格式,则在Linux 下的自定义数据集生成完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。