这个问题来自于我想要使用colmap的稀疏重建结果,然后发现由于相机坐标系的定义没弄清楚,导致我获取的结果存在问题。
1 问题引出
下面先从我们还不知道坐标系定义的视角开始理解,引出问题所在。使用的是一份无人机影像数据,共有59张影像:
下图是colmap输出的稀疏重建结果,没有什么问题,与实际飞行情况也是相符合的:
下图是导出的txt格式的重建结果中的images.txt文件,根据格式说明,其中IMAGE_ID这行的倒数第三个数据是相机的Z坐标,比如图像1为0.365289,图像2为-0.0520487。
现在,我们将所有图像的X、Y、Z都导出,在cloudcompare软件中进行可视化,如下图所示。可以看出,这些相机的分布与colmap中的是不一样的,这里的分布有种高低错落的感觉。很明显,这不是正确的,无人机在采集数据时候也是不可能这么飞行的。
这就很奇怪了,这个数据明明是直接从colmap中导出来的,我没有对其进行任何更改,怎么会出现不一样的显示?这点诡异还在于,如果你去colmap中双击重建结果中的某个相机,可以看到该图像的信息,比如图像1,如下图所示,其tx、ty、tz和images文件中的一模一样。那为什么一样的数据,在colmap中的显示看上去是符合常理的正确结果,但是在其他软件上显示的却不一样(但是不可能是因为cloudcompare软件有问题)?
于是,我决定去修改images文件中的所有相机的Z坐标值,我将它们全部设置为5.0,这样的话,按理说这些相机的可视化结果肯定在一个平面上。但是并不是这样的,其在colmap中的显示结果如下图所示:
就很诡异的,该结果与正确结果在cloudcompare里的显示似乎排列很像。为什么会出现这种情况?这个问题其实困扰了我很久,一度以为是相机的排列或是什么原因。但是其实它们确实也并不是随机杂乱的排列,而是似乎存在某种变换关系。于是,我对其进行了变换(在下一节说明),再次获得的位姿结果在cloudcompare中进行了可视化,如下图所示,这回总算是正确的了。
2 坐标系定义及转换
首先介绍一下世界坐标系和相机坐标系,它们之间是存在一个转换关系的(它们是互逆的变换)。世界坐标系就是指定一个世界原点,所有相机的坐标都是相对于这个原点来定义的。相机坐标系就是以每个相机自身作为坐标系原点(三维空间中即为[0,0,0])。现假设空间中一点X,它在某个相机坐标系下的坐标是Xcamera,在世界坐标系下的坐标是Xworld。假设它通过R和t实现从相机坐标系到世界坐标系之间的转换:
Xworld = RXcamera + t
那么,由上式,我们可以推得从世界坐标系向相机坐标系的转换关系(RT=R-1,所以通常直接使用RT即可):
Xcamera = RTXworld - RTt
但是,在colmap中,其坐标系定义和上面说的这个是相反的:
Xcamera = RXworld + t
所以相应的,将其变换到世界坐标系下的公式为:
Xworld = RTXcamera - RTt
也就是说,colmap输出的images文件中的四元数Q和平移向量T,是其定义的相机坐标系下的R和t。但是,如果我们要将这些相机放在一起进行可视化的话,那么我们需要首先将其变换到世界坐标系下(这样才能统一),即:
R’ = RT
t’ = -RTt
实际上,colmap自身在进行可视化的时候,已经隐含了这样的一个变换过程了,但是如果你去点击可视化的相机,查看到的数值其实还是相机坐标系下的Q和t,极具迷惑性(这个例子在第一节中已经有说明了)。文章来源:https://www.toymoban.com/news/detail-456071.html
关于相机坐标系和世界坐标系之间的转换和关系的理解,可以参考:【三维视觉】相机模型和旋转矩阵文章来源地址https://www.toymoban.com/news/detail-456071.html
到了这里,关于【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!