- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
对极约束相关介绍可以在《计算机视觉中的多视图几何》一书的185页找到; 。
对极几何是两幅视图之间内在的射影几何; 。
对极约束:已知某一3D点 \(X\) 在第一张图像上的投影是 \(x\) ,那么在同样观测到点 \(X\) 的第二幅图像上的投影 \(x'\) 是如何被约束的?
首先,有相机投影模型 \(Zx = PX\) ,可以推断点 \(X\) 在射线 \(Cx\) 上,(C是第一个相机的光心) 。
由于无法确定点 \(X\) 的深度,因此,第二幅图像上成像点的在面 \(CC'X\) 与成像平面的交线 \(l'\) 上,在对极几何中称为极线 。
则有第一个摄像机光心在第二幅图像上的投影 \(e'\) 称为极点 。
因此:对极约束实际上是将 \(x'\) 约束在直线 \(l'\) 上,表示是由点 \(x\) 到直线 \(l'\) 的映射 。
假设 该映射为 \(F\) , 则有 \(l' = Fx\) ,由于点 \(x'\) 在直线 \(l'\) 上,可得 。
其中,映射 \(F\) 就是基本矩阵, 表示的是点到线的映射; 。
对极几何的前提:基线长度不能为0;初始化,纯旋转退化,对极约束就不存在了.
基本矩阵的几何推导的详细内容可以参考《计算机视觉中的多视图几何》 。
将对极约束的过程分成两步来分析:
那么可以定义点到极线的映射 \(F\) 满足: \(I^{'} = Fx\) ,因此, \(F = [e^{'}]_{\times}H_{\pi}\) ,由于 \([e^{'}]_{\times}\) 的秩为2,基本矩阵 \(F\) 的秩为2.
另外,由于点 \(x\) 的投影点 \(x^{'}\) 一定在直线 \(I^{'}\) 上,通过内积为0可以得到一个约束,也就是对极约束.
无平移,两个视图,摄影机中心重合。对极几何的定义不存在了 。
首先本质矩阵是基本矩阵在归一化平面上的特殊表示;具有形式: \(E = [t]_{*}R = R[R^{T}t]_{*}\) 。
本质矩阵的自由度是 5 ,旋转矩阵和平移向量分别有三个自由度,但是本质矩阵有一个全局尺度因子的多义性; 。
(其实对自由度的理解还不是很透彻) 。
一个矩阵是本质矩阵的 充要条件 是它的奇异值中有两个相等而第三个是0.其奇异值一定是 \([\sigma,\sigma,0]^{T}\) 的形式 。
该结论的证明在《计算机视觉中的多视图几何》的9.6.1小节有介绍; 。
本质矩阵的求解也可以使用八点法,构建线性方程组来求解。具体的形式不再推导。可以参考《视觉SLAM十四讲》 。
值得提一下的是,八点法构建的线性方程组,最后求解完,可能没办法满足本质矩阵的内在性质 。
那有没有解决办法呢?
可以进行如下操作:
对本质矩阵的分解,还不太理解; 。
可以参考《计算机视觉中的多视图几何》和《视觉SLAM十四讲》一起看; 。
在ORB-SLAM2的地图初始化时,会分别计算H和F,统计特征点重投影误差及点到极线的距离计算得分,选择得分高的映射.
当选择F矩阵时,需要从F矩阵中恢复位姿,ORB-SLAM2中会通过F计算E,再从E中恢复pose.
总结一下流程:
// 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;
}
最后此篇关于学习分享:对极几何、基本矩阵、本质矩阵(持续更新)的文章就讲到这里了,如果你想了解更多关于学习分享:对极几何、基本矩阵、本质矩阵(持续更新)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
直接上代码,可以写在公共文件common和继承的基础类中,方便调用 ?
1、php服务端环境搭建 1.php 服务端环境 安装套件 xampp(apach+mysql+php解释器) f:\mydoc文件(重要)\dl_学习\download重要资源\apache
如下所示: Eclipse快捷键 Ctrl+1 快速修复 Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加)
第一步:conn.PHP文件,用于连接数据库并定义接口格式,代码如下: php" id="highlighter_808731">
本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正。 1、如果在Linux下使用GCC编译器执行下列程序,输出结果是什么?
安装完最新的Boost库 官方说明中有一句话: Finally, $ ./b2 install will leave Boost binaries in the lib/ subdirecto
为了梳理前面学习的《spring整合mybatis(maven+mysql)一》与《spring整合mybatis(maven+mysql)二》中的内容,准备做一个完整的示例完成一个简单的图书管理功
网站内容质量仅仅是页面综合得分里面的一项.不管算法如何改变调整,搜索引擎都不会丢弃网站页面的综合得分。 一般情况下我们把页面的综合得分为8个点: 1、标题的设置 (标题的设置要有独特性)
最近事情很忙,一个新项目赶着出来,但是很多功能都要重新做,一直在编写代码、debug。今天因为一个新程序要使用fragment来做,虽然以前也使用过fragment,不过没有仔细研究,今天顺道写篇文
Android资源命名规范 最近几个月,大量涉及android资源的相关工作。对于复杂的应用而言,资源命名的规范很有必要。除了开发人员之外,UI设计人员(或者切图相关人员)也需要对资源使用的位置非常
以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射。 两者相差不多都支持一对一,一对多,多对多,本章简单介绍一对一的使用以及注意点。
如下所示: ? 1
如果想在自定义的View上面显示Button 等View组件需要完成如下任务 1.在自定义View的类中覆盖父类的构造(注意是2个参数的) 复制代码 代码如下: publ
实现功能:实现表格tr拖动,并保存因为拖动改变的等级. jsp代码 ?
代码:测试类 java" id="highlighter_819000"> ?
红黑树是一种二叉平衡查找树,每个结点上有一个存储位来表示结点的颜色,可以是red或black。 红黑树具有以下性质: (1) 每个结点是红色或是黑色 (2) 根结点是黑色的 (3) 如果一个
废话不多说,直接上代码 ? 1
码代码时,有时候需要根据比较大小分别赋值: ? 1
实际项目开发中,我们经常会用一些版本控制器来托管自己的代码,今天就来总结下Git的相关用法,废话不多说,直接开写。 目的:通过Git管理github托管项目代码 1、下载安装Git 1、下载
直接上代码: 复制代码 代码如下: //验证码类 class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABC
我是一名优秀的程序员,十分优秀!