点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

作者:紫薯萝卜

https://zhuanlan.zhihu.com/p/103694374

本文仅做学术分享,如有侵权,请联系删除。

特征点三角化(Triangulation)是VSLAM中一个非常基础的问题,它是根据特征点在多个相机下的投影恢复出特征点的3D坐标。

特征点在某个相机中被观测到,根据相机位姿和观测向量可以得到3D空间中的一条从相机中心出发的观测“射线”,多个相机位姿观测会产生多条观测射线,理想情况下这些观测射线相交于空间中一点,求所有观测射线的交点就是特征点在3D空间的位置,这就是三角化最朴素的思想。

实际中由于噪声的存在,这些观测射线不可能刚好相交于一点,那如何求特征点坐标呢?有几种思路:

1.最直觉的思路是:找一个3D点与所有观测射线的距离都很近,以此作为特征点。

2.另一种思路觉得:误差来源于2D图像观测,所以把特征点投影到每个2D相机平面,最小化所有2D投影点到对应观测点之间的距离(重投影误差)。

3.第三种思路是:很多时候三角化是在线(Online)运行的,并不是全部观测都拿到以后再进行求解,而是一边获取观测一边估计特征点,所以用一个滤波器来估计特征点的概率分布(通常是Gaussian),旧的观测信息被隐式的存放在概率分布中,来了新的观测后,用新的观测来更新特征点的概率分布,这样能够节省很大的计算量,这就是滤波方法的朴素思想。

0. 问题定义

设3D特征点 个相机观测到,已知:相机姿态 ,相机内参 ,特征点在各相机的图像观测,求:特征点的3D坐标

不考虑误差的情况有如下投影关系(接下来的方法基本上都会用到该投影关系):

1. 闭式求解

1.1 最小化3D距离

https://pdfs.semanticscholar.org/7b9e/7b5c372692f6dedad0bfba4771e9e278e2a5.pdf

最小化3D距离的目标是:在世界坐标系下求一个3D点离所有观测射线的3D距离最近。

先求观测射线的数学方程:将图像观测转为相机坐标系下的单位观测向量 (注意:这里的 是单位向量,不是normalize 平面的向量):

式中 是观测在normalize平面的齐次坐标, 是归一化后的单位方向向量, 是齐次坐标。是相机坐标系中的向量,将它转到世界坐标系得到世界系的观测射线方程为:

特征点到射线的距离为:

证明:,三角形 的面积为:

目标函数定义为特征点 到所有观测距离的平方和最小(最小二乘):

为了简化求解,令 ,去掉部分上下标,目标函数变形为

优化问题等价于求线性方程组的最小二乘解:

对于超定方程组 其最小二乘解为:,对于上述方程组:

注意:必须是单位向量而不是normalize平面向量,两个地方用到了该约束:一个是计算特征点到观测射线距离时,另一个是上述推导中求反对称矩阵平方时。

1.2 Direct Linear Transform

https://all-med.net/pdf/multiple-view-geometry-in-computer-vision/

设特征点齐次坐标 ,在第 个相机的图像观测点齐次坐标为 ,投影矩阵为 ,投影模型如下:

可得 ,将其展开:

得到三个等式方程,但其实第三个方程是前两个方程的线性组合

所以只有两个线性无关的方程,每个相机观测有两个线性方程,将 个相机观测的约束方程合并得到 个线性方程:

求解齐次方程组解得 ,由于 是齐次坐标,将解的最后一项归一化为1得到特征点坐标。

1.1和1.2介绍了两种方法都是得到最小二乘意义下的闭式解,但解的形式确不一样,根本原因在于它们的目标函数不同,1.1中的目标函数是最小化3D特征点到所有观测射线之间的距离,而DLT用的目标函数是

DLT的目标函数到底优化的是什么?

它的物理意义并不是很直观,为了对比两种方法的区别,暂时忽略内参 ,令 ,则 相当于特征点在相机坐标系下的坐标,如果我们在相机坐标系下优化3D特征点到观测射线的距离,则可以得到1.1中目标函数的另一种等价形式:

这时再回过头看DLT的目标函数 ,DLT相当于优化的是相机原点、normalize平面观测点以及特征点三者组成的三角形的面积。当考虑了内参 以后,DLT的物理意义又变得不明确了。

2. 优化方法

优化方法基本都是最小化重投影误差(图像平面或Normalize平面),当然你也可以优化特征点到观测射线的3D距离,但这个有闭式解,没必要做优化迭代,而优化重投影误差是个非线性优化问题。

先思考一个问题:既然已经有了闭式解法,为什么还要做优化迭代呢?闭式求解它不香吗?

实践证明,闭式求解确实不香,至少没有优化方法香。其实很好理解,我们把最小二乘解理解为将误差项建模为高斯分布情况下的最大似然估计,闭式方法将高斯误差加在特征点到观测射线的距离上,而实际误差来源于图像观测,所以将高斯误差加在图像平面的距离上更符合实际。因此一般做三角化都是先用闭式解得到初始值,然后在此基础上优化重投影误差,以获得比闭式解更高的精度。

优化方法的目标函数为:

其中, 为投影函数,非线性最小二乘优化求解的关键在于推导 相对于特征点 的Jacobian:

具体的Jacobian推导参见之前的文章《VSLAM中特征点的参数化表示》和《MSCKF那些事(七)算法详解5:Measurement Update》,优化对象不一定是特征点的xyz坐标,也可以优化逆深度等其他特征表示。

得到Jacobian之后,就是常规的非线性最小二乘求解了,常用的方法有高斯牛顿法、LM法、Dogleg法,参见

https://www.ltu.se/cms_fs/1.51590!/nonlinear_least_squares.pdf

3. 滤波方法

3.1 EKF-SLAM

滤波方法将特征点表示成一个概率分布进行估计,通常是Gaussian分布 ,通过相机观测来估计特征的均值和协方差。与优化方法类似,滤波方法也是推导重投影误差对特征点的Jacobian,但通常相机位姿也是不准的,所以会把相机位姿和特征点放到特征向量中一起估计,也就是EKF-SLAM,这是残差模型中的Jacobian包含两块:重投影误差对相机状态的Jacobian以及对特征状态的Jacobian:

3.2 Depth Filter

https://www.researchgate.net/publication/262378002_SVO_Fast_Semi-Direct_Monocular_Visual_Odometry

Depth Filter选取一帧图像(通常是第一帧)作为参考帧,然后将特征点坐标表示成 ,SVO假设参考帧的观测坐标 没有误差,这样特征点只取决与深度 ,我们只需要利用其他帧观测来估计 就好,从而将三维的特征点估计问题转变的一维的深度估计问题。出于一系列考虑,Depth Filter估计的是逆深度

逆深度的概率分布建模为一个高斯分布和一个 区间均匀分布的加权:

其中,逆深度为 , 内点率为 , 观测为 ,已知观测 需要估计 , 根据Bayes公式得到后验概率:

由于计算复杂,无法直接用上式来迭代计算概率分布,SVO中用Gaussian Beta分布来近似:

然后推导出Gaussian Beta分布的迭代公式,迭代公式的推导比较复杂,具体可以参见SVO原文。

推荐阅读:

  • 专辑|相机标定

  • 专辑|3D点云

  • 专辑|SLAM

  • 专辑|深度学习与自动驾驶

  • 专辑|结构光

  • 专辑|事件相机

  • 专辑|OpenCV学习

  • 专辑|学习资源汇总

  • 专辑|招聘与项目对接

  • 专辑|读书笔记

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近1000+星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

VSLAM中的特征点三角化相关推荐

  1. 重磅直播|SLAM/sfm中的两视图三角化方法

  2. 今夜喜雨 | 直线线性三角化理论

    雨夜,用了两个小时的时间终于推导了直线三角化的公式.直线三角化? 是的,即通过两帧的匹配直线得到空间直线的端点,如果端点严格匹配那么就是点的三角化,你可以从<SLAM十四讲>一书或者其他的 ...

  3. SLAM中多目三角化

    多目三角化 1.闭式求解 1.1 DLT 最小二乘方法求解 1.2 最小化3D距离 2.构建优化方法求解 3.构建高斯深度滤波器 LSD_SLAM 4.构建Beta分布滤波器-- SVO 5.EKF- ...

  4. SLAM中双目三角化

    双目三角化 形式1:在等式左边同时乘x1x_1x1​ 和Rx2Rx_2Rx2​ 形式2:直接变形 形式3:等式两边同时叉乘x1 形式4:Direct Linear Transform 参考资料 在SL ...

  5. 贪婪投影三角化算法中的参数设置

    无序点云的快速三角化 本小节描述了怎样使用贪婪投影三角化算法对有向点云进行三角化,具体方法是先将有向点云投影到某一局部二维坐标平面内,再在坐标平面内进行平面内的三角化,再根据平面内三位点的拓扑连接关系 ...

  6. 摄影测量(计算机视觉)中的三角化方法

    提到三角化大家都十分熟悉,在CV 领域中,由像点计算物点的过程称为三角化,但在摄影测量领域,其称作为前方交会.值得注意的是单张影像是无法恢复像点的三维坐标,至少需要两张影像才能得到像素点的真实坐标(这 ...

  7. halcon边缘提取颜色相近_初学者福利!三种用Python从图像数据中提取特征的技术...

    全文共4073字,预计学习时长8分钟 你之前是否使用过图像数据?也许你想建立自己的物体检测模型,或者仅仅是想统计走进某栋建筑物的人数,使用计算机视觉技术处理图像拥有无穷无尽的可能性. 但数据科学家最近 ...

  8. PCL中GreedyProjection三角化算法简介与示例

    文章目录 前言 一.PCL点云三角化 1.1 Delaunay三角剖分 1.2 贪婪三角化 二.程序示例 总结 前言 Delaunay三角剖分最初应用于2维领域,而与Greedy三角化算法的结合,使之 ...

  9. 视觉SLAM笔记(35) 三角化求特征点的空间位置

    视觉SLAM笔记(35) 三角化求特征点的空间位置 1. 特征点的空间位置 2. 三角测量函数 3. 求特征点的空间位置 1. 特征点的空间位置 在 视觉SLAM笔记(31) 特征提取和匹配 已求出特 ...

最新文章

  1. effective java读书笔记5:避免创建不必要的对象
  2. ECMAScript 6中的let和const关键词
  3. android tcp socket框架_最流行的 Web 框架 Gin 源码阅读
  4. WS-Security:使用BinarySecurityToken进行身份验证
  5. 每个 Linux 用户都应该知道的命令行技巧
  6. java多态和泛型_Java面向对象(二) 接口、多态和泛型
  7. java 的io流需要学吗_Java Io流怎么学习呢?
  8. fft谱分析的误差有哪些原因造成的?如何减小分析误差。_频谱分析仪25问
  9. python多重循环的列表_Python 多重列表解析里for的顺序
  10. 关于异常结存的问题,库存结存为什么会产生数量为0,成本不为0的异常情况
  11. OSR推出在线SSL/TLS安全测试工具
  12. UBuntu安装CGI环境
  13. 卷积神经网络的训练过程
  14. android源码编译并刷入nexus 6p手机
  15. 关于《小萝莉的猴神大叔》些许体会
  16. 最简单的FFMPEG的视频编码器
  17. 只是为了好玩:linux之父林纳斯自传.pdf,读后感:《只是为了好玩:Linux之父林纳斯自传》...
  18. 计算机网络如何选择路由器,无线路由器如何选择上网方式_路由器上网方式选哪个?-192路由网...
  19. 计算机软件著作权申请时间线
  20. 分布式爬虫系统设计、实现与实战

热门文章

  1. 我收藏的技术知识图(每张都是大图)
  2. shiro源码分析(四)具体的Realm
  3. .net mysql中文乱码解决办法
  4. 如何禁止IIS缓存静态文件(png,js,html等)
  5. 使用leangoo做多团队敏捷开发项目管理
  6. Leangoo团队敏捷开发实现过程
  7. 干掉 RESTful!GraphQL 真香!
  8. 实战篇:Security+JWT组合拳 | 附源码
  9. 除了负载均衡,Nginx 还可以做很多:限流、缓存、黑白名单等
  10. 为了给你们讲清楚数据库中间件有哪些,我也是拼了!