默认情况下,COLMAP使用二进制文件格式(bin,机器可读,速度速)来存储稀疏模型。此外,COLMAP也可以将稀疏模型存储为文本文件(txt,人类可读,速度慢)。在这两种情况下,模型导出的信息被分为关于相机、图像和点云的三个文件。任何包含这三个文件的目录都构成了一个稀疏模型。二进制文件的扩展名是.bin,文本文件的扩展名是.txt。注意,当从包含二进制文件和文本文件的目录加载模型时,COLMAP更倾向于二进制格式。
参考网页:https://colmap.github.io/format.html
要在GUI(可视化界面)中导出当前的模型,选择File > Export model,要导出当前数据集中的所有重建模型,选择File > Export all models,为bin文件。要想导入已经导出的模型,例如,为了可视化或恢复重建,选择File > Import model,并选择包含相机、图像和点云文件的文件夹。
此外,还可以将稀疏模型导出为其他格式,例如VisualSfM的NVM、Bundler文件、PLY、VRML等,使用File > Export model as....
要在GUI导出文本格式,使用File > Export model as text导出模型。三个文本文件:camera .txt、images.txt和points3D.txt。注释以前导“#”字符开始。第一行注释简要描述了文本文件的格式。
这个文件包含了数据集中所有重建相机的内参,每个相机占一行,例如:
- # Camera list with one line of data per camera:
- # 一行一个相机参数列表
- # CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
- # 相机ID, 相机, 宽, 高, 参数[]
- # 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
上述数据中,数据集包含 3 个相机,这些相机使用具有相同传感器尺寸(宽度:3072,高度:2304)的不同失真模型。 参数的长度是可变的,取决于相机型号。 对于第一个相机,有 3 个参数,单个焦距为2559.81像素,主点(即 cx,cy)位于像素位置(1536、1152)。相机的内参可以被多个图像共享,这些图像使用唯一标识符 CAMERA_ID 来指代相机。
如下:
该文件包含数据集中所有重建图像的位姿和关键点,每个图像占两行,例如:
- # Image list with two lines of data per image:
- # 每张图像数据占两行
- # IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
- # 图像ID, QW, QX, QY, QZ, TX, TY, TZ, 相机ID, NAME
- # POINTS2D[] as (X, Y, POINT3D_ID)
- # 2D点坐标和对应3D点ID, 若没有对应的3D点则ID标记为-1
- # 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) 和平移向量 (TX, TY, TZ) 将图像的重建位姿指定为从世界到图像的相机坐标系的投影。四元数是使用 Hamilton 约定定义的,例如,Eigen 库也使用该约定。投影/相机中心的坐标由 -R^t * T 给出,其中 R^t 是由四元数组成的 3x3 旋转矩阵的逆/转置,T 是平移向量。从图像上看,图像的局部相机坐标系定义为 X 轴指向右侧,Y 轴指向底部,Z 轴指向前方。
上面示例中的两个图像都使用相同的相机模型并共享内参 (CAMERA_ID = 1)。映像名称与项目的选定基础映像文件夹相关。第一个图像有 3 个关键点,第二个图像有 2 个关键点,而关键点的位置由像素坐标指定。两幅图像都观察到 2 个 3D 点,并注意第一张图像的最后一个关键点在重建中没有观察到 3D 点,因此 3D 点标识符为 -1。
如下:
发现导出的 txt 和示例不一样,找不到第二张图片的信息,苦恼很久,才醒悟是关键点信息太多了,解决办法如下:
该文件包含数据集中所有重建的3D点的信息,每个点占一行,例如:
- # 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)
- # POINT3D_ID:三维点的id (二维点可以根据此id找到图片对应的三维点)
- # X, Y, Z:三维点坐标
- # R, G, B:三维点颜色信息
- # ERROR:投影误差(基于像素)
- # 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
这里有三个重建的 3D 点,其中TRACK[] as (IMAGE_ID, POINT2D_IDX):对应images.txt里的图像id,POINT2D_IDX 定义了 images.txt 文件中关键点的从零开始的索引。比如说上面:16 6542,意思是images.txt中图片ID为16的里面的第6542个点,这个点是该图的特征点,也映射到这个三维点。误差以重投影误差的像素为单位,仅在全局BA后更新。
如下: