什么是单应矩阵和本质矩阵

知乎上面的大牛还是很多,直接搜Homography或者单应矩阵就能得到很多大神的回答,可能回答中的一句话或者一个链接就够自己学习很久。

其实在之前研究双目视觉的时候就接触了对极几何,通过视觉就可以得到物体的远近信息,这也是特斯拉等自动驾驶甚至可以完全使用摄像头而不使用雷达的原因。

通过下面这幅图说明一下匹配点必须在极线上。在单镜头下,同一个径向的物体P、Q的成像是重合的,所以我们无法判断物体的前后远近关系,在双目视觉中,利用两个镜头对同一场景进行捕捉,相当于换了一个视角观察,或者说引入了镜头相对位置这个先验信息,从而可以利用两个镜头分别捕捉的图像进行信息融合。这时问题的关键就是在两幅图像之间找到对应点。我们当然可以使用SIFT等特征点描述子进行匹配,但是,对极几何利用极平面的特殊性质将对应点约束在另外一幅图像的极线上,将搜索范围从2D减少到1D。

本质矩阵

刚才提到我们引入了镜头相对位置的先验信息,两个镜头对于彼此的位置是已知的(通过极点),那么这种相对位置在数学上是怎么表示的呢?其实这就是基础矩阵。最基本的空间变换是平移和旋转,本质矩阵Essential Matrix就包含了旋转R和平移T,因为只是镜头相对位置,所以不包含相机焦距等内参。本质矩阵的推导主要利用的是三个红色的向量在极平面内共面,即三个向量混合积(点乘和叉乘)为0,使用的坐标系是相机坐标系。

叉乘(向量的外积),结果还是一个向量,新的向量c垂直于向量a和b,按照右手螺旋法则,长度是a和b张开的平行四边形的面积。相机坐标系是以相机的镜头(光心)为原点,z轴为镜头的径向,和成像平面垂直。

将圆括号中的叉乘改写成矩阵形式,最后可以得到

本质矩阵的求解和其中旋转和平移矩阵的求解。矩阵是3x3大小的,需要8个点来求解。

基础矩阵

刚才的本质矩阵是在对应点在相机坐标系下的对应关系,而我们更关心的是成像,即对应点在图像物理坐标系(也叫平面坐标系)下的对应关系。图像物理坐标系大致和相机坐标系一样,但是原点移到了成像面上,为光轴与成像平面的交点。

相机坐标系到图像物理坐标系之间的转换:

{p_l} = \frac{​{​{f_l}}}{​{​{Z_l}}}{P_l},{p_r} = \frac{​{​{f_r}}}{​{​{Z_r}}}{P_r}

图像物理坐标系和我们日常在计算机进行数字图像处理所使用的坐标系依然不一样,前者是以m为单位的,表示的是成像时距离原点的绝对长度,而我们通常使用的是像素坐标系。像素坐标系以像素为单位,如图像大小为255x255,表示这个图像长宽都是255个像素。像素坐标系的原点选在图像左上角,x轴为水平向右。OpenCV、OpenGL等库的坐标系即和图像坐标系一致。当然明显看出CCD传感器以mm单位到像素中间有转换的。举个例子,CCD传感上上面的8mm x 6mm,转换到像素大小是640x480. 假如dx表示像素坐标系中每个像素的物理大小就是1/80. 也就是说毫米与像素点的之间关系是piexl/mm.

OpenCV中函数findFundamentalMat可以找到基础矩阵Fundamental matrix。

单应性矩阵Homography matrix

之前的对极几何中两个视图中点的对应关系是点对应直线(极线),而单应矩阵是点对应另外一幅视图中的点,约束力更强。

H矩阵的推导,来自相机在不同位姿拍摄同一个三维平面。之所以H矩阵约束力更强,是它不仅仅引入了两个镜头之间的旋转和平移变换,还包含了景深信息d。

通过相机位置坐标在法向量方向的投影(乘转置)表示景深距离d。

两个相机之间的位置包含了平移和旋转,他们之间的关系可以用等式来表示:

{X_2} = R{X_1} + T

如果研究的对象是相机像素坐标,应该有内参矩阵K的参与,对应的单应矩阵为:

H=K(R+T\frac{1}{d}N^T)K^{-1}

注意这里的单应矩阵中包含了三大信息,旋转矩阵R,平移矩阵T,景深信息d。R和T描述两个相机之间的关系,所以是唯一确定的,而d是两个相机所捕获的平面上点到其中一个相机的距离,为了用单应矩阵描述两幅视图中像素点的对应关系,这个d应该保持一致,即相机所捕获的场景应该是平面,且是垂直于相机1法向量的平面。

特别的,在纯旋转情况下,两个相机之间没有平移关系T,即

{X_2} = R{X_1}

这样单应矩阵H就退化为H=R,H中不再包含d,所以就可以摆脱拍摄景物必须在同一平面的限制。而我们通常无法获得景深信息d,所以这也让我们不必再求解d。换一种思路,即便相机之间存在平移,但是当景物在无穷远处时,d可以认为无穷大,也可以将H中的第二项舍去,此时的H叫做Infinite Homography。这给我们的启发或者说解释就是,在使用相机拍摄全景图时,最好保证相机只在原地旋转,没有平移运动,或者拍摄的景物是远景,可以看作d是无穷大。

那么,当实在无法满足上述条件,即有平移,且无法保证共面,这种情况下不同的点的参数d不一样,但是单应矩阵只能选择一个d,肯定会出现误差。当相机的平移向量相对于场景深度而言足够小时,可以使用RANSAC找到一个满足大部分点的矩阵,误差是可以接受的,这应该就是orbslam中提到的低视差情形。

单应矩阵的本质

单应矩阵的本质是利用了平面信息(平面法向量n和相机到平面的距离d),建立起像素坐标到相机系坐标的关系。推导过程如下:

像素系齐次坐标q=\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}=\frac{1}{z}\cdot Kp=\frac{1}{z}\begin{pmatrix} f_x &0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{bmatrix} x\\ y\\ z \end{bmatrix}

原理上可由齐次坐标得到相机坐标系下的坐标:p=z \cdot K^{-1}q,K是相机内参,K一般是已知的,现在问题是深度z未知。而如果我们除了知道p的点坐标,还知道它所在平面的信息,就可以求出z。

p所在平面的法向量是n,p所在平面到相机的距离d,那么n^T \cdot p +d=0,将p=z \cdot K^{-1}q代入,得到z=-\frac{d}{n^TK^{-1}q}

最后,参考链接还总结了单应矩阵和对极几何的关系。所谓的“六点法”,四个共面点确定H,两个非共面点确定极点。极点确定了,H也知道,那么其他任意点的极线就能画出来了,不用本征矩阵我们也可以构造极线几何。

而在计算本质矩阵中,又必须满足8点不能共面。这是因为共面的话求解E会有无穷多个解满足方程,所以8点法求解不能适用于共面的情况。

这篇博客连同上一篇研究了图像变换和单应矩阵、本质矩阵。其实在学习线性代数和矩阵论时就应该认识到,矩阵不仅能表示状态,还可以表示运动。真实世界中的物体在不同的成像条件下(特指相机的位置不同,两个相机之间存在旋转和平移),会得到不同的图像,这些图像之间可以认为存在仿射变换或者透视变换,如果用矩阵来描述就可以使用单应矩阵或者本质矩阵。其实单应矩阵适用于相机发生了旋转的平面场景(或者近似平面场景),应用的限制性和对点的限制性(点到点)都更强;本质矩阵和基础矩阵适用范围更广,它们都包含了相机之间的旋转和平移信息,其中基础矩阵更常用,因为它具体描述的是两个相机得到的图像的像素级之间的关系,而本质矩阵只描述了两个相机之间的关系,换一句话说,基础矩阵相比于本质矩阵,不仅包含两个相机之间的旋转平移信息,还包含了相机内参。相机内参就包括了镜头焦距、像素大小等信息,这就涉及到相机标定,可以通过一个仿射矩阵表示。不过在理论上通过四对匹配点对就可以计算得到,而OpenCV的一个函数就可以实现。

Reference:

1.知多少https://blog.csdn.net/heyijia0327/article/details/53782094

2.坐标系https://blog.csdn.net/lyl771857509/article/details/79633412

3.庖丁解牛侯凯https://www.cnblogs.com/houkai/p/6661607.html

4.葵花宝典https://link.zhihu.com/?target=http%3A//www.robots.ox.ac.uk/%7Evgg/hzbook/

5.一分钟:https://blog.csdn.net/Yong_Qi2015/article/details/82858582

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tensorflow实现反卷积

先看ogrid用法 from numpy import ogrid,repeat,newaxis from skimage import io import numpy as np size3 x,yogrid[:size,:size]#第一部分产生多行一列 第二部分产生一行多列 print(x) print(y) 打印结果: newaxis用法: """ newaxis…

寿命能推算吗?加州大学科学家提出“预测方法”

来源:中国科学报从古至今,从国内到国外,从炼丹术到现代科学,长生不老似乎一直是人类乐此不疲的追求。但若要延缓衰老,首先要弄清是什么造成了衰老。近日,加州大学洛杉矶分校(UCLA)生…

Deep Image Homography Estimation

在知乎问题:深度学习应用在哪些领域让你觉得「我去,这也能行!」?中遇到一篇提交在arXiv 2016(arXiv不是正式发表,只是可以证明原创性,提供时间戳的网站)的文章《Deep Image Homograp…

tensorflow:双线性插值反卷积

首先生成333的黑色图片 """ 生成333黑色图像 """ def produce_image():size 3x, y ogrid[:size, :size] # 第一部分产生多行一列 第二部分产生一行多列z x yz z[:, :, newaxis] # 增加第三维# print(z)img repeat(z, 3, 2)/12 # 在第三…

腾讯医疗AI新突破:提出器官神经网络,全自动辅助头颈放疗规划 | 论文

来源:量子位腾讯医疗AI实验室又有新研究。这次跟美国加州大学合作,在国际权威期刊《Medical Physics》发表最新研究成果:《器官神经网络:深度学习用于快速和全自动整体头颈危及器官靶区勾画》AnatomyNet: Deep Learning for Fast …

视频制作中的绿幕与拜耳阵列

先来欣赏一些大片背后的特效。 现在国内的电影市场越来越大,做短视频的自媒体也越来越多,在他们的后期视频制作的片花中可以看到很多都在使用绿幕或者蓝幕,这是为什么呢? 首先肯定是为了抠图的方便。将主体部分抠出再将通过特效…

吴恩达作业8:三层神经网络实现手势数字的识别(基于tensorflow)

数据集的载入,随机产生mini-batch放在tf_utils.py,代码如下 import h5py import numpy as np import tensorflow as tf import mathdef load_dataset():train_dataset h5py.File(datasets/train_signs.h5, "r")train_set_x_orig np.array(train_datase…

基于visual Studio2013解决面试题之0307最后谁剩下

题目解决代码及点评/* n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字&…

谷歌、苹果等大佬亲自戳穿自动驾驶完美童话,技术、场景、安全牢笼实难突围!...

来源: 物联网智库摘要:自动驾驶普及不仅局限于自身技术和应用场景,而且与产业链各环节密切相关。一项科技从诞生到被人们所接受是一个循序渐进的过程,自动驾驶真正普及还任重而道远。2018年11月1日百度世界大会上,百度…

使用文件监控对象FileSystemWatcher实现数据同步

使用文件监控对象FileSystemWatcher实现数据同步 原文 使用文件监控对象FileSystemWatcher实现数据同步 最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内 容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高&a…

吴恩达作业11:残差网络实现手势数字的识别(基于 keras)+tensorbord显示loss值和acc值

一,残差网络实现手写数字识别 数据集地址:https://download.csdn.net/download/fanzonghao/10551018 首先来resnets_utils.py,里面有手势数字的数据集载入函数和随机产生mini-batch的函数,代码如下: import os import numpy as…

通过SVD求解单应矩阵

我们现在知道原则上4对匹配点对就可以唯一确定单应矩阵,但是在实际应用中我们无法保证两个视图严格满足使用条件(只有旋转变换;远景;平面场景),所以要使用拟合的方法求一个最优解。现在就来以SIFT算法源码为…

注意力机制(Attention)最新综述论文及相关源码

来源:专知注意力机制(Attention)起源于模仿人类的思维方式,后被广泛应用于机器翻译、情感分类、自动摘要、自动问答等、依存分析等机器学习应用中。专知编辑整理了Arxiv上一篇关于注意力机制在NLP中应用的综述《An Introductory Survey on Attention Mec…

橙子楼的猥琐大叔

故事要从暑假开始说起,那时我还在准备考研,每天往返于教室、宿舍和食堂,单调但不会无趣,常常会有故事发生,生活也很充实。 考研的一般都会在固定的教室有个自己的位子。 坐我正前面的是一个妹子,准确的说是…

Pycharm下安装Tensorflow

趁着帮师妹看Github上的一个项目,督促自己学习一下Python下训练神经网络的一整套流程。没想到在一开头就遇到了不少问题。首先是Pycharm中导入Github项目的问题,还有安装tensorflow的问题,之后又遇到了多种版本的Python共存的问题。在这里记录…

吴恩达作业9:卷积神经网络实现手势数字的识别(基于tensorflow)

数据集链接:https://download.csdn.net/download/fanzonghao/10551018 提供数据集代码放在cnn_utils.py里。 import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorflow.python.framework import ops…

AI洞观 | 戴上红帽 看IBM冲杀云计算市场

来源 | 网易智能(公众号 smartman163)摘要:可以预计,未来的云计算市场将越来越比拼生态综合服务能力,云计算行业进入下半场,谁在裸泳不久见分晓。IBM豪掷340亿美元收购红帽(Red Hat)…

基于visual Studio2013解决面试题之0608找出两个只出现一次的数

题目解决代码及点评/*已知数组中有两个数只出现一次,其他成对出现,请找出这两个数解决办法:1)简化问题,如果数组中只有一个数出现一次,那么只要对这个数组做异或即可2…

工业富联:左手工业AI,右手“雾小脑”

来源:先进制造业摘要:11月14日,第二十届中国国际高新技术成果交易会在深圳会展中心开幕。11月14日,第二十届中国国际高新技术成果交易会在深圳会展中心开幕。备受瞩目的是,在分论坛“2018第九届中国信息通信论坛”上&a…

吴恩达作业10:用卷积神经网络识别人脸happy(基于Keras)

数据集提供的代码放在kt_utils.py: import keras.backend as K import math import numpy as np import h5py import matplotlib.pyplot as pltdef mean_pred(y_true, y_pred):return K.mean(y_pred)def load_dataset():train_dataset h5py.File(datasets/train_h…