Homography 知多少?

该博客内容发表在泡泡机器人公众号上,请尊重泡泡机器人公众号的版权声明

在ORB-SLAM初始化的时候,作者提到,如果场景是平面,或者近似平面,或者低视差时,我们能应用单应性矩阵(homography),这三种情形在我应用SVO的过程中颇有同感,打破了我对H矩阵的固有映像,即只能用于平面或近似平面。但是我不知道如何去具体分析这里面的误差,比如不共面的情况时,应用H矩阵将一个图像坐标从图像1投影到图像2时,它会落在图像哪个位置?和实际位置的误差该怎么计算?误差会有多大?和哪些因素有关?另外,为何相机只做纯旋转运动时,不管平面还是非平面,H矩阵都能应用?等等,一些列问题,让我感觉对homography了解很粗浅。

先简单回顾我脑海里的H矩阵,原谅我的啰嗦,我习惯开头一大段大白话给大家热身,进入正文以后就会尽量言简意赅。在没做视觉SLAM以前,通过opencv大概知道利用两个图像中至少四个特征点能够求解一个单应性矩阵(homography matrix),然后用这个单应性矩阵H能够将图像1中的某个坐标(u,v)变换到图像2中对应的位置(u′,v′)。然而,那时忽略了两个图像能够计算H的前提条件。在学SLAM过程中,知道H矩阵的推导是来自于相机在不同位姿拍摄同一个三维平面,所以使用opencv计算单应性矩阵H的时候前提是两个图像对应区域必须是同一平面。

最近,刘浩敏师兄的RKSLAM里面用了多H矩阵来提高鲁棒性,以及加上开头的那些疑问让我有迫切进一步学习H矩阵的想法。本文将包括三部分:H的由来,H矩阵的扩展:相机的纯旋转和非共面情形,由H矩阵到6点法估计本征矩阵E。

H矩阵的由来

假设相机在两个不同位姿处拍摄一个平面,该平面在frame 1中的法向量为N,到frame 1原点距离为d,具体如下图所示

于是,坐标系1中的点可以用下式转换到坐标系2中:

X2=RX1+T

注意,大写粗体X表示的是三维空间点。同时,由于三维点X1所在平面上,由简单的直角三角形,可知该点沿着法线方向的投影距离应等于d:

NTX1=n1X+n2Y+n3Z=d

或者

1dNTX1=1?X1∈P

结合起来我们能够得到:

X2=RX1+T1dNTX1=HX1

所以我们就得到了平面单应性矩阵

H=R+T1dNT,H∈R3×3

回忆之前提到过本征矩阵xT2Ex1=xT2T^Rx1=0,它只是把点对应到一条极线,而单应性矩阵约束更强,是点到点的一一对应

注意,本征矩阵约束公式是对于归一化图像平面坐标x=(x,y,1)T而言的,而上述推导的H是对三维空间点的。从3d到2d, 只需要将3d点向归一化图像平面z=1上投影。三维空间点到归一化图像平面只是对坐标缩放了z,有:

λ1x1=X1,λ2x2=X2→λ2x2=Hλ1x1

从这里我们可以发现,从归一化图像平面坐标x2到Hx1之间还存在一个尺度因子,因此我们利用两个图像对应的坐标对能恢复H,但从该H中无法将平移T和d分离出来,就导致了尺度的不确定性。而利用H,我们能得到x2~Hx1,注意虽然这里是用的相似符号,但是我们还是能得到图像坐标的一一对应,计算出x=Hx1以后,将x的坐标都除以xz进行坐标归一化,就能得到x2。

H矩阵的扩展:相机的纯旋转和非共面情形

先看纯旋转情形,三维坐标关系如下:

X2=RX1

对应的有

H=R+T1dNT,T=0

我们可以发现无论三维点是否在一个平面上,H矩阵都能完美的符合他们之前的转换关系。同时,平移向量为0,可以等价于所有点位于无穷远平面上,即d←∞。从另一个角度来看,如果位移为0,也无法计算d,d为任意值都能满足上面点的转换关系。所以,大家在做全景拼接的时候,要尽量只用纯旋转哦!当然,如果相机全景拼接算法好,就当我没说。

好了,让我们回到另一个问题,即非共面情形,又不是纯旋转,那我们使用一个H矩阵来进行坐标点的转换误差会咋样?

假设我们有一些非共面点,通过RANSAC算法估计了一个满足大多数点对应关系的H矩阵,那么对于不在三维平面上的p′用矩阵H转换以后,H会强迫它落到三维平面上,然后投影到另一个图像归一化平面,示意图如下:

也就是说p′实际应该对应x′2,由于使用了错误的模型H,它会落到x2。x2的横纵坐标通过H矩阵能够算出,x′2坐标通过将p′进行旋转矩阵R和平移T,再投影以后也能算出。因此两个坐标相减就能得到误差模型。不需要精确的数学计算,单单从上面的图,我们就能直观的感受到当相机的平移向量相对于场景深度而言足够小时,x′2和x2之间的误差是可被接受的,即这种情况下依然可以使用H矩阵来算坐标的一一对应,这应该就是orbslam中提到的低视差情形。

一个重要的启示是:H矩阵的这种直接计算图像坐标一一对应关系的性质给解决SLAM中像素点的匹配又提供了一条思路,如果一个H矩阵不行,那一幅图片就用多个H矩阵,这正是浩敏师兄那篇ISMAR 2016论文的重要框架基础。而通过本征矩阵E只能计算极线,还需要沿着极线匹配。

由H矩阵到本征矩阵E的一点遐想

既然说到了极线,顺着上面的思路,干脆探一探本征矩阵E。其实,上面图中,大家伙都看到x′2和x2是位于极线上的,他们坐标都知道,就能得到极线方程,如果还有另外一个点再确定一条极线,如下图所示

那么外极点e2就能确定,极点确定了,H也知道,那么其他任意点的极线就能画出来了,不用本征矩阵我们也可以构造极线几何。这就是所谓的“六点法”,四个共面点确定H,两个非共面点确定极点。

另外,还可以解释为什么8点法计算求解本征矩阵不能应用于共面的情形。我们知道一个向量和自己叉乘结果等于0,所以有

x^2x2=0→x^2Hx1=0

另外,任意三维向量u和x2的叉乘肯定垂直于向量x2,所以有:

u^x2⊥Hx1?(u^x2)THx1=0??xT2u^Hx1=0?xT2u^Hx1=0

所以我们能得到E=u^H,这说明E在这种情况下有无穷多解都能满足xT2Ex1=0,这个时候还用8点法,肯定是不行了。

总结

总算写完了,推荐大家去读Yi Ma的书《An Invitation to 3D vision》上面几乎都来自于这本书,同时之前也提到过TUM的Prof.Cremers上课就是用的这本书。除此之外,再推荐个基于该书的课程。视觉几何真心水深,没有理论积累,没有前人指点,坑是填不完的,祝好(对大家,也是对自己)。

(转载请注明作者和出处:http://blog.csdn.net/heyijia0327 未经允许请勿用于商业用途)

【版权声明】泡泡机器人SLAM的所有文章全部由泡泡机器人的成员花费大量心血制作而成的原创内容,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能否进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!

【注】商业转载请联系刘富强([email protected])进行授权。普通个人转载,请保留版权声明,并且在文章下方放上“泡泡机器人SLAM”微信公众账号的二维码即可。

ref:已在总结中指出,不再列举。

时间: 2024-11-05 17:25:39

Homography 知多少?的相关文章

SLAM入门之视觉里程计(5):单应矩阵

在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时只是知道通过单应矩阵,能够将图像1中的像素坐标\((u_1,v_1)\)变换到图像2中对应的位置上\((u_2,v_2)\),而没有深究其中的变换关系. 单应(Homography)是射影几何中的概念,又称为射影变换.它把一个射影平面上的点(三维齐次矢量)映射到另一个射影平面上,并且把直线映射为直线

OpenCV使用二维特征点(Features2D)和单映射(Homography)寻找已知物体

使用二维特征点(Features2D)和单映射(Homography)寻找已知物体 目标 在本教程中我们将涉及以下内容: 使用函数 findHomography 寻找匹配上的关键点的变换. 使用函数 perspectiveTransform 来映射点. 理论 代码 这个教程的源代码如下所示.你还可以从 以下链接下载到源代码 #include <stdio.h> #include <iostream> #include "opencv2/core/core.hpp"

OpenCV Tutorials &mdash;&mdash; Features2D + Homography to find a known object

通过特征检测和单应性匹配来发掘已知物体 ~~ Use the function findHomography to find the transform between matched keypoints. Use the function perspectiveTransform to map the points.   检测 + 描述 + 匹配 ~ ~ 得到匹配的keypoints 之后可计算出形变矩阵 findHomography Finds a perspective transform

知乎上线“明日头条”,亮剑直指今日头条?

4月1日凌晨,知乎悄然上线了"资讯类内容",并对外宣称发布了"明日头条",意图向移动资讯开始发起进攻.来自知乎内部员工发布的<知乎重磅发布[明日头条],直接促使领结婚证免费>愚人文章中煞有介事地称:"知乎现在正式重磅发布新功能--明日头条,这个划时代新功能将颠覆性地为知乎用户带来全新的内容体验,通过高质量内容的聚合,知乎希望,给世界增加一点颜值." 知乎在这个时候突然推出的"明日头条",着实让人有些惊讶,难道知乎真

腾讯优图及知脸(ZKface)人脸比对接口测试(python)

一.腾讯优图 1.开发者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照开发者页面的接入流程接入之后,创建应用即可获得所需的AppID.SecretID和SecretKey这是进行接口调用必须的凭证 3.测试流程: 3.1.测试可以直接调用网络接口,或者下载相应语言的sdk(http://open.youtu.qq.com/welcome/developer#/tool-sdk),我采用的是下载python版本的sdk(该sdk对应的

肯.威尔伯论觉知

https://tieba.baidu.com/p/4584305679?red_tag=3109625582 1.纯粹的觉知是持续不断的平等的威尔伯重拾消失长达五年之久的写作灵感,他过着离群索居的生活,除了购买日用品之外,几乎完全与世隔绝,三年中只见了四个人,他形容那种情况很像传统的禁语闭关.当时他正埋首于<性.生态学.灵性>这本巨著的撰写工作,他形容其过程就像是一场永无止境的噩梦,为了涵盖四大象限各个领域的知识系统,他需要搜集的资料可想而知有多么博杂了.闭关到第七个月,他患了自称的“渴肤症

仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同

       我们在看知乎的时候,你会发现,首页,发现,关注,收藏,草稿这五项,你在点击之后进入到相应页面之后,侧滑菜单还在,你左侧滑一下,这个侧滑菜单还在,而提问,左滑屏幕,这个页面就没有,有点像返回上一页的感觉. 从操作来看,五页面应该是fragment之间的切换,而提问是单独的activity.     我们先从几个fragment入手,这里我们建立五fragment页,选择继承自android.support.v4.app.Fragment,因为这五个页面基本上都一样,就是简单的一个布局

知问前端——创建header区

创建界面 我们首先要设计一个header,这个区域将要设计成永远置顶.也就是,往下拉出滚动条也永远在页面最上层可视区内.在header区,目前先设计LOGO.搜索框.按钮.注册和登录即可. 项目的大致骨架如下: index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>知问前端</title> <script type=&q

为知发表博客

标题1 标题2 这是在为知笔记中进行的引用 //这是语句块 //hello Word测试程序 void main { printf("hello World"); } 无序列表 列表内容2 添加截图内容名 ? 符号原来是这样插入的啊 来自为知笔记(Wiz)