从零开始一起学习SLAM | 为什么要用齐次坐标?
在涉及到计算机视觉的几何问题中,我们经常看到齐次坐标这个术语。本文介绍一下究竟为什么要用齐次坐标?使用齐次坐标到底有什么好处?
什么是齐次坐标?
简单的说:齐次坐标就是在原有坐标上加上一个维度:


使用齐次坐标有什么优势?
齐次坐标的使用能够大大简化在三维空间中的点线面表达方式和旋转平移等操作,具体分如下几点进行说明。
1、能否非常方便的表达点在直线或平面上
在2D平面上,一条直线 l 可以用方程 ax + by + c = 0 来表示,该直线用向量表示的话一般记做

我们知道点p = (x, y)在直线 l 上的充分必要条件是 ax + by + c = 0
如果使用齐次坐标的话,点p的齐次坐标就是
p’=(x, y, 1)
那么 ax + by + c = 0 就可以用两个向量的内积(点乘)来表示:

因此,点p在直线l上的充分必要条件就是 直线l 与p的齐次坐标p’的内积:

是不是很方便呢!
同理,我们知道 三维空间的一个平面A可以用方程 ax + by + cz + d = 0 来表示,三维空间的一个点P=(x, y, z) 的齐次坐标 P’=(x, y, z, 1),类似的,点P在空间平面A上可以用两个向量的内积来表示,如下:

因此,点P在平面A上的充分必要条件就是平面A 向量与P的齐次坐标P’的内积(点乘):

2、方便表达直线与直线,平面与平面的交点
先给出结论,后面再具体解释:
结论:在齐次坐标下,可以用两个点 p, q 的齐次坐标叉乘结果来表达一条直线 l,也就是
l = p x q
也可以使用两条直线 l, m 的叉乘表示他们的交点 x
x = l x m
见下面示例图。

之所以可以这么简洁的表示交点是因为采用了齐次坐标的表示方式。
那么这是为什么呢?
先介绍一下叉乘(也称叉积、外积)的概念:
两个向量 a和b 的叉乘仅在三维空间中有定义,写作 a x b
a x b 是与向量 a, b都垂直的向量,其方向通过右手定则(见下图)决定。

其模长等于以两个向量为边的平行四边形的面积(见下图)。
叉乘可以定义为:

其中 θ表示a, b的夹角(0°到180°之间),||a||, ||b||是向量a, b的模长
n则是一个与向量a, b所构成的平面垂直的单位向量

根据叉乘定义:
向量自身叉乘结果为0,因为夹角为0。也就是说三维向量 a x a =0, b x b = 0而点乘(也称点积,内积)的定义是
a * b = ||a||* ||b|| *cos(θ)
根据定义:如果两个向量垂直,cos(θ) = 0,点积也为0。
好了,经过上面点乘和叉乘定义的铺垫。下面来推导一下上面的结论:
为什么两条直线 l, m 的叉乘 l x m 等于它们的交点 p,也就是 p = l x m?
原因如下:首先,根据前面叉乘的定义,l x m 的结果向量(记为 p = l x m) 与 l 和 m都垂直,根据点乘的定义,垂直的向量之间的点积为0,因此可以得到:

因此,根据前面点在直线上的结论,可以看到p既在直线l 上又在直线m上,所以 p = l x m 是两条直线的交点。此处 p 是齐次坐标。
同样的,可以证明,两点p, q 的叉乘 可以表示 过两点的直线l,即 l = p x q。(留做作业)
3、能够区分一个向量和一个点
先给出结论:
(1)从普通坐标转换成齐次坐标时
如果(x,y,z)是个点,则变为(x,y,z,1);
如果(x,y,z)是个向量,则变为(x,y,z,0)
(2)从齐次坐标转换成普通坐标时
如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)
具体解释见:
http://www.cnblogs.com/csyisong/archive/2008/12/09/1351372.html
4、能够表达无穷远
比如 两条平行的直线 ax+by+c=0, ax+by+d=0,
可以分别用向量 l = (a, b, c), m = (a, b,d)表示
根据前面直线交点的计算方法,其交点为 l x m
根据叉乘计算法则
向量

的叉乘结果可以用如下方法计算得到

最终:l x m = (d-c)(b,-a,0),忽略标量(d-c),我们得到交点为(b,-a,0),并且是齐次坐标,如果要转化为非齐次坐标,那么会得到 (b/0, a/0),坐标是无穷大,可以认为该点为无穷远点,这与我们通常理解的:平行线相交于无穷远的概念相吻合。
因此,如果一个点的齐次坐标中,最后一个元素为0,则表示为无穷远点。
5、更简洁的表达欧氏空间变换
这是齐次坐标最重要的一个优势之一。在以后的学习中你会更加深刻的理解。
使用齐次坐标,可以方便的将加法转化为乘法,方便的表达平移。
比如我们要完成将2D坐标点x=[u,v]’ 平移t=[tu, tv],如果用非齐次方法的话,是用如下的加法

如果用齐次坐标表示时可以将加法转换为乘法

在欧氏变换中一般有两种操作:旋转和平移。
如果我们想要将向量a进行一个标准的欧氏变换,一般是先用旋转矩阵R进行旋转,然后再用向量t进行平移,其结果a’ = R*a + t,这样看起来没什么问题。
但是,我们知道SLAM中一般都是连续的欧氏变换,所以会有多次连续的旋转和平移,假设我们将向量a进行了两次欧氏变换,分别为R1, t1 和 R2,t2,分别得到:
b = R1a + t1, c = R2b + t2
最终的结果 c = R2*(R1*a + t1) + t2
显然,这样的变换在经过多次后会变的越来越复杂。其根本原因是上述表达方式并不是一个线性的变换关系。
此时,齐次坐标就显示出它的魅力了,如果使用齐次坐标来表达 a’ = R*a + t 的话可以写为:

旋转和平移可以用一个矩阵T来表示,该矩阵T称为变换矩阵(transform matrix),这样欧氏变换就变成了线性关系,进行多次欧氏变换只需要连乘变换矩阵就行了,比如前面的两次欧氏变换使用齐次坐标就可以表示为:

其中,波浪号代表齐次坐标。一般的,在SLAM中,b = Ta 的形式默认都是齐次坐标。
关于齐次坐标的优势还有哪些呢?欢迎留言补充。
作业
证明:两点p, q 的叉乘 可以表示 过两点的直线l,即 l = p x q(提示:参考本文前面的证明)
欢迎留言讨论,更多学习视频、文档资料、参考答案等进入公众号“计算机视觉life”,菜单栏点“知识星球”,「从零开始学习SLAM」和其他学习SLAM学的伙伴一起学习交流~
原文链接:从零开始一起学习SLAM | 为什么要用齐次坐标?
相关阅读
---------------------
作者:electech6
来源:CSDN
原文:https://blog.csdn.net/electech6/article/details/83315237
版权声明:本文为博主原创文章,转载请附上博文链接!
从零开始一起学习SLAM | 为什么要用齐次坐标?的更多相关文章
- 从零开始一起学习SLAM | 掌握g2o边的代码套路
点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...
- 从零开始一起学习SLAM | 掌握g2o顶点编程套路
点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...
- 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码
首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...
- 从零开始一起学习SLAM | 点云平滑法线估计
点击公众号"计算机视觉life"关注,置顶星标更快接收消息! 本文编程练习框架及数据获取方法见文末获取方式 菜单栏点击"知识星球"查看「从零开始学习SLAM」一 ...
- 从零开始一起学习SLAM | 给点云加个滤网
对VSLAM和三维重建感兴趣的在计算机视觉life"公众号菜单栏回复"三维视觉"进交流群. 小白:师兄,上次你讲了点云拼接后,我回去费了不少时间研究,终于得到了和你给的参 ...
- 从零开始一起学习SLAM | 你好,点云
本文提纲 先热热身点云是啥你知道点云优缺点吗?点云库PCL:开发者的福音PCL安装指北炒鸡简单的PCL实践留个作业再走先热热身 小白:hi,师兄,好久不见师兄:师妹好,上周单应矩阵作业做了吗?小白:嗯 ...
- 从零开始一起学习SLAM | 神奇的单应矩阵
小白最近在看文献时总是碰到一个奇怪的词叫“homography matrix”,查看了翻译,一般都称作“单应矩阵”,更迷糊了.正所谓:“每个字都认识,连在一块却不认识”就是小白的内心独白.查了一下书上 ...
- 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上的内容没那么难了,公式推导也能推得动了,感觉进步神速,不过最近小白在学习对极几何,貌似又遇到了麻烦... 小白:师兄,对极几何这块你觉 ...
- 从零开始一起学习SLAM | 相机成像模型
上一篇文章<从零开始一起学习SLAM | 为啥需要李群与李代数?>以小白和师兄的对话展开,受到了很多读者的好评.本文继续采用对话的方式来学习一下相机成像模型,这个是SLAM中极其重要的内容 ...
随机推荐
- mysql索引及sql执行顺序
1, 红黑树 同一层级的黑树到根结点经历的黑树数目一样 最坏情况的时间复杂度 lg n 是二叉树b树 结点可以有多个孩子 b+树 父节点不存储数据聚集索引)的叶子节点会存储数据行,也就是说数据和索引是 ...
- find实现特殊功能示例
find列出目录下所有文件: # find /shell-script/ # find /shell-script/ -print find列出文件夹中所有开头为text的文件,参数-iname意思忽 ...
- iOS循环引用常见场景和解决办法
好多场景会导致循环引用,例如使用Block.线程.委托.通知.观察者都可能会导致循环引用. 1.委托 遵守一个规则,委托方持有代理方的强引用,代理方持有委托方的弱引用. 实际场景中,委托方会是一个控制 ...
- day14: 生成器进阶
1,复习,迭代器:双下方法很少直接调用,一般都是通过其他语法触发的:迭代器一定可迭代,可迭代的通过调用iter()方法皆可以得到一个迭代器. 迭代器很方便使用,所有的数据只可以取一次,节省内存空间.生 ...
- pgadmin4 python
安装安装包 # sudo apt-get install build-essential libssl-dev libffi-dev libgmp3-dev virtualenv python-pip ...
- [tcpreplay] tcpreplay高级用法--使用tcpreplay-edit进行循环动态发包
tcpreplay-edit提供了可对包进行修改的高级用法: --unique-ip Modify IP addresses each loop iteration to generate uniqu ...
- AndroidStudio_TextView
写APP的工具为:AndroidStudio 主要在两种文件里编辑代码:.xml和.java(.xml里主要是调整布局相当于APP的前端 .java主要是写Java程序相当于APP的后端) 代码的调试 ...
- Struts2中.properties文件放置路径(classpath)
一.web应用的classpath简介 classpath路径,即WEB-INF下面的classes目录,所有src目录下面的java.xml.properties等文件编译后都会在此. Stru ...
- python 反爬虫策略
1.限制IP地址单位时间的访问次数 : 分析:没有哪个常人一秒钟内能访问相同网站5次,除非是程序访问,而有这种喜好的,就剩下搜索引擎爬虫和讨厌的采集器了. 弊端:一刀切,这同样会阻止搜索引擎对网站的收 ...
- Android SDK下载和更新失败的如何解决
一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...