11. 双目视觉之立体视觉基础

目录

  • 1. 深度恢复
    • 1.1 单目相机缺少深度信息
    • 1.2 如何恢复场景深度?
    • 1.3 深度恢复的思路
  • 2. 对极几何约束
    • 2.1 直观感受
    • 2.2 数学上的描述

1. 深度恢复

1.1 单目相机缺少深度信息

之前学习过相机模型,最经典的就是小孔成像模型。我们知道相机通过小孔成像模型对世界点的观测是缺少深度信息的。我们得到的只是世界点在相机平面上的一个投影。如下图,世界点P只要是在那条红色线上,他在相机上的成像位置就是P‘,所以我们无法知道相机看到的P’对应的世界点的三维位置。
在这里插入图片描述
高博的《视觉SLAM十四讲》中一幅画很形象地说明了这个问题。
在这里插入图片描述
我们人类看到这个照片,也许会想到,这个明显是“近处的人和远处的人”啊。但是从单目视觉的角度来看,它并不能有“近和远”的概念,因为无论那些远处的人是“真人”还是“模型”,他都会给出这么一副图像,从数据的层面来看,他就是给的二维坐标。

1.2 如何恢复场景深度?

那么,我们很容易想到,我们知道了二维坐标,再知道那些场景的深度不就有立体感了吗?
是的,实际操作起来也很简单,再加一个相机,有两个视角看同一个场景,就能通过三角测距来确定场景点的深度。(就像我们的眼睛一样,我们的双眼就是一个完美的立体视觉系统。有人说我一只眼也能分辨出来远近,那是因为我们长久以来积累下来的“经验”让我们有了一些深度的先验信息。)
在这里插入图片描述
我们来假定一种最理想的情况,两个相机焦距相等,成像平面和光轴完美平行,并且其X轴方向也完美对齐,也就是两个相机不存在Y方向的偏移,那么就会如下图:
在这里插入图片描述
成像示意图可以这么画出来:
在这里插入图片描述
我们从上图可以获得一些信息:左右两个相机,他们三个坐标轴都是平行的,且焦距都是f,两者光心的连线定义为基线。两个相机同时观测到世界点P(当然这里没有考虑y,因为两相机在y方向上没有偏移。有偏移的话一样会形成这样的三角关系。)
在这里插入图片描述
根据相似三角形的性质,会有上述公式成立。很容易得出世界点P的深度值Z:
在这里插入图片描述
上面的d=(xl - xr)称为视差,从公式上也能看出,场景点符合近大远小的规则。即,f和b不变,深度z与视差d呈反比。

1.3 深度恢复的思路

通过上面的描述,我们就可以总结出深度恢复的答题思路。

①双目相机标定,标定出相机的焦距f和基线b;
②通过某种方式找到两个相机对同一个场景点观测的匹配关系,这一步一般叫做数据关联,得到视差d;
③根据公式计算深度。

2. 对极几何约束

2.1 直观感受

上面的推导我们也说了是一种理想情况,两个相机三个轴完全平行,上面的两个相机x轴还是重合的。但是我们实际使用双目相机的时候基本不可能做到上述情况。实际一般是下图所示情况:
在这里插入图片描述
做视觉SLAM的朋友肯定对这个对极几何约束非常熟悉。我在这里只把图上符号含义说明一下: O O O为相机光心位置, I I I为相机的成像平面, P P P是世界点, p p p为两相机各自对世界点的观测, l l l为极线, e e e为极点, O 1 O 2 P O_1O_2P O1O2P组成的平面为极平面,极线为极平面与成像平面的交线。

显然,光心和成像平面是固定的,也就是说极点是固定的,基线也是固定的,而世界点们构成的极平面是绕着基线作为轴转动的,这也造成对极线也是以基线为轴在成像平面内移动。
当然,极点不一定都在画面中,比如第一节中提到的理想情况,极点位置就在无穷远处。这种情况叫做极线矫正,后面会详细说。

对极约束说明了这样一个真相:已知左相机的观测点 p 1 p_1 p1,在右相机的成像平面上寻找匹配点,这个匹配点的位置就在极线上。 有了这个约束,我们不必全图范围内去寻找匹配点,而是沿着极线去寻找即可。双目相机观测到的场景中匹配点的关系如下图,途中白线就是极线。
在这里插入图片描述

2.2 数学上的描述

观察对极几何约束的图示,我们重新假设世界点 P P P,在左相机的观测为 P l Pl Pl,在右相机的观测为 P r Pr Pr,则会有如下关系,其中 R R R为两相机的相对旋转, T T T为相对平移。
在这里插入图片描述
我们在等式两侧同时叉乘一个 T T T

在这里插入图片描述
向量和自己叉乘为零,所以有: T T Tx P r = T P_r=T Pr=Tx R P l RP_l RPl
向量叉乘得到以两向量构成平面的法线,所以上式再与 P r P_r Pr点乘得零。
即, P r T ( T P_r^T(T PrT(Tx R P l ) = 0 RP_l)=0 RPl)=0
此时,我们定义 E = T E=T E=Tx R R R,则有, P r T E P l = 0 P_r^TEP_l=0 PrTEPl=0
这就是对极几何约束的数学描述,其中 P l , P r P_l,P_r Pl,Pr为相机成像平面观测的点, E E E为本质矩阵。一般我们会将 P l , P r P_l,P_r Pl,Pr归一化到 z = 1 z=1 z=1的平面上。
当然如果我们使用相机图像像素平面的点来描述对极几何约束,只需在引入一个相机内参,即:在这里插入图片描述
F = K r − T E K l − 1 F=K_r^{-T}EK_l^{-1} F=KrTEKl1,这个 F F F被称为基础矩阵。这个时候的 p l , p r p_l,p_r pl,pr就是像素坐标系上的点了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

零基础轻松学编程,中文编程开发工具下载及构件教程

零基础轻松学编程,中文编程开发工具下载及构件教程 一、前言 零基础学编程,中文编程工具下载,中文编程开发工具构件之选择件列表框构件教程, 想学编程可 编程交流.群.一起交流学习(关注收藏或点击最下方官网卡片进入…

【c语言】详解操作符(上)

1. 操作符的分类 2. 原码、反码、补码 整数的2进制表示方法有三种,即原码、反码、补码 有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位是被当做符号位其余都是数值位。 符号位都是用0表示“正”,用…

设计模式:简介及基本原则

简介 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化&#xff…

Kotlin快速入门5

Kotlin的继承与重写 kotlin的继承 Kotlin中所有类都继承自Any类,Any类是所有类的超类,对于没有超类型声明的类是默认超类(Any 不是 java.lang.Object): class LearnKotlin // 默认继承自Any Any类默认提供三个函数…

Scikit-learn (sklearn)速通 -【莫凡Python学习笔记】

视频教程链接:【莫烦Python】Scikit-learn (sklearn) 优雅地学会机器学习 视频教程代码 scikit-learn官网 莫烦官网学习链接 本人matplotlib、numpy、pandas笔记 1 为什么学习 Scikit learn 也简称 sklearn, 是机器学习领域当中最知名的 python 模块之一. Sk…

IDEA搭建JDK源码学习环境(可添加注释、修改、debug)

工程详见:https://github.com/wenpanwenpan/study-source-jdk1.8.0_281 1、找到src.zip和javafx-src.zip 找到你想要调试的JDK,笔者本地电脑上装了两个版本的JDK,这里以jdk1.8.0_281为例将JDK目录下的javafx-src.zip和src.zip两个压缩包进行…

【GitHub项目推荐--不错的 TypeScript 学习项目】【转载】

在线白板工具 Excalidraw 标星 33k,是一款非常轻量的在线白板工具,可以直接在浏览器打开,轻松绘制具有手绘风格的图形。 如下图所示,Excalidraw 支持最常用的图形元素:方框、圆、菱形、线,可以方便的使用…

【Web】小白也能做的RWCTF体验赛baby题部分wp

遇到不会的题,怎么办!有的师傅告诉你完了,废了,寄了!只有Z3告诉你,稳辣!稳辣!都稳辣! 这种CVE复现的题型,不可能要求选手从0到1进行0day挖掘,其实…

12.15字符编码(血干JAVA系列)

字符编码 12.15.1 Java常见编码简介12.15.2得到本机的编码显示【例12.68】使用上述方法得到JVM的默认编码 12.15.3乱码产生【例12.69】使用1SO8859-1编码 12.15.1 Java常见编码简介 12.15.2得到本机的编码显示 在 前 面 讲 解 常 用 类 库 的 时 候 曾 经 介 绍 过 &#xff0…

HarmonyOS 沉浸式状态栏实现

比如说 我们代码是这样的 Entry Component struct Index {build() {Column() {Column() {Column() {Text(定标标题).fontSize(20).fontColor(Color.White)}.height(50).justifyContent(FlexAlign.Center)}.width(100%).backgroundColor(#FF0000)}.height(100%)} }你预览器上看…

k8s 版本发布与回滚

一、实验环境准备: kubectl get pods -o wide kubectl get nodes -o wide kubectl get svc 准备两个nginx镜像,版本号一个是V3,一个是V4 二、准备一个nginx.yaml文件 apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deploylab…

AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)

AutoGen是微软推出的一个全新工具,它用来帮助开发者创建基于大语言模型(LLM)的复杂应用程序. AutoGen能让LLM在复杂工作流程启用多个角色代理来共同协作完成人类提出的任务。在我之前的一篇博客: AutoGen实战应用(一):代码生成、执行和调试 中我们通过一…

CTF CRYPTO 密码学-6

题目名称:敲击 题目描述: 方方格格,不断敲击 “wdvtdz qsxdr werdzxc esxcfr uygbn” 解题过程: step1:根据题目描述敲击,wdvtdz对应的字符为x step2:依此类推r,z,o&…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步:全局安装:npm install -g create-react-app 第二步:切换到想创建项目的目录,使用命令create-react-app hello-react 第三步:进入项目目录,cd hello-react 第四步:启…

Pyecharts 风采:从基础到高级,打造炫酷象形柱状图的完整指南【第40篇—python:象形柱状图】

文章目录 引言安装PyechartsPyecharts象形柱状图参数详解1. Bar 类的基本参数2. 自定义图表样式3. 添加标签和提示框 代码实战:绘制多种炫酷象形柱状图进阶技巧:动态数据更新与交互性1. 动态数据更新2. 交互性设计 拓展应用:结合其他图表类型…

Android 基础技术——列表卡顿问题如何分析解决

笔者希望做一个系列,整理 Android 基础技术,本章是关于列表卡顿问题如何分析解决 onBindViewHolder 优化 是否有耗时操作、重复创建对象、设置监听器、findViewByID、局部的动画对象等操作 是否存在内存泄漏 发生内存泄露,会导致一些不再使用…

工业4.0开放平台通信 统一架构OPC UA的一种测试方法

工业4.0和工业物联网(Industrial Internet of Things, IIoT)的核心挑战在于设备、机器以及来自不同行业服务之间的安全和标准化的数据和信息交换。 2016年11月工业4.0平台发布了指导纲要《工业4.0产品需要实现哪些准则》,即对于所有位于工业…

概念抽取:构建认知基础的关键步骤

目录 前言1 概念抽取任务定义1.1 概念知识图谱的关系定义1.2 实体与概念的紧密关联1.3 多样的概念关系 2 概念在认知中的重要角色2.1 语言理解的基础2.2 上下位关系的深化理解 3 概念抽取方法3.1 基于模板的抽取3.2 基于百科的抽取3.3 基于机器学习的方法 4 应用4.1 自然语言理…

一行命令在 wsl-ubuntu 中使用 Docker 启动 Windows

在 wsl-ubuntu 中使用 Docker 启动 Windows 0. 背景1. 验证我的系统是否支持 KVM?2. 使用 Docker 启动 Windows3. 访问 Docker 启动的 Windows4. Docker Hub 地址5. Github 地址 0. 背景 我们可以在 Windows 系统使用安装 wsl-ubuntu,今天玩玩在 wsl-ub…

【Web前端实操16】雪碧图(CSS精灵图)

雪碧图 CSS Sprite也叫CSS精灵图、CSS雪碧图,是一种网页图片应用处理方式。它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去 雪碧图一般会给一个完整的图片,主要利用background-position 属性设置背景图像的起始位置。 优点 减少图片的字…