https://colmap.github.io/index.html
+── images # 对应重建图片数据集
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
+── sparse # 稀疏重建结果
│ +── 0
│ │ +── cameras.bin
│ │ +── images.bin
│ │ +── points3D.bin
│ +── ...
+── dense # 稠密重建结果
│ +── 0
│ │ +── images # 去畸变图像
│ │ +── sparse
│ │ +── stereo
│ │ +── fused.ply # 稠密点云
│ │ +── meshed-poisson.ply
│ │ +── meshed-delaunay.ply
│ +── ...
+── database.db # 图像提取的特征相关信息
+── project.ini # 项目信息文件
Colmap 实现了不同的相机模型。不过如果相机内参未知,最好还是使用最简单的相机模型,其已经能够很好的解决畸变效应。
Colmap 可以使用 GPU 或者 CPU 提取 SIFT 特征。GPU 版本需要一个额外的显示器,因此 CPU 版本更适合于服务器使用。通常情况下,GPU版本是性能更佳。因为它具有定制的特征检测模式,在高对比度图像的情况下,该模式通常会产生更高质量的特征。
如果希望导入现有特征,每张图像必须具有一个对应的 text 文件,像 /path/to/image1.jpg and /path/to/image1.jpg.txt 这样。对应文件内容如下
NUM_FEATURES 128
X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
...
X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
4 128
1.2 2.3 0.1 0.3 1 2 3 4 ... 21
2.2 3.3 1.1 0.3 3 2 3 2 ... 32
0.2 1.3 1.1 0.3 3 2 3 2 ... 2
1.2 2.3 1.1 0.3 3 2 3 2 ... 3
Colmap 提供了多样的特征匹配方式,不同的匹配方式有不同的适用场景。
database.db 文件中存储着以下关系表:
+── sparse # 稀疏重建结果
│ +── 0
│ │ +── cameras.bin
│ │ +── images.bin
│ │ +── points3D.bin
其中既可以通过二进制文件表示,也可以通过 text 文件表示,其中具体内容细节如下:
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 3
1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
2 PINHOLE 3072 2304 2560.56 2560.56 1536 1152
3 SIMPLE_RADIAL 3072 2304 2559.69 1536 1152 -0.0218531
最后的相机参数依赖不同的 distortion model,其中 2559.81 1536 1152 分别表示焦距和 principal point 的像素位置。
# Image list with two lines of data per image:
# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
# POINTS2D[] as (X, Y, POINT3D_ID)
# Number of images: 2, mean observations per image: 2
1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
2 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180142.JPG
1190.83 663.957 23056 1258.77 640.354 59070
第一行中的 QW, QX, QY, QZ 为图像拍摄时相机的外参的四元数(使用 Hamilton 假设,符合 Eigen 中的定义),TX, TY, TZ 为对应外参的平移向量。
第二行每三个数表示一个图像关键点,其中前两个值 X,Y 分别对应关键点在图像中的像素坐标,第三个值 POINT3D_ID 为对应关键点对应的三维重建点 ID,-1 表示没有对应三维点。
# 3D point list with one line of data per point:
# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
# Number of points: 3, mean track length: 3.3334
63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227
63376 2.01848 0.108877 -0.0260841 102 209 250 1.73449 16 6519 15 7322 14 7212 8 3991
63371 1.71102 0.28566 0.53475 245 251 249 0.612829 118 4140 117 4473
ERROR 为三维点的综合重投影误差;TRACK[] 每两个数表示三维点对应的一个图像二维特征点,分别对应图像 ID 和 这张图像的二维特征点 ID。
+── images # 去畸变图像
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
+── sparse # 基于去畸变图像的稀疏重建结果
│ +── cameras.txt
│ +── images.txt
│ +── points3D.txt
+── stereo # 立体重建的结果
│ +── consistency_graphs
│ │ +── image1.jpg.photometric.bin
│ │ +── image1.jpg.geometric.bin
│ │ +── image2.jpg.photometric.bin
│ │ +── image2.jpg.geometric.bin
│ │ +── ...
│ +── depth_maps # 图像每个像素点的深度图
│ │ +── image1.jpg.photometric.bin
│ │ +── image1.jpg.geometric.bin
│ │ +── image2.jpg.photometric.bin
│ │ +── image2.jpg.geometric.bin
│ │ +── ...
│ +── normal_maps # 图像每个像素点的法线贴图
│ │ +── image1.jpg.photometric.bin
│ │ +── image1.jpg.geometric.bin
│ │ +── image2.jpg.photometric.bin
│ │ +── image2.jpg.geometric.bin
│ │ +── ...
│ +── patch-match.cfg
│ +── fusion.cfg
+── fused.ply # fusion 的结果
+── meshed-poisson.ply # poisson mesh 的结果
+── meshed-delaunay.ply # delaunay mesh 的结果
+── run-colmap-geometric.sh # 基于几何的稠密重建代码
+── run-colmap-photometric.sh # 基于视觉的稠密重建代码
The consistency graph defines, for all pixels in an image, the source images a pixel is consistent with. (没理解 o_0)。