从零开始开始一起学SLAM(9)神奇的单应矩阵

小白最近在看文献时总是碰到一个奇怪的词叫“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(Simultaneous Localization and Mapping)是一个相对复杂的过程,但是你可以按照以下步骤开始习: 1. 习基础知识:首先,你需要了解机器人感知、运动控制和地图构建的基本概念。熟悉概率和统计的基本概念也是非常有帮助的,因为SLAM中经常使用到这些方法。 2. 习传感器:了解常用的传感器,如激光雷达、摄像头和惯性测量单元(IMU),以及它们的工作原理、数据处理方法和误差模型。 3. SLAM算法:掌握常见的SLAM算法,如扩展卡尔曼滤波(EKF)、粒子滤波(PF)和图优化。理解这些算法的原理和实现方式是非常重要的。 4. 编程实践:选择一种编程语言(如C++或Python)并开始实践编写SLAM算法的代码。使用开源库,如ROS(Robot Operating System)或PCL(Point Cloud Library)可以速你的习过程。 5. 实验和调试:通过实验和调试来验证你的SLAM算法。使用模拟器或真实的机器人进行实验,分析结果并调整算法参数以优化性能。 6. 阅读论文和参考资料:定期阅读与SLAM相关的最新研究论文和参考资料,了解最新的算法和技术发展。 7. 实际项目:最终,尝试应用你所的知识到实际项目中。参与开源项目或者参机器人比赛等活动,将帮助你更深入地理解和实践SLAM技术。 需要注意的是,SLAM一个广泛而复杂的领域,需要持续习和实践才能真正掌握。所以,耐心和持之以恒的习态度是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值