【colmap数据格式转换】关于colmap稀疏重建结果的数据格式和数据库内容的一些笔记

  由于实验需要,最近几天在数据转换过程中深入了解了colmap稀疏重建结果的存储细节。针对数据转换,colmap官方有给出了一些转换示例的脚本代码,包括matlab、python等语言,链接。但是,即便如此,colmap官方对一些数据组织形式还是没有做更详细的说明(一把辛酸泪,很多结论都是在踩了很深的坑之后才得到的)。现记录如下:

  1. colmap数据库中,keypoints表格的data行数是实际特征点数的三倍,其中每三行的第一行才是特征点的像素坐标值,二三两行具体作用未知,如下图所示:
    【colmap数据格式转换】关于colmap稀疏重建结果的数据格式和数据库内容的一些笔记_第1张图片

  2. 在执行SQL语句SELECT pair_id, data FROM two_view_geometries或者SELECT pair_id, data FROM matches的时候,需要特别注意,要在语句末尾再加上WHERE rows>=15,这里15也可以改成其他数字(比如2),意思是,匹配图像上的匹配点对数量要大于等于15才行。不加上的话,可能会报如下错误:TypeError: a bytes-like object is required, not 'NoneType'

  3. colmap里,images和cameras的id是从1开始编号的,而二维keypoints和重建出来的三维点的id是从0开始编号的。搞清楚这个定义在处理数据过程中很重要。
    在这里插入图片描述

  4. colmap里,稀疏重建结果中,一个三维点可以在同一图像上对应两个甚至可能更多个特征点,如下图所示(截图自points3D.txt文件)。这是colmap的一个比较迷惑的操作。因为一般而言,一个三维点在同一张图像上只允许有至多一个对应的特征点。
    在这里插入图片描述
    这两个特征点的坐标如下图所示:
    在这里插入图片描述
    可以看出,虽然是同一个图像上的不同特征点,但是其坐标基本重合。

  5. colmap在重建过程中会只剔除一个track(track指同时观测到同一个三维点的所有二维特征点集合)上重投影误差过大的一些二维特征点,而不一定是直接将该track对应的三维点给剔除掉。这是一个合理且容易理解的trick,因为如果只是某张图像上的某个特征点重投影误差比较大,那么只剔除掉该特征点即可,没必要将三维点给直接剔除了。也许文字表述比较绕,在第6点给出了一个示例。

  6. 在几何验证(一般指对极几何RANSAC)过后的同一个track,有可能在稀疏重建后变成两个甚至更多个三维点。如下一个例子:
    【colmap数据格式转换】关于colmap稀疏重建结果的数据格式和数据库内容的一些笔记_第2张图片
    其中最上面一行是经过几何验证后的同一个track,但是在稀疏重建后,它们分成了三个track,重建出了三个三维点,如上表格中所示。个人猜想出现这一情况有两种可能:一是,colmap是增量式重建,这就有可能在增量过程中因为局部BA时重投影误差过大而将同一个track给重建成了多个;二是,colmap有再三角化的操作,可能同一个track在重建过程中由于重投影误差过大而被剔除掉很多特征点,但是这些特征点在再三角化的时候又被重建成一个新的三维点。此外,从下面那个表格可以看出,26和29这两张图像上的特征点并没有被重建成三维点,即第5点给出的解释。

  7. 几何验证后的track与最终重建出的结果相比,被去掉的outliers中基本上都是只有两个匹配点的。这也是可以解释的,因为在重建时,一个三维点被越多张图像所观测到,其可靠性也会越高;反之则越低,越有可能被剔除掉。

  8. 最后,再附上一个images文件里的相机位姿表达格式的说明:【踩坑】colmap中的相机位姿定义及其可视化结果的隐含转换 。

你可能感兴趣的:(SfM,colmap,colmap,三维重建,sfm)