这个问题来自于我想要使用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,极具迷惑性(这个例子在第一节中已经有说明了)。

关于相机坐标系和世界坐标系之间的转换和关系的理解,可以参考:【三维视觉】相机模型和旋转矩阵

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐