【OpenCV】 2D-2D:对极几何算法原理

2023-05-16

2D-2D匹配: 对极几何

SLAM十四讲笔记1

1.1 对极几何數學模型对极几何 Epipolar Geometry

考虑从两张图像上观测到了同一个3D点,如图所示**。**我们希望可以求解相机两个时刻的运动 R , t R,t R,t

假设我们要求取两帧图像 I 1 , I 2 I_1,I_2 I1,I2之间的运动,设第一帧到第二帧的运动为R ,t,两个相机中心分别为 O 1 , O 2 O_1,O_2 O1,O2.考虑 I 1 I_1 I1中有一个特征点 p 1 p_1 p1,它在 I 2 I_2 I2中对应着特征点 p 2 p_2 p2.连线$\overrightarrow{O_1 p_1} 和 和 \overrightarrow{O_2 p_2}$ 在三维空间中交于点P,这时点 O 1 , O 2 , P O_1 ,O_2,P O1,O2,P三个点可以确定一个平面,为极平面. O 1 , O 2 O_1,O_2 O1,O2连线与像平面 I 1 , I 2 I_1,I_2 I1,I2的交点分别为 e 1 , e 2 e_1,e_2 e1,e2, e 1 , e 2 e_1,e_2 e1,e2称为极点, O 1 O 2 O_1O_2 O1O2称为基线,极平面与两个像平面 I 1 , I 2 I_1,I_2 I1,I2之间的相交线 l 1 , l 2 l_1,l_2 l1,l2称为极线.

P P P I 1 I_1 I1下的线号机坐标为 P = [ X , Y , Z ] T P=[X,Y,Z]^{T} P=[X,Y,Z]T,两个投影像素点 p 1 , p 2 p_1,p_2 p1,p2 的像素位置满足如下公式:
{ s 1 p 1 = K P s 2 p 2 = K ( R P + t ) \left\{ \begin{aligned}s_1p_1 =KP\\ s_2p_2=K(RP+t)\\ \end{aligned} \right. \\\\ {s1p1=KPs2p2=K(RP+t)
p 1 , p 2 p_1,p_2 p1,p2 的归一化坐标 { x 1 = K − 1 p 1 x 2 = K − 1 p 2 \left\{\begin{aligned} x_{1} =K^{-1}p_1\\ x_{2} =K^{-1}p_2\\ \end{aligned}\right. {x1=K1p1x2=K1p2

x 1 , x 2 x_1,x_2 x1,x2是两个像素归一化平面上的坐标。代入上式,得到 x 2 = R x 1 + t x_2=Rx_1 +t x2=Rx1+t

同时左乘 t ∧ t^{ ∧ } t可得:
t ∧ x 2 = t ∧ R x 1 t^{ ∧ }x_2=t^{ ∧ }Rx_1 tx2=tRx1
同时左乘 x 2 T x^{T}_2 x2T,可得
x 2 T t ∧ x 2 = x 2 T t ∧ R x 1 x^{T}_2t^{ ∧ }x_2=x^{T}_2t^{ ∧ }Rx_1 x2Ttx2=x2TtRx1
可得
x 2 T t ∧ R x 1 = 0 x^{T}_2t^{ ∧ }Rx_1=0 x2TtRx1=0
重新带入 p 1 , p 2 p_1,p_2 p1,p2,可得:
p 2 T K − T t ∧ R K − 1 p 1 = 0 p_2^{T}K^{-T}t^{ ∧ }RK^{-1}p_1=0 p2TKTtRK1p1=0
以上俩个式子称为对极约束,定义基础矩阵F和本质矩阵E,可以进一步简化对极约束:
E = t ∧ R F = K − T E K − 1 x 2 T E x 1 = p 2 T F p 1 = 0 E=t^{ ∧ }R \quad \quad \quad F=K^{-T}EK^{-1}\quad \quad \quad x^{T}_2Ex_1=p_2^{T}Fp_1=0 E=tRF=KTEK1x2TEx1=p2TFp1=0
本质矩阵E 的求解
考虑到E 的尺度等价性,可以用8对点来估计E,是为八点法.

对于一对匹配点,其归一化坐标 x 1 = [ u 1 , v 1 , 1 ] , x 2 = [ u 2 , v 2 , 1 ] x_1=[u_1,v_1,1],x_2=[u_2,v_2,1] x1=[u1,v1,1],x2=[u2,v2,1]根据对极约束,有
( u 1 , v 1 , 1 ) [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] [ u 2 v 2 1 ] = 0 (u_1,v_1,1)\left[ \begin{matrix} e_1 &e_2 &e_3\\e_4 &e_5 &e_6 \\e_7 &e_8 &e_9 \end{matrix} \right]\left[ \begin{matrix} u_2\\v_2\\1\end{matrix} \right]=0 (u1,v1,1) e1e4e7e2e5e8e3e6e9 u2v21 =0

把矩阵E展开为向量 [ e 1 e 2 e 3 e 4 e 5 e 6 e 7 e 8 e 9 ] T \left[ \begin{matrix} e_1 &e_2 &e_3 &e_4 &e_5 &e_6 &e_7 &e_8 &e_9 \end{matrix} \right]^{T} [e1e2e3e4e5e6e7e8e9]T ,对极约束可以写成与e ee有关的线性形式:
[ u 1 u 2 , u 1 v 2 , u 1 , v 1 u 2 , v 1 v 2 , v 1 , u 2 , v 2 , 1 ] T . e = 0 [u_1u_2,u_1v_2,u_1,v_1u_2,v_1v_2,v_1,u_2,v_2,1]^{T}.e=0 [u1u2,u1v2,u1,v1u2,v1v2,v1,u2,v2,1]T.e=0
把八对点对应的 x 1 , x 2 x_1,x_2 x1,x2分别代入方程中,得到线性方程组:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9n4lOEh-1629730544222)(../AppData/Roaming/Typora/typora-user-images/1629650165462.png)]

求得E后,对E进行SVD分解以求取R,t :设E的SVD分解为 E = U ∑ V T E=U \sum V^T E=UVT则对应的R ,t 分别为:
t ∧ = U R Z ( π 2 ) ∑ U T R = U R Z T ( π 2 ) ∑ V T t^{∧} =U R_Z(\frac{\pi}{2})\sum U^T \quad \quad R=U R^{T}_Z(\frac{\pi}{2})\sum V^T t=URZ(2π)UTR=URZT(2π)VT
其中 R Z ( π 2 ) R_Z(\frac{\pi}{2}) RZ(2π)表示沿Z轴旋转90°得到的旋转矩阵.

1.2 对极几何讨论

对极几何的讨论:

    1. 尺度不确定性: 2D图像不具有深度信息,这导致了单目视觉的尺度不确定性. 实践中设t 为单位1,计算相机运动和和特征点的3D位置,这被称为单目SLAM的初始化.

    2. 退化问题:当特征的共面或者相机发生纯旋转时,基础矩阵的自由度下降,就出现所谓的退化。实际中数据总是包含一些噪声,这时候继续使用八点法求解基础矩阵,基础矩阵多余出来的自由度将会主要由噪声决定。

      为了可以避免退化现象造成的影响,通常在估计基础矩阵F的同时会求解单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵。

    3. 初始化的纯旋转问题: 若相机发生纯旋转,导致t 为零,得到的E也将为零,会导致我们无从求解R.因此单目初始化不能只有纯旋转,必须要有一定程度的平移.

    4. 多于8对点的情况:

      对于八点法,有 A e = 0 Ae=0 Ae=0,其中A为一个8×9的矩阵.

      若匹配点的个数多于8个,A的尺寸变化,上述方程不成立.因此转而求取最小化二次型
      m i n e ∣ ∣ A e ∣ ∣ 2 2 = m i n e e T A T A e min_e||Ae||^2_2=min_e e^TA^TAe mine∣∣Ae22=mineeTATAe
      是为最小二乘意义下的E矩阵.

      1.3 E/F的意义

      基础矩阵F描述了三维空间点P在摄像机不同方位下成像得到的投影像素点之间的关系。
      本质矩阵E描述 相邻图像上对应像素归一化平面上的,估计相机在两个位置的相对运动。

1.4 SVD(奇异值分解)是一种常用的矩阵分解方法,其特点包括:

可以将任何矩阵分解成三个部分:左奇异矩阵、右奇异矩阵和奇异值矩阵。

  1. 奇异值矩阵是一个对角矩阵,其中的元素称为奇异值。奇异值是非负实数,代表着矩阵在每个主方向上的“重要程度”。

  2. 左奇异矩阵和右奇异矩阵都是正交矩阵。这意味着它们的转置矩阵等于它们的逆矩阵,所以可以用于矩阵的变换和逆变换。

  3. SVD 分解可以用于数据降维、噪声滤波、图像压缩等领域,具有广泛的应用价值。

  4. 对于奇异值较小的部分可以进行截断操作,这可以有效地减少数据的维度并去除噪声。

  5. SVD 分解是一种数值稳定的算法,能够处理大部分类型的矩阵并且不容易出现数值不稳定的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenCV】 2D-2D:对极几何算法原理 的相关文章

  • 通过qemu-img命令将raw image转换成VMware虚拟硬盘vmdk

    为了在VMware中跑QNX系统 xff0c 我需要想办法将编译BSP生成的img文件固化到VMware的虚拟硬盘中去 xff0c 之前一直找不到方法 xff0c 到渐渐的只能用很笨的方法几次中专 将生成的img文件通过win32DiskI
  • WSL2 Ubuntu安装Qt(包括QtCreator)

    最近因为需要在Linux下使用qtcreator做一些界面开发的预研和学习 xff0c 主要是因为要交叉编译Qt 但又不想再使用虚拟机了 xff0c 真的太消耗内存了 于是就想着直接使用Windows10 下面的WSL2 怎么安装WSL2这
  • 架构师成长之路工具篇(1):markdown撰写文档

    今天笔者想说的工具就是markdown xff0c 正所谓工欲善其事必先利其器 xff0c 选择高效的工具自然能提升工作效率 笔者使用的markdown工具是 xff1a typora word太重 xff0c 太复杂 xff0c 在写文档
  • 如何优雅的退出qemu虚拟环境

    在console环境下 xff0c 先 按 ctrl 43 a xff0c 释放之后再按 x 键 既可terminate qemu 注 xff1a 1 a 和 x 均为小写 2 必须先释放ctrl 43 a 之后 再按x键
  • xmake经验总结1:解决c++ future/promise抛出std::system_error的问题

    1 背景 1 1 场景 编译器 xff1a gcc 9 4 运行系统 xff1a Ubuntu 20 04 4 LTS xmake v2 6 7 场景 xff1a 其大致场景是使用c 43 43 的future promise功能 xff0
  • 神经网络实现手写数字识别(MNIST)

    一 缘起 原本想沿着 传统递归算法实现迷宫游戏 gt 遗传算法实现迷宫游戏 gt 神经网络实现迷宫游戏的思路 xff0c 在本篇当中也写如何使用神经网络实现迷宫的 xff0c 但是研究了一下 xff0c 感觉有些麻烦不太好弄 xff0c 所
  • 【AI】Auto-GPT:当时代抛弃你的时候,不会和你说一声再见!

    当时代抛弃你的时候 xff0c 不会和你说一声再见 xff01 Auto GPT Code Auto GPT 一个全自动化的GPT 4 Collecting BOTAI Auto GPT 官网网站
  • 解决visio对象在word中显示不全的问题

    作为一个软件工程师 xff0c 编写技术文档是常有的事情 xff0c 使用visio绘制各种图形 如 xff0c 流程图 xff0c 结构图 xff0c 框架图 xff0c 状态图等等 也是再正常不过的事情 如果我们在word中撰写文档时
  • git submodule使用以及注意事项

    一 背景 在平时的软件开发过程中常常会有这样的场景 xff0c 自己负责的某个模块会依赖其他模块或者第三方的library 这时你自己的模块是一个独立的代码仓库 xff0c 你想要实现这样一种功能 xff0c 当你从你的模块的代码仓库里把代
  • Webpack5 - 基本使用

    一 webpack有何作用 webpack是一个Javascript应用程序的模块打包器 它可以递归地构建一个应用程序的模块依赖关系图 xff0c 然后将所有模块打包在一起 为什么需要模块打包器 xff1a 现在的应用程序模块文件很多 xf
  • Vue.js - VueRouter的Hash与History模式 / 手写VueRouter

    一 Hash与History模式 Hash模式History模式url地址外观http localhost 8081 abouthttp localhost 8080 about原理基于锚点 xff0c 监听锚点变化时触发的onhashch
  • Vue.js - Vue.js响应式原理(1/2)

    一 数据驱动 数据响应式 xff1a 数据改变 xff0c 则视图改变 xff0c 避免频繁的Dom操作 xff0c 提高运行效率 双向绑定 xff1a 数据改变 xff0c 则视图改变 xff1b 视图改变 xff0c 则数据也随之改变
  • Vue.js - 模拟Vue.js响应式原理(2/2)

    项目仓库 xff1a https gitee com big right right vue responsive tree master L8 一 类的说明 Vue类 xff1a 保存传入的选项数据 xff0c 把选项data中的成员注入
  • .NET用NCO连接SAP RFC---写数据到SAP

    1 环境 xff1a a win7 43 64位操作系统 b VS2012 c nco3 0 xff08 64bit 下载网址 xff1a http www dllbang com dll sapnco dll xff09 xff0c d
  • .NET Framwork,C#入门开发教程,零基础必看

    初识 NET Framwork和开发过程 一 什么是 NET Framework NETFramework是一个开发平台 xff0c 可以在其上使用多种语言开发程序 xff1a 如C xff0c VB xff0c C 43 43 xff08
  • 如何清除IIS缓存

    问题描述 xff1a 在IIS的默认网站下创建了一个虚拟目录名A xff0c 然后删除这个虚拟目录 后来需要重新创建一个同名虚拟目录 xff0c 映射的还是原来的项目文件 xff0c 只是项目文件的物理路径发生了变化 xff0c 这个新虚拟
  • jqGrid 多选复选框 编辑列

    1 首先看一下效果 2 html代码 lt table id 61 34 grid table 34 gt lt table gt 3 在 function 方法中 xff0c 写如下方法 xff0c 用json数据填充jqGrid xff
  • 【NERF】及其变种

    CVPR 2023 Interactive Segmentation of Radiance Fields Nerf重建加上选中分割 Nerf 调研
  • Asp.net WebApi 项目示例(增删改查)

    1 WebApi是什么 ASP NET Web API 是一种框架 xff0c 用于轻松构建可以由多种客户端 xff08 包括浏览器和移动设备 xff09 访问的 HTTP 服务 ASP NET Web API 是一种用于在 NET Fra
  • C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法

    1 C 中的每一个委托都内置了BeginInvoke和EndInvoke方法 xff0c 如果委托的方法列表里只有一个方法 xff0c 那么这个方法就可以异步执行 xff08 不在当前线程里执行 xff0c 另开辟一个线程执行 xff09

随机推荐