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

【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换相关推荐

  1. Unity GPU Instance踩坑记录

    Unity GPU Instance踩坑记录 Unity中GPUInstance主要有两种:一种是unity自动进行的,或者调用Graphics.DrawMeshInstancedIndirect等A ...

  2. ZED2代相机+nvidia jetson AGX xavier踩坑记录

    ZED2代相机+nvidia jetson AGX xavier踩坑记录 项目描述 nvidia jetson AGX xavier就不详细介绍了,jetson系列嵌入式开发板比一般的arrch64开 ...

  3. Qt5.13.2中配置opencv4.5.0踩坑记录

      目录 cmake编译opencv时速度过慢或超时 mingw32-make时报错 错误一 [modules\core\CMakeFiles\opencv_core.dir\build.make:1 ...

  4. 微信退款 java工具类,微信支付中退款踩坑记录

    首先附上微信支付的开发者文档 其实这里所说的踩坑记录,无非就是微信在开发者文档上的写不太明确,也没有比较官方的demo,在此列出一个可行的demo,供大家下载使用. 主要问题就是在这几步解密上 微信的 ...

  5. AirSim学习和踩坑记录(不定时更新)

    版权声明:本文为博主原创文章,遵循Creative Commons - Attribution-ShareAlike 4.0 International - CC BY-SA 4.0版权协议,转载请附 ...

  6. 乐视体感摄像头开发踩坑记录

    乐视三合一体感相机开发踩坑记录 第一次用Cmake,以下如有错误请大佬指正 开发环境: Linux ARM(树莓派4) AstraSDK-v2.1.3 Arm/Arm64(https://orbbec ...

  7. 安卓 Native+Flutter 应用开发入门资料、亲身实战及踩坑记录

    安卓 Native+Flutter 应用开发实战及踩坑记录,练手入门项目:FluLearn 入门资料 第三方共享包检索(国内).第三方共享包检索(国外) Flutter开发环境搭建(中文版).Flut ...

  8. 【踩坑记录】仿真环境使用小车进行Cartographer 3D Slam(深度摄像头)

    [运行背景] ROS1 20.04 noetic 安装cartographer请看: [安装学习]安装Cartographer ROS(noetic)_Howe_xixi的博客-CSDN博客网上使用n ...

  9. YOLOv5在无人机/遥感场景下做旋转目标检测时进行的适应性改建详解(踩坑记录)...

    作者丨略略略@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/358441134 编辑丨极市平台 文章开头直接放上我自己的项目代码: https://github.co ...

最新文章

  1. 在Ubuntu上安装openResty #1
  2. Ubuntu terminal路径太深,名字太长
  3. 链表c的经典实现(一)
  4. C和C++太难了。。搞这个方向进大厂它不香吗?
  5. 10-12-顺序表地址排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版...
  6. 多层GCN的over-smooth问题
  7. java面向对象程序设计编程题,已拿到offer
  8. php快速排序空间复杂度,PHP 算法基础----时间复杂度和空间复杂度(转载)
  9. js ajax 传输list,jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签...
  10. 多语言调用之 Java调用C/C++
  11. ecshop 源码文件结构说明
  12. opencv学习十二(车牌识别)
  13. 基于Go的马蜂窝旅游网分布式IM系统技术实践
  14. mysql数据库实训总结_数据库实训报告
  15. 理论结合实际:如何调试神经网络并检查梯度
  16. 一起搭建私有物联网云平台讲解
  17. 使用免费小图标(趣味)
  18. HTML+CSS制作知乎登录页面
  19. 51单片机学习笔记之数码管工作原理
  20. C# SharpZipLib 压缩中文文件名乱码的解决办法(必看 实测有用)

热门文章

  1. Mac下浏览器安装证书
  2. 世界药王再遭“无间道”,药企如何保护自己的数据
  3. VMware发布Linux虚拟桌面技术预览版
  4. 《创业时代》,不带你们这样黑程序员的
  5. 让你脊背发凉的10个故事
  6. 【干货】新显卡太贵,便宜老卡怎么选?二手亮机卡过渡指南!
  7. 我与编程,编程予我。
  8. Origin数据设置为日期/时间的方法
  9. linux下免费远程控制工具,ToDesk Linux版下载
  10. MicroPython_ESP8266_IoT——第四回 初入联网(接入了贝壳物联)