从零开始一起学习SLAM | 神奇的单应矩阵
小白最近在看文献时总是碰到一个奇怪的词叫“homography matrix”,查看了翻译,一般都称作“单应矩阵”,更迷糊了。正所谓:“每个字都认识,连在一块却不认识”就是小白的内心独白。查了一下书上的推导,总感觉有种“硬凑”的意味,于是又找到了师兄。。。
神奇的单应矩阵
小白:师兄~单应矩阵是什么鬼啊?我看书上的推导,每一步勉强能看懂,但还是不太理解其背后的物理意义,感觉不能转化为自己理解的方式啊
师兄:哦,我第一次看的时候也是这种感觉
小白:而且这个名字好绕口啊,我完全没法和它的物理意义联系起来
师兄:这个名字是直接翻译的,是有点拗口,不过熟悉了也就还好。这个单应矩阵还是挺重要的
小白:师兄,能不能一句话告诉我单应矩阵是干嘛的啊
师兄:嗯,我的理解是:单应矩阵描述的就是同一个平面的点在不同图像之间的映射关系,这里前提是同一个平面,这个前提很重要
小白:还是不太懂啊,为什么要在不同图像之间进行映射呢?这样映射有什么用呢?为什么强调是同一个平面?
师兄:先别急,我一个个来说。我们先来看单应矩阵应用的一个例子。比如现在支付宝,微信都能通过对银行卡拍照自动识别银行卡号码,但是一般我们拍照时银行卡都不一定是正对着相机,可能会比较偏,比如像这样

但是你对着银行卡拍完照之后,你会发现这些软件会自动把银行卡抠出来,并且校正成非常规则的矩形,像下面这样

这样,识别银行卡数字的时候也方便多啦!
小白:我用过这个功能哎,这里面哪一步用到单应矩阵啦?
师兄:单应矩阵能够实现自动把银行卡从背景里“提取”出来,并且变成非常规整的矩形。你想想我前面说的单应矩阵描述的是同一个平面的点在不同图像之间的映射关系
小白:这个银行卡是一个平面,所以满足“同一个平面的点”的要求,那不同图像就是指拍摄的原始图像和校正过的图像咯?
师兄:正解!通过单应矩阵就能完成上述功能,还有其他类似的例子,比如有些手机里的小软件实现拍摄纸质的名片、投影的PPT等自动校正为矩形的功能,完全一样的道理。
小白:原来如此,单应矩阵这么厉害呢!
师兄:这个只是最基础的功能,实际上,单应矩阵还有非常多的应用。比如用于虚拟广告牌,这是很多重大赛事中很常见。比如下面是一个原始的图片。

我们想要把那个屏幕替换为“计算机视觉life”公众号的logo,用单应矩阵很轻松就能实现,你看下面是我们替换的结果,是不是很有趣?

小白:好好玩啊!突然开始喜欢单应矩阵啦!
师兄:除了这些,单应矩阵还有几个很重要的应用,一个是相机标定,比如张正友相机标定法,那个标定板不就是一个平面图案嘛!如下图所示

另外一个是单应矩阵还可以用于图像拼接,如下图所示。

还有现在很火的增强现实(AR),我们用平面二维标记图案(marker)来做AR展示的触发。我们根据单应矩阵就可以知道marker不同视角下的图像,这样可以方便的得到虚拟物体的位置姿态并进行显示,如下图所示。

小白:真是开了眼界了!师兄,我已经迫不及待的要学习单应矩阵了!
快速理解单应矩阵
师兄:哈哈,单应矩阵的计算一般都会提供函数调用,我就简单说说单应矩阵是怎么来的,有哪些需要注意的地方
小白:好,师兄尽量通俗一点啊
师兄:嗯,你看下面这个图,两个不同的相机拍摄同一个平面

你还记得相机成像模型《从零开始一起学习SLAM | 相机成像模型》那一节中我们最后给的公式吗?
小白:记得,就是下面这个式子,其中,Puv(u, v,1)是图像中的像素坐标, Pw(xw, yw, zw,1) 是世界坐标系中的一个点,K是内参矩阵,R是旋转矩阵,t是平移向量,它们一起写成矩阵形式是 T,称为外参矩阵,表示从世界坐标系到相机坐标系的变换。

师兄:很好!现在我们简化一下表达形式,把中间部分记做M矩阵,如下

M矩阵是一个4 x 4 的矩阵,如果空间点在同一个平面上的话,我们可以看做 zw = 0,这样M矩阵就变成了一个 3 x 3的矩阵,对于两个不同的相机,像素坐标和空间点坐标可以写成如下的表示,其中M是3 x 3的矩阵

我们把上面两个式子合并一下就得到了下面这个式子,其中的H就是单应矩阵啦!H矩阵的两边是两张图像对应的匹配点对。也就是说单应矩阵H把三维空间中同一平面的点在两个相机的成像图片坐标进行了映射。

小白:原来如此~书上的推导为什么非要把1用平面方程来代替呢?
师兄:是为了增加空间点都是在平面的约束,本质上也是为了降维,把秩为4的矩阵降维成秩为3
小白:嗯嗯,上面的式子就是两个图像上的匹配的点对的映射吧
师兄:对的,如果展开,你会发现一个式子对应2个方程。也就是两个约束项。而单应矩阵本身自由度为8,所以只需要4个匹配点对就行啦
小白:等等,师兄,为啥单应矩阵H自由度为8?
师兄:这是因为等式两边都是齐次坐标,所以可以进行任意尺度的缩放。因此一般都会对H进行归一化,比如把最后一个元素设置为1,或者使得H矩阵所有元素的二范数为1
小白:明白啦,这样理解容易多了。
师兄:嗯,为了加深你的理解,给你布置一个作业,很有趣的作业哦,就是实现一下前面的虚拟广告牌
小白:好,今天的作业挺有意思~
作业
题目:
利用OpenCV编程实现虚拟广告牌的效果。提供两张图,一张是“计算机视觉life”公众号的logo,另外一张是带广告牌的原图,请用单应矩阵实现将原图中广告牌替换为提供的logo的效果。要求通过鼠标点击来选择要替换的广告牌的四个顶点。参考结果:

师兄提醒:关注“计算机视觉life”微信公众号,菜单栏回复“广告牌”,就能下载代码框架和图片啦!
原文链接:从零开始一起学习SLAM | 神奇的单应矩阵
相关阅读
从零开始一起学习SLAM | 为什么要学SLAM?
从零开始一起学习SLAM | 学习SLAM到底需要学什么?
从零开始一起学习SLAM | SLAM有什么用?
从零开始一起学习SLAM | C++新特性要不要学?
从零开始一起学习SLAM | 为什么要用齐次坐标?
从零开始一起学习SLAM | 三维空间刚体的旋转
从零开始一起学习SLAM | 为啥需要李群与李代数?
从零开始一起学习SLAM | 相机成像模型
从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
零基础小白,如何入门计算机视觉?
---------------------
作者:electech6
来源:CSDN
原文:https://blog.csdn.net/electech6/article/details/84101570
版权声明:本文为博主原创文章,转载请附上博文链接!
从零开始一起学习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 | 用四元数插值来对齐IMU和图像帧
视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...
- 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上的内容没那么难了,公式推导也能推得动了,感觉进步神速,不过最近小白在学习对极几何,貌似又遇到了麻烦... 小白:师兄,对极几何这块你觉 ...
- 从零开始一起学习SLAM | SLAM有什么用?
SLAM是 Simultaneous Localization And Mapping的 英文首字母组合,一般翻译为:同时定位与建图.同时定位与地图构建. 「同时定位与地图构建」这几个词,乍一听起来非 ...
随机推荐
- 通过Rabbitmq从ipone手机传输imu和相机数据到电脑端
https://github.com/tomas789/iOSmsg_client https://github.com/tomas789/iOSmsg 通过xcode工具把iosmsg打包发布到ip ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- HDU 5542 - The Battle of Chibi - [离散化+树状数组优化DP]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5542 Problem DescriptionCao Cao made up a big army an ...
- [No0000178]改善C#程序的建议1:非用ICloneable不可的理由
好吧,我承认,这是一个反标题,实际的情况是:我找不到一个非用ICloneable不可的理由.事实上,接口ICloneable还会带来误解,因为它只有一个Clone方法. 我们都知道,对象的拷贝分为:浅 ...
- log4j.properties 日志文件的详细配置说明
一.在一个web 项目中,使用tomcat 启动通常会在控制台输出出现一个警告信息: 通常为未添加 log4j.properties文件的原因. 二.下面以一个普通的maven项目为例说明一下 1. ...
- oracle执行计划相关
执行计划相关 根据Operation缩进来判断,缩进最多的最先执行:(缩进相同时,最上面的最先执行) 同一级如果某个动作没有子ID就最先执行 同一级的动作执行时遵循最上最右先执行的原则 TABLE A ...
- Oracle 锁的等级
ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive ...
- Linux忘记密码常用的几种解决方法
原文链接:https://www.cnblogs.com/vurtne-lu/p/6550590.html 一. lilo引导1. 在出现 lilo: 提示时键入 linux single Boot: ...
- sublime phpfmt 的格式化
php格式化有几种,这里只说phpfmt.这个插件只支持php7.0+,所以在安装php环境应该支持php7.0.至于低版本,在packagecontrol.io对应的插件页面也又提到. 在subli ...
- 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询
有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...