小白最近在看文献时总是碰到一个奇怪的词叫“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 | 神奇的单应矩阵的更多相关文章

  1. 从零开始一起学习SLAM | 掌握g2o边的代码套路

    点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>,以及顶点<从零开始 ...

  2. 从零开始一起学习SLAM | 掌握g2o顶点编程套路

    点"计算机视觉life"关注,置顶更快接收消息! ## 小白:师兄,上一次将的g2o框架<从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码>真的很清晰 ...

  3. 从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码

    首发于公众号:计算机视觉life 旗下知识星球「从零开始学习SLAM」 这可能是最清晰讲解g2o代码框架的文章 理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种 ...

  4. 从零开始一起学习SLAM | 点云平滑法线估计

    点击公众号"计算机视觉life"关注,置顶星标更快接收消息! 本文编程练习框架及数据获取方法见文末获取方式 菜单栏点击"知识星球"查看「从零开始学习SLAM」一 ...

  5. 从零开始一起学习SLAM | 给点云加个滤网

    对VSLAM和三维重建感兴趣的在计算机视觉life"公众号菜单栏回复"三维视觉"进交流群. 小白:师兄,上次你讲了点云拼接后,我回去费了不少时间研究,终于得到了和你给的参 ...

  6. 从零开始一起学习SLAM | 你好,点云

    本文提纲 先热热身点云是啥你知道点云优缺点吗?点云库PCL:开发者的福音PCL安装指北炒鸡简单的PCL实践留个作业再走先热热身 小白:hi,师兄,好久不见师兄:师妹好,上周单应矩阵作业做了吗?小白:嗯 ...

  7. 从零开始一起学习SLAM | 用四元数插值来对齐IMU和图像帧

    视觉 Vs. IMU 小白:师兄,好久没见到你了啊,我最近在看IMU(Inertial Measurement Unit,惯性导航单元)相关的东西,正好有问题求助啊 师兄:又遇到啥问题啦? 小白:是这 ...

  8. 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?

    自从小白向师兄学习了李群李代数和相机成像模型的基本原理后,感觉书上的内容没那么难了,公式推导也能推得动了,感觉进步神速,不过最近小白在学习对极几何,貌似又遇到了麻烦... 小白:师兄,对极几何这块你觉 ...

  9. 从零开始一起学习SLAM | SLAM有什么用?

    SLAM是 Simultaneous Localization And Mapping的 英文首字母组合,一般翻译为:同时定位与建图.同时定位与地图构建. 「同时定位与地图构建」这几个词,乍一听起来非 ...

随机推荐

  1. [No0000171]wpf 类层次结构Class Hierarchy

    1.DispatcherObject类表示具有相关联的对象分派器.调度程序处理要在特定线程上执行工作的请求队列.它能够在其关联的线程上调用方法. DispatcherObject是对象的基类,用于跟踪 ...

  2. [No0000145]深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing)理解堆与栈2/4

    前言   虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程 ...

  3. [No000013E]用VSCode写python的正确姿势

    最近在学习python,之前一直用notepad++作为编辑器,偶然发现了VScode便被它的颜值吸引.用过之后发现它启动快速,插件丰富,下载安装后几乎不用怎么配置就可以直接使用,而且还支持markd ...

  4. 线性素数筛 ACM-ICPC 2018 南京赛区网络预赛 J Sum

    https://www.jisuanke.com/contest/1555?view=challenges 题意: 题解:写完都没发现是个积性函数233 想法就是对x分解质因数,f(x)就是2^k,其 ...

  5. shell脚本之通过发送带\n字符串或expect脚本实现交互输入自动化

    编写shell脚本难免遇到需要交互式输入指令的步骤: 方法一: # cat action.sh #!/bin/sh read -p "enter number:" no; read ...

  6. struts2 中 paramsPrepareParamsStack 拦截器

    struts2二次参数拦截器内容: 规定了请求的执行顺序 在struts2中,其拦截器为框架精华部分,而二次参数拦截器paramsPrepareParamsStack  对于解决数据回显,对象修改属性 ...

  7. Linux之sed、awk

    Linux 之AWK 命令 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行的读入,以空格默认分隔 ...

  8. Coding 小技巧

    </pre>//格式化字符串的传递<p></p><p>#define  FSKILL_LOG(format ,...)   DREAMLAND_RUNI ...

  9. 查找->动态查找表->二叉排序树

    文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST.它是这样一棵树:或者是一棵空树:或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结 ...

  10. win10 安装多个版本的jdk,如何切换

    JAVA_HOME C:\software\jdk1.7.0_79 CLASSPATH  .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\dt.jar ...