首页 > 其他分享 >学习分享:对极几何、基本矩阵、本质矩阵(持续更新)

学习分享:对极几何、基本矩阵、本质矩阵(持续更新)

时间:2023-03-11 14:23:42浏览次数:40  
标签:R1 R2 对极 矩阵 本质 分享 cv

对极几何、基本矩阵、本质矩阵

目录

对极约束相关介绍可以在《计算机视觉中的多视图几何》一书的185页找到;

1 对极约束

1.2 对极约束的理解

对极几何是两幅视图之间内在的射影几何;

对极约束:已知某一3D点\(X\)在第一张图像上的投影是\(x\),那么在同样观测到点\(X\)的第二幅图像上的投影\(x'\)是如何被约束的?

首先,有相机投影模型 \(Zx = PX\) ,可以推断点\(X\)在射线\(Cx\)上,(C是第一个相机的光心)

由于无法确定点\(X\)的深度,因此,第二幅图像上成像点的在面\(CC'X\)与成像平面的交线\(l'\)上,在对极几何中称为极线

则有第一个摄像机光心在第二幅图像上的投影\(e'\)称为极点

因此:对极约束实际上是将\(x'\)约束在直线\(l'\)上,表示是由点\(x\)到直线\(l'\)的映射

假设 该映射为 \(F\) , 则有 \(l' = Fx\),由于点\(x'\)在直线\(l'\)上,可得

\[x'Fx = 0 \]

其中,映射\(F\)就是基本矩阵,表示的是点到线的映射;

对极几何的前提:基线长度不能为0;初始化,纯旋转退化,对极约束就不存在了。

2 基本矩阵-Fundamental(对极约束的代数表示)

2.1 基本矩阵的几何推导

基本矩阵的几何推导的详细内容可以参考《计算机视觉中的多视图几何》

将对极约束的过程分成两步来分析:

  1. 假设有虚拟平面\(\pi\),将图像平面1上的点\(x\),投影到平面\(\pi\)上,在转移到图像平面2上的点\(x^{'}\)

\[x^{'} = H_{\pi} x \]

  1. 第二步是构造对极线,即摄影机\(P_1\)的光心在图像平面2上的投影-极点\(e^{'}\)和投影点\(x^{'}\)构成的直线\(l^{'}\),两个点的叉乘得到直线方程;

\[I^{'} = e^{'} \times x^{'} = [e^{'}]_{\times}H_{\pi}x \]

那么可以定义点到极线的映射\(F\)满足:\(I^{'} = Fx\) ,因此,\(F = [e^{'}]_{\times}H_{\pi}\),由于\([e^{'}]_{\times}\)的秩为2,基本矩阵\(F\) 的秩为2。

另外,由于点\(x\)的投影点\(x^{'}\)一定在直线\(I^{'}\)上,通过内积为0可以得到一个约束,也就是对极约束。

\[x^{'}Fx =0 \]

2.2 基本矩阵的代数推导

2.3 基本矩阵的重要性质

3 基本矩阵的计算方法

3.1 最小化代数距离方法(DLT)

3.2 退化情形

无平移,两个视图,摄影机中心重合。对极几何的定义不存在了

4 本质矩阵

4.1 对本质矩阵的理解

首先本质矩阵是基本矩阵在归一化平面上的特殊表示;具有形式: \(E = [t]_{*}R = R[R^{T}t]_{*}\)

\[E = [t]_{\times}R = R[R^{T}t]_{\times} \]

\[F = K^{-T}[t]_{\times}RK^{-1} = K^{-T}EK^{-1} \]

4.2 本质矩阵的性质

(1) 本质矩阵的自由度

本质矩阵的自由度是5,旋转矩阵和平移向量分别有三个自由度,但是本质矩阵有一个全局尺度因子的多义性;

(其实对自由度的理解还不是很透彻)

(2) 本质矩阵的内在性质

一个矩阵是本质矩阵的充要条件是它的奇异值中有两个相等而第三个是0.其奇异值一定是\([\sigma,\sigma,0]^{T}\)的形式

该结论的证明在《计算机视觉中的多视图几何》的9.6.1小节有介绍;

4.3 本质矩阵的求解

本质矩阵的求解也可以使用八点法,构建线性方程组来求解。具体的形式不再推导。可以参考《视觉SLAM十四讲》

值得提一下的是,八点法构建的线性方程组,最后求解完,可能没办法满足本质矩阵的内在性质

那有没有解决办法呢?

可以进行如下操作:

  1. 首先对E做奇异值分解:假设得到E的奇异值矩阵 \(\Sigma = diag(\sigma_1,\sigma_2,\sigma_3)\),且有\(\sigma_1 > \sigma_2 > \sigma_3\)
  2. 那么可以取新的E为

\[E = U diag(\frac{\sigma_1+\sigma_2}{2}, \frac{\sigma_1+\sigma_2}{2},0)V^{T} \]

4.4 本质矩阵的分解(由本质矩阵恢复摄像机矩阵)

对本质矩阵的分解,还不太理解;

可以参考《计算机视觉中的多视图几何》和《视觉SLAM十四讲》一起看;

在ORB-SLAM2的地图初始化时,会分别计算H和F,统计特征点重投影误差及点到极线的距离计算得分,选择得分高的映射。

当选择F矩阵时,需要从F矩阵中恢复位姿,ORB-SLAM2中会通过F计算E,再从E中恢复pose。

总结一下流程:

  1. 对本质矩阵进行奇异值分解
  2. 左奇异值矩阵U的最后一列就是t,对其进行归一化
  3. 构造一个绕Z轴旋转pi/2的旋转矩阵W,按照下式组合得到旋转矩阵 R1 = uWvt,旋转矩阵有行列式为+1的约束,所以如果算出来为负值,需要取反
  4. 矩阵W取转置来按照相同的公式计算旋转矩阵 R2 = uW.t()vt,同理,旋转矩阵有行列式为+1的约束,所以如果算出来为负值,需要取反
  5. 获得本质矩阵分解结果,形成四组解,分别是: (R1, t) (R1, -t) (R2, t) (R2, -t)
  6. 四组接分别进行三角化,取有效3D点最多的一组解。
// step 2 : 根据基础矩阵和相机的内参数矩阵计算本质矩阵
  cv::Mat E21 = K.t()*F21*K;

  // 定义本质矩阵分解结果,形成四组解,分别是: (R1, t) (R1, -t) (R2, t) (R2, -t)
  cv::Mat R1, R2, t;

  // step 3 : 从本质矩阵求解两个R解和两个t解,共四组解
  // Note : 参考:Multiple View Geometry in Computer Vision - Result 9.19 p259
  // 不过由于两个t解互为相反数,因此这里先只获取一个
  // 虽然这个函数对t有归一化,但并没有决定单目整个SLAM过程的尺度.
  // 因为 CreateInitialMapMonocular 函数对3D点深度会缩放,然后反过来对 t 有改变.
  //注意下文中的符号“'”表示矩阵的转置
  //                          |0 -1  0|
  // E = U Sigma V'   let W = |1  0  0|
  //                          |0  0  1|
  // 得到4个解 E = [R|t]
  // R1 = UWV' R2 = UW'V' t1 = U3 t2 = -U3
  DecomposeE(E21,R1,R2,t);
  cv::Mat t1 = t;
  cv::Mat t2 = -t;
/**
 * @brief 分解Essential矩阵得到R,t
 * 分解E矩阵将得到4组解,这4组解分别为[R1,t],[R1,-t],[R2,t],[R2,-t]
 * 参考:Multiple View Geometry in Computer Vision - Result 9.19 p259
 * @param[in] E                 本质矩阵
 * @param[in & out] R1          旋转矩阵1
 * @param[in & out] R2          旋转矩阵2
 * @param[in & out] t           平移向量,另外一个取相反数
 */
void Initializer::DecomposeE(const cv::Mat &E, cv::Mat &R1, cv::Mat &R2, cv::Mat &t)
{
  // 准备存储对本质矩阵进行奇异值分解的结果
  cv::Mat u,w,vt;
  // 对本质矩阵进行奇异值分解
  cv::SVD::compute(E,w,u,vt);

  // 左奇异值矩阵U的最后一列就是t,对其进行归一化
  u.col(2).copyTo(t);
  t=t/cv::norm(t);

  // 构造一个绕Z轴旋转pi/2的旋转矩阵W,按照下式组合得到旋转矩阵 R1 = u*W*vt
  // 计算完成后要检查一下旋转矩阵行列式的数值,使其满足行列式为1的约束
  cv::Mat W(3,3,CV_32F,cv::Scalar(0));
  W.at<float>(0,1)=-1;
  W.at<float>(1,0)=1;
  W.at<float>(2,2)=1;

  // 计算
  R1 = u*W*vt;
  // 旋转矩阵有行列式为+1的约束,所以如果算出来为负值,需要取反
  if(cv::determinant(R1)<0)
    R1=-R1;

  // 同理将矩阵W取转置来按照相同的公式计算旋转矩阵R2 = u*W.t()*vt
  R2 = u*W.t()*vt;
  //旋转矩阵有行列式为1的约束
  if(cv::determinant(R2)<0)
    R2=-R2;
}

标签:R1,R2,对极,矩阵,本质,分享,cv
From: https://www.cnblogs.com/jiangxinyu1/p/17205932.html

相关文章

  • 分享一个自己用的生肖计算方法
    子丑寅卯辰巳午未申酉戌亥鼠牛虎兔龙蛇马羊猴鸡狗猪 通过别人的年龄计算别人的生肖,先要记住以上两行。知道自己的生肖和出生年龄,比如92年猴,别......
  • 【分享贴】项目中为啥总是项目经理一人干着急?
    看完了《狂飙》才发现,高启强才是咱项目经理的模范。前段时间身边同事都疯狂安利这部电视剧,但我哪有空余时间刷剧,直到最近才断断续续的追完。这才发现“高启强”这个人物身......
  • 解锁ChatGPT超高级玩法,展示动态图片,纯干货分享!
    文/ 韩彬 这段时间在玩ChatGPT,总是文字,我有点玩腻了,突然想让ChatGPT返回一张图片,可是它却答复: 很抱歉,作为一个语言模型,我无法展示图片。但你可以在搜索引擎中搜索......
  • 【YonBuilder 移动开发】关于创建 App 是否需要 AVM 的经验分享
    概述开发者在使用YonBuilder移动开发技术,创建新项目的时候,通常都会有一个是否使用AVM的选项,见下图在Web网站控制台中创建应用的截图很多新手开发者可能都会有这样一......
  • 矩阵求导相关
    1.preref:https://zhuanlan.zhihu.com/p/263777564起初是课上看到\(\frac{\partialw^TRw}{\partialw}\),但没认真听,后面不知道怎么求导...2.简单情况首先,针对函数......
  • 一寸照片是几比几?一寸照片拍摄方法分享!​
    一寸照片是几比几?一寸照片是指尺寸为2.5厘米×3.5厘米的照片。它的比例约为4:3。很多小伙伴月是不知道,在中国,一寸照片是常用的证件照片尺寸,如身份证、驾驶证、护照等。此外,......
  • 微信小程序限制图片上传思路分享
    今日在第二大学远程实习中,又发现了一个开发中常用的点,记录分享一下。我们经常在编辑帖子的时候会遇到上传图片的操作,也会遇到上传图片达到最大数量无法继续上传的时候,那这......
  • 重塑矩阵
    题目描述在MATLAB中,有一个非常有用的函数reshape,它可以将一个mxn矩阵重塑为另一个大小不同(rxc)的新矩阵,但保留其原始数据。给你一个由二维数组mat表示的mxn......
  • webgl 系列 —— 变换矩阵和动画
    其他章节请看:webgl系列变换矩阵和动画动画就是不停地将某个东西变换(transform)。例如将三角形不停地旋转就是一个动画和CSStransform类似,变换有三种形式:平移、缩......
  • 力扣中542 01矩阵
    题解1:广度遍历是从0出发然后一步能到的设置为1遍历矩阵设为遍历过入队再看一步能到的设置为2 题解2:动态规划     改不对bug是因为没有设置已经遍历过......