三维重建_COLMAP安装、使用和参数说明(翻译自官方文档)

版权声明: https://blog.csdn.net/X_kh_2001/article/details/82591978

近期因为想要入选学校某位很厉害的老师的某个项目,布置的小任务就是先把colmap以及openMVS跑一跑。我就记录了一下学习的经过。

 

一、Ubuntu上源码编译colmap:

       参考网址:https://colmap.github.io/install.html

      

1、获取源码:

             

git clone https://github.com/colmap/colmap

2、安装依赖项:
             

     sudo apt-get install \

                         git \

                         cmake \

                         build-essential \

                         libboost-program-options-dev \

                         libboost-filesystem-dev \

                         libboost-graph-dev \

                         libboost-regex-dev \

                         libboost-system-dev \

                         libboost-test-dev \

                         libeigen3-dev \

                         libsuitesparse-dev \

                         libfreeimage-dev \

                         libgoogle-glog-dev \

                         libgflags-dev \

                         libglew-dev \

                         qtbase5-dev \

                         libqt5opengl5-dev \

                         libcgal-dev

                  

                   PS:在Ubuntu16.04下,CGAL的cmake配置是损坏的,必须安装CGAL的qt5包:

                           

 sudo apt-get install libcgal-qt5-dev

 

       3、编译安装Ceres-Solver:             

         sudo apt-get install libatlas-base-dev libsuitesparse-dev

              git clone https://ceres-solver.googlesource.com/ceres-solver

              cd ceres-solver

              git checkout $(git describe --tags)               # Checkout the latest release

              mkdir build

              cd build

              cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF

              make -j12

              sudo make install

        

       4、配置和编译colmap:
                  

        git clone https://github.com/colmap/colmap.git

              cd colmap

              git checkout dev

              mkdir build

              cd build

              cmake ..

              make -j12

              sudo make install

好了到这里为止就安装完colmap了。运行一下,

             

colamp gui

成功打开一个colmap的窗口就说明安装成功了。

 

 

 

二、colmap的工程结构:

      

      这是colmap组织工程的大概结构。这里先大概了解一下有印象即可。

        

       建立稠密图一系列操作后的工程结构:

      

 

三、colmap的使用:

快速入门参考网址:https://colmap.github.io/tutorial.html

colmap -h #查看所有用法

 

1、图形化交互界面:

    

colmap gui

 

#视频教程地址:

   https://demuc.de/colmap/

   https://www.youtube.com/watch?v=bDHJM6nAKtc(前半段为colmap的使用)

一般可进行的操作:

  • 新建/打开一个工程
  • 导入/导出模型(可导出模型的常用的二进制文件格式和txt格式)
  • 特征点提取(这个过程中有可选参数)
  • 稀疏图特征点匹配(也有可选参数)
  • 稠密图图像去畸变
  • 稠密图特征点再匹配
  • 稠密图建图(融合)
  • 建网格添纹理
  • 查看数据集里的图片的情况(在Database Management里面,可以查看每张图片的特征点提取情况、每张与其他张的匹配情况等等)

 

GUI界面简易教程总结:

  • 使用别人的数据集:

      数据集下载地址:https://demuc.de/colmap/datasets/

  然后在gui界面里面,左上角file打开新建工程,然后选中你下载下来的数据集的database.db文件和图片的文件夹,然后菜单栏里Reconstruction→Start Reconstruction,等一段时间就OK了,时长视你电脑cpu性能而定。

  然后想建立稠密图的话,Reconstruction→Dense reconstruction,在Workspace里建立一个空文件夹并选中,然后左上几个按钮Undistortion、Stereo、Funsion依次点完,然后确定,你就能看到你所建立的稠密图了。其中Stereo这一步会消耗大量时间。后面两个按钮是加网格纹理的,Poisson、Delaunay,但建出来后colmap看不了,会提示你用meshlab类似的东西去查看,这一步就看个人喜好了。

 

  • 使用自己的图片集:

  仍然新建工程,database选择NEW,然后放在你存放图片的image文件夹的同级目录。图片文件夹选择你的image。然后菜单栏Processing→Feature extraction,参数不太懂的话直接默认参数,然后直接点击Extract即可。这个完了后Processing→Feature matching,仍然不太懂的话就不用改参数直接Run,等一会儿也就好了。然后跳转到上述用别人的数据集的时候的Reconstruction→Start Reconstruction这一步,后面的步骤完全相似。

 

2、终端操作:

参考网址:https://colmap.github.io/cli.html

1.打开工程进行自动重建:

   

DATASET_PATH=/path/to/project  #工程文件夹里必须包含一个叫做images的文件夹,里面放着重建所需要的图片


   

colmap automatic_reconstructor \

     --workspace_path $DATASET_PATH \

     --image_path $DATASET_PATH/images

2.单步重建:

  • -路径设置:

     

DATASET_PATH=/path/to/dataset

#工程文件夹里必须包含一个叫做images的文件夹,里面放着重建所需要的图片

  • -提取特征点:

     

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

  • --poisson法建网格添加纹理:

     

colmap poisson_mesher \ 

     --input_path $DATASET_PATH/dense/ \

     --output_path $DATASET_PATH/dense/meshed-poisson.ply

  • --delaunay法建网格添加纹理:

     

colmap delaunay_mesher \

   --input_path $DATASET_PATH/dense/fused.ply \

   --output_path $DATASET_PATH/dense/meshed-delaunay.ply

 

 

其实这些功能gui里都提供的很好了,如果觉得在gui里操作比较简单的话在gui操作更方便。

      在colmap命令行使用过程中如果遇到哪条指令忘记是啥了直接-h就OK了

      另所有命令和gui操作在文档里都有,需要的话去直接查就OK了。

 

 

四、关于一些常用参数的选择

(翻译自官方文档,因为之前对这一领域了解不多,刚刚开始接触,所以有很多名词翻译的很有缺陷,实在抱歉)

1.特征点提取(Extract features)的相机模型(camera models的选择:

你的相机参数可以在EXIF中直接提取或者在实验室中先验得到相机参数。建议如果是用的缩放系数相同的同义相机,最好就选择共享相同的参数。

参考网页:https://colmap.github.io/cameras.html

SIMPLE_PINHOLEPINHOLE如果选择的图像先天不失真,就使用这个相机模型。当然,即使在图片未失真的情况下,colmap也会选择尝试用一个相对更复杂的相机模型来改善相机参数。

SIMPLE_RADIALRADIAL如果一个相机参数是未知的并且每张图片都有一个不同的相机标定,比如互联网的上的图片,那么就应该选择这个相机模型。这两个模型分别是OPENCV, FULL_OPENCV的简化模型,这两个模型分别只用一个和两个参数来估计相机的径向畸变效应。

OPENCVFULL_OPENCV如果你对每张图片的都有一个先验的相机参数,那么既可以选择使用这个相机模型。当然你也可以选择让多张图片共享同一个相机参数然后colmap来估计该相机参数。当然,如果你每张图片实际上都有一个不同的相机参数的话,自动重建很有可能失败。

SIMPLE_RADIAL_FISHEYERADIAL_FISHEYEOPENCV_FISHEYEFOVTHIN_PRISM_FISHEYE鱼眼相机模型使用用这些相机模型。其他的所有相机模型均不能修复鱼眼相机模型的畸变。FOV模型是由Google的 Google Project Tango使用。确保不要将omega初始化为0。

 

可以在gui界面里双击specific images或者在导出的模型里看cameras.txt文件来检查估计的相机参数对不对。

 

为了得到最佳的重建效果,可以尝试多种不同的相机模型。

通常,如果你估计的焦距值和失真系数严重错误的话,一般是选择了过于复杂的相机模型。相反的,如果colmap使用了太多的本地迭代和相机之间联系的调整,则是选择的相机模型过于简单而不能完全的修复畸变效果。

 

可以选择在多张图片之中选择共享参数以获得更可信的重建结果。Share intrinsic camera parameters或者你也可以在重建过程中修正相机参数。Fix intrinsic camera parameters

源码中关于相机模型的部分的头文件camera_models.h:

https://github.com/colmap/colmap/blob/master/src/base/camera_models.h

 

2、特征点匹配(Match features)的匹配模式的选择:

穷举匹配(Exhaustive Matching):当你的数据集比较小的时候(小于100张),选择这种模式。这种模式匹配速度足够快并且是最好的效果。每张图片都与其他的所有图片进行匹配。最后生成的块大小取决于你载入内存中的图片的数量。

顺序匹配(Sequential Matching):当你拍照的时候是以连续的方式(比如视频)采集图像的话,这种方式是有用的。连续帧具有视觉重叠。每一帧的图像不必和其他所有图像都进行匹配。只有连续帧匹配就OK了。该模式也有内置的循环检测,第N个图像与其视觉上最为相似的图片匹配。但需要事先训练字典树。https://demuc.de/colmap/ 在这里可以下载。此种方法非常适合在视频序列中大量采用的情况,相比于全局匹配模式大大降低了matching时间。

字典树匹配(Vocabulary Tree Matching):在这种匹配模式下,每张图片都与与他视觉上最相近的经过按空间顺序重新排序的邻居匹配。也需要实现训练好字典树,网页地址同上。

空间匹配(Spatial Matching):这种模式下每个图像均与其空间最近邻居进行匹配。可以在数据库中手动设置空间位置。默认情况下colmap还会从EXIF中获取GPS的相关信息并用来寻找空间上最相近的邻居。如果有准确的先验空间位置信息的话,这种是推荐的匹配模式。

传递匹配(Transitive Matching):这种匹配模式使用已经存在的特征匹配的传递关系来完成更完整的匹配图。例如如果图像A匹配B而B也匹配C,那么colmap将尝试直接匹配A到C。

自定义匹配(Custom Matching):这种模式下允许指定的单个图片去匹配其他图片或者导入指定的已匹配的信息。要指定图像对的话,必须提供一个文本文件如下(每行一对一):

其中image1.jpg是图像文件夹的相对路径。有两种方式来导入单个的特征点匹配方法。原始的(未经过几何校验的)和已经经过几何校验的。在这两种选项中,格式是这样的:

 

 

其中image1.jpg是图像文件夹在工程中的相对路径,并且数字是各个图像中从零开始的特征的索引。如果给大型图像集导入很多匹配项的话,采用脚本语言更为合适。

 

3、导出格式:

参考网页:https://colmap.github.io/format.html

模型导出的格式常用的主要是二进制文件格式或者txt文件格式。当然你的需求如果是其他格式的话也是可以的。

二进制文件格式colmap读取起来更加快速,txt文件格式是人可读的,但colmap读取起来比较慢。如果colmap选择要读取的目录下面既有二进制文件格式又有txt文本格式,colmap会优先选择二进制文件格式。

直接在gui界面里,左上角有一个export model export model as text,根据你的需要选择导出目录并导出就OK了。

导出的模型一般包括三个文件:cameras.txt/ cameras.bin, images.txt/ images.bin, points3D.txt/ points3D.bin,这三个文件的作用顾名思义,具体的一些介绍去上面网页里看就OK了。

 

文章可能多处有缺陷,欢迎大家来指正!

 

没有更多推荐了,返回首页