colmap介绍和使用
colmap官方教程的笔记
需要CUDA才能稠密重建,否则只能稀疏重建
Colmap论文——《Structure-from-Motion Revisited》论文阅读笔记
Tutorial
传统上,基于图像的3D重建首先使用“运动结构Structure-from-Motion”来恢复场景的稀疏表示和输入图像的相机姿态。然后,此输出用作“多视图立体Multi-View Stereo”的输入,以恢复场景的密集表示。
1 | /path/to/project/... |
重建的过程
-
Structure-from-Motion
- 是将3D结构从投影重建为一系列图像的过程。输入是从不同视点拍摄的同一对象的一组重叠图像。输出是物体的三维重建,以及所有图像的重建的内在和外在相机参数。
- 通常,“运动结构”系统将此过程分为三个阶段: 特征检测与提取 特征匹配和几何验证 结构和运动重建
- 为了更好的重建需要:
- 捕捉纹理良好的图像。如果场景本身没有包含足够的纹理,可以放置其他背景对象,如海报等。
- 在相似的照明条件下拍摄图像。避免高动态范围的场景(例如,有阴影的阳光照片或透过门/窗的照片)。避免在有光泽的表面上出现镜面反射。 拍摄具有高度视觉重叠的图像
- 确保每个对象至少在3张图像中可见——图像越多越好。 从不同的视角拍摄图像。不要仅通过旋转相机从同一位置拍摄图像,例如,在每次拍摄后走几步。同时,尽量从相对相似的角度获得足够的图像。请注意,更多的图像并不一定更好,并且可能导致重建过程缓慢。如果使用视频作为输入,请考虑对帧速率进行下采样。
-
Multi-View Stereo
- 用SfM的输出来计算图像中每个像素的深度和/或法线信息。3D中多个图像的深度图和法线图的融合然后产生场景的密集点云。结合融合点云的深度和法线信息,利用泊松表面重建算法可以恢复场景的3D表面几何形状。
-
Feature Detection and Extraction
- 首先决定使用的内部摄影机模型,可以从嵌入的EXIF信息中自动提取信息然后在大型相机模型数据库中查找相机规格,也可以手动指定固有参数
- 如果您的所有图像都是由相同的物理相机以相同的缩放因子拍摄的,建议在所有图像之间共享内部信息。
- 如果在所有图像之间共享相同的相机型号,但并非所有图像都具有相同的大小或EXIF焦距,则程序将不正常地退出。
- 可以从图像中检测和提取新SIFT特征,也可以从文本文件中导入现有特征,如果导入现有功能,则每张图像旁边都必须有一个文本文件(例如/path/to/image1.jpg和/path/to/image1.jpg.txt)。
- 按照惯例,图像的左上角具有坐标(0,0),最左上角像素的中心具有坐标(0.5,0.5)
-
特征匹配与几何验证
- 找到不同图像中特征点之间的对应关系。
- 多种匹配方法:
- 穷举Exhaustive匹配:像数量相对较低(数百张),则这种匹配模式应该足够快,并产生最佳的重建结果。
- 顺序Sequential 匹配:如果图像是按顺序采集的,例如通过摄像机采集,则此模式非常有用。在这种情况下,连续帧具有视觉重叠,并且不需要完全匹配所有图像对。
- 词汇树Vocabulary Tree匹配:在这种匹配模式中,使用具有空间重新排序的词汇树,将每个图像与其视觉上最近的邻居进行匹配。这是大型图像集合(数千个)的推荐匹配模式。这需要一个预先训练好的词汇树。
- 空间Spatial 匹配:这种匹配模式将每个图像与其空间上最近的邻居进行匹配。空间位置可以在数据库管理中手动设置。默认情况下,COLMAP还会从EXIF中提取GPS信息,并将其用于空间最近邻搜索。
- 传递Transitive匹配:如果图像A与图像B匹配并且B与C匹配,则该匹配器尝试直接将A与C匹配。
- 自定义Custom 匹配:此模式允许指定单个图像对进行匹配或导入单个特征匹配。要指定图像对,必须为文本文件提供每行一个图像对:
- 详尽匹配的预期时间从几十张图像的几分钟到数百张图像的几个小时,再到数千张图像的数天或数周。
-
稀疏重建
- COLMAP首先将所有从数据库中提取的数据加载到存储器中,并从初始图像对中对重建进行种子化。然后,通过注册新图像和三角测量新点来逐步扩展场景。
-
导入和导出
- 建议以COLMAP的数据格式导出重建,方法是选择“文件”>“导出”导出当前查看的模型,或选择“文件>全部导出”导出所有重建的模型。使用重建的摄影机、图像和点的单独文本文件将模型导出到选定文件夹中。当以COLMAP的数据格式导出时,您可以重新导入重建,以便以后进行可视化、图像不失真,或者从它停止的地方继续现有的重建。要导入模型,请选择“文件”>“导入”,然后选择导出文件夹路径。
- 也可以通过选择“文件”>“导出为…”以各种其他格式导出模型,如Bundler、VisualSfM 1、PLY或VRML。
-
密集重建
-
为所有注册图像生成深度图和法线图,将深度图和法向图融合为具有法线信息的密集点云,并最终使用Poisson或Delaunay重建从融合的点云中估计密集表面。
-
点云的重建法线不能在COLMAP中直接可视化,但例如在Meshlab中,通过启用“渲染>显示法线/曲率”(Render>Show Normal/Curvature)。同样,重建的密集表面网格模型必须使用外部软件进行可视化。
-
除了内部密集重建功能外,COLMAP还导出到其他几个密集重建库,如CMVS/PMVS或CMP-MVS。请选择“附加”>“无失真图像”(Extras > Undistort images),然后选择适当的格式。输出文件夹包含重建图像和未失真图像。此外,这些文件夹还包含用于执行密集重建的示例shell脚本。要运行PMVS2,请执行以下命令:
1
./path/to/pmvs2 /path/to/undistortion/folder/pmvs/ option-all
-
数据格式
-
COLMAP将所有提取的信息存储在一个SQLite数据库文件中。可以使用COLMAP GUI中的数据库管理工具包、提供的C++数据库API(请参阅src/COLMAP/scene/database.h)或您选择的脚本语言(请参阅scripts/python/database.py),该数据库包含以下表格:
-
cameras:相机和图像之间的关系是1比N
-
images
-
keypoints:关键点被存储为前两列分别是图像中的X和Y位置float32二进制。第三列是特征的比例,第四列是特征方向(根据SIFT约定)
-
descriptors:描述符被存储为行主uint8二进制Blob,其中每一行描述关键点表中相应条目的特征外观,行表指定每个图像检测到的特征数量
-
matches:特征匹配将其输出存储在匹配表中
-
two_view_geometries:几何验证存储在two_view_geometries表中
-
相机模型分类
- SIMPLE_PINHOLE,PINHOLE:如果您的图像事先没有失真,请使用这些相机模型。它们分别使用一个和两个焦距参数。
- IMPLE_RADIAL,RADIAL:如果内部未知,并且每张图像都有不同的相机校准,例如,在互联网照片的情况下,这应该是选择的相机型号。这两个模型都是OPENCV模型的简化版本,仅分别用一个和两个参数对径向畸变效应进行建模。
- OPENCV,FULL_OPENCV:如果事先知道校准参数,请使用这些相机模型。
- SIMPLE_RADIAL_FISHEEYE、RADIAL_FISHEEYE、OPENCV_FISHEEY、FOV、THIN_PRISM_FISHEYE:将这些相机模型用于鱼眼镜头·