视觉SLAM第五讲

news2024/9/23 9:28:44

本讲将讨论“机器人如何观测外部世界”,也就是观测方程部分。而在以相机为主的视觉SLAM中,观测主要是指相机成像的过程。

三维世界中的一个物体反射或发出的光线,穿过相机光心后,投影在相机的成像平面上。相机的感光器件接收到光线后,产生测量值,就得到了像素,形成了我们见到的照片。

相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程能够用一个几何模型进行描述。这个模型有很多种,其中最简单的称为针孔模型。

在本讲中我们用一个简单的针孔相机模型来对这种映射关系进行建模。同时,由于相机镜头上的透镜的存在,使得光线投影到成像平面的过程中会产生畸变。因此,我们使用针孔和畸变两个模型来描述整个投影过程,这两个模型构成相机的内参数

针孔相机模型

在这里插入图片描述

现在来对这个简单的针孔模型进行几何建模。设 O − x − y − z O-x-y-z Oxyz相机坐标系,习惯上我们让 z z z轴指向相机前方, x x x向右, y y y向下(此图我们应该站在左侧看右侧)。 O O O为摄像机的光心,也是针孔模型中的针孔。现实世界的空间点 P P P,经过小孔投影 O O O之后,落在物理成像平面 O ′ − x ′ − y ′ O'-x' -y' Oxy上,成像点为 P ′ P' P。设 P P P的坐标为 [ X , Y , Z ] T [X,Y,Z]^{T} [X,Y,Z]T P ′ P' P [ X ′ , Y ′ , Z ′ ] T [X',Y',Z']^{T} [X,Y,Z]T,并且设物理成像平面到小孔的距离为 f f f(焦距)。为了让模型更符合实际,我们可以等价地把成像平面对称地放到相机前方,和三维空间点一起放在摄像机坐标系的同一侧。

在这里插入图片描述

那么,根据三角形相似关系,有:

Z f = X X ′ = Y Y ′ \frac{Z}{f}=\frac{X}{X^{\prime}}=\frac{Y}{Y^{\prime}} fZ=XX=YY

X ′ , Y ′ X',Y' X,Y放到等式左侧,整理得:

X ′ = f X Z Y ′ = f Y Z \begin{aligned} & X^{\prime}=f \frac{X}{Z} \\ & Y^{\prime}=f \frac{Y}{Z}\end{aligned} X=fZXY=fZY

还需要在成像平面上对像进行采样量化。为了描述传感器将感受到的光线转换成图像像素的过程,我们设在物理成像平面上固定着一个像素平面 o − u − v o-u-v ouv。我们在像素平面得到了 P ′ P' P的像素坐标: [ u , v ] T [u,v]^{T} [u,v]T

像素坐标系通常的定义方式是:原点 o ′ o' o位于图像的左上角, u u u轴向右与 x x x轴平行, v v v轴向下与 y y y轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。我们设像素坐标 u u u在轴上缩放了 α \alpha α倍,在 v v v上缩放了 β \beta β倍。同时,原点平移了 [ c x , c y ] T [c_{x} ,c_{y} ]^{T} [cx,cy]T。那么, P ′ P' P的坐标与像素坐标 [ u , v ] T [u,v]^{T} [u,v]T的关系为:

{ u = α X ′ + c x v = β Y ′ + c y \left\{\begin{array}{l}u=\alpha X^{\prime}+c_x \\ v=\beta Y^{\prime}+c_y\end{array}\right. {u=αX+cxv=βY+cy

代入上式 X ′ , Y ′ X',Y' X,Y,并把 α f \alpha f αf合并成 f x f_x fx,把 β f \beta f βf合并成 f y f_y fy,得:

{ u = f x X Z + c x v = f y Y Z + c y \left\{\begin{array}{l}u=f_x \frac{X}{Z}+c_x \\ v=f_y \frac{Y}{Z}+c_y\end{array}\right. {u=fxZX+cxv=fyZY+cy

把该式写成矩阵形式会更加简洁,不过左侧需要用到齐次坐标,右侧则是非齐次坐标:

( u v 1 ) = 1 Z ( f x 0 c x 0 f y c y 0 0 1 ) ( X Y Z ) ≜ 1 Z K P \left(\begin{array}{l}u \\ v \\ 1\end{array}\right)=\frac{1}{Z}\left(\begin{array}{ccc}f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1\end{array}\right)\left(\begin{array}{l}X \\ Y \\ Z\end{array}\right) \triangleq \frac{1}{Z} \boldsymbol{K} \boldsymbol{P} uv1 =Z1 fx000fy0cxcy1 XYZ Z1KP

该式中, K \boldsymbol{K} K称为相机的内参数矩阵。通常情况下,相机的内参在出厂时已固定,不会在使用过程中发生变化。有些厂商会提供相机的内参,而有时需要用户自行标定以确定内参。

有内参,自然也有外参。由于相机在运动,上式中使用的相机坐标系下的坐标 P \boldsymbol{P} P,其实是由相机在当前位姿下的世界坐标(记为 P w \boldsymbol{P_w} Pw)转换而来。相机的位姿由旋转矩阵 R \boldsymbol{R} R平移向量 t \boldsymbol{t} t描述。所谓外参是将世界坐标系中的点转换到相机坐标系的外部参数。

Z P u v = Z [ u v 1 ] = K ( R P w + t ) = K T P w Z \boldsymbol{P}_{u v}=Z\left[\begin{array}{l}u \\ v \\ 1\end{array}\right]=\boldsymbol{K}\left(\boldsymbol{R} \boldsymbol{P}_w+\boldsymbol{t}\right)=\boldsymbol{K} \boldsymbol{T} \boldsymbol{P}_w ZPuv=Z uv1 =K(RPw+t)=KTPw

投影过程还可以从另一个角度来看。我们可以把一个世界坐标点先转换到相机坐标系,再除掉它最后一维的数值(即该点距离相机成像平面的深度),这相当于把最后一维进行归一化处理,得到点 P P P在相机归一化平面上的投影:

( R P w + t ) = [ X , Y , Z ] T ⏟ 相机坐标  → [ X / Z , Y / Z , 1 ] T ⏟ 归一化坐标  \left(\boldsymbol{R} \boldsymbol{P}_w+\boldsymbol{t}\right)=\underbrace{[X, Y, Z]^{\mathrm{T}}}_{\text {相机坐标 }} \rightarrow \underbrace{[X / Z, Y / Z, 1]^{\mathrm{T}}}_{\text {归一化坐标 }} (RPw+t)=相机坐标  [X,Y,Z]T归一化坐标  [X/Z,Y/Z,1]T

归一化坐标可看成相机前方 z = 1 z=1 z=1的平面上的一个点,这个 z = 1 z=1 z=1平面也称为归一化平面。归一化坐标再左乘内参就得到了像素坐标,所以我们可以把像素坐标 [ u , v ] T [u,v]^{T} [u,v]T看成对归一化平面上的点进行量化测量的结果。

畸变

为了获得好的成像效果,我们在相机的前方加了透镜。透镜的加入对成像过程中光线的传播会产生新的影响:一是透镜自身的形状对光线传播的影响,二是在机械组装过程中,透镜和成像平面不可能完全平行,这也会使得光线穿过透镜投影到成像面时的位置发生变化。

由透镜形状引起的畸变称为径向畸变。由于实际加工制作的透镜往往是中心对称的,这使得不规则的畸变通常径向对称。它们主要分为两大类:桶形畸变枕形畸变

在这里插入图片描述

除了透镜的形状会引入径向畸变外,在相机的组装过程中由于不能使透镜成像平面严格平行也会引入切向畸变

在这里插入图片描述

通常假设径向畸变多项式关系(数学建模),即:

x distorted  = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y distorted  = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \begin{aligned} & x_{\text {distorted }}=x\left(1+k_1 r^2+k_2 r^4+k_3 r^6\right) \\ & y_{\text {distorted }}=y\left(1+k_1 r^2+k_2 r^4+k_3 r^6\right)\end{aligned} xdistorted =x(1+k1r2+k2r4+k3r6)ydistorted =y(1+k1r2+k2r4+k3r6)

其中 [ x distorted  , y distorted  ] T [x_{\text {distorted }},y_{\text {distorted }}]^T [xdistorted ,ydistorted ]T是畸变后点的归一化坐标。另一方面,对于切向畸变,可以使用另外的两个参数 p 1 , p 2 p_1,p_2 p1,p2来进行纠正:

x distorted  = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y distorted  = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{aligned} & x_{\text {distorted }}=x+2 p_1 x y+p_2\left(r^2+2 x^2\right) \\ & y_{\text {distorted }}=y+p_1\left(r^2+2 y^2\right)+2 p_2 x y\end{aligned} xdistorted =x+2p1xy+p2(r2+2x2)ydistorted =y+p1(r2+2y2)+2p2xy

因此,对于相机坐标系中的一点,我们能够通过5个畸变系数找到这个点在像素平面上的正确位置:

  1. 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [ x , y ] T [x,y]^{T} [x,y]T

  2. 对归一化平面上的点计算径向畸变和切向畸变

    { x distorted  = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y distorted  = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \left\{\begin{array}{l}x_{\text {distorted }}=x\left(1+k_1 r^2+k_2 r^4+k_3 r^6\right)+2 p_1 x y+p_2\left(r^2+2 x^2\right) \\ y_{\text {distorted }}=y\left(1+k_1 r^2+k_2 r^4+k_3 r^6\right)+p_1\left(r^2+2 y^2\right)+2 p_2 x y\end{array}\right. {xdistorted =x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted =y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy

  3. 将去畸变后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置。

    { u = f x x distorted  + c x v = f y y distorted  + c y \left\{\begin{matrix}u=f_{x}x_{\text {distorted }}+c_{x} \\v=f_{y} y_{\text {distorted }}+c_{y} \end{matrix}\right. {u=fxxdistorted +cxv=fyydistorted +cy

小结

最后,我们小结一下单目相机的成像过程:

  1. 首先,世界坐标系下有一个固定的点 P P P,世界坐标为 P w P_{w} Pw
  2. 由于相机在运动,它的运动由 R , t R,t R,t或变换矩阵 T ∈ S E ( 3 ) T\in \mathrm{SE} \left ( 3 \right ) TSE(3)描述。 P P P的相机坐标为 P ~ c = R P w + t \tilde{P} _{c} =RP_{w} +t P~c=RPw+t
  3. 这时的 P ~ c \tilde{P} _{c} P~c的分量为 X , Y , Z X,Y,Z X,Y,Z,把它们投影到归一化平面 Z = 1 Z=1 Z=1上,得到 P P P的归一化坐标: P c = [ X / Z , Y / Z , 1 ] T P_c=[X/Z,Y/Z,1]^T Pc=[X/Z,Y/Z,1]T
  4. 有畸变时,根据畸变参数计算 P c P_c Pc去畸变后的坐标 P c ′ P_c^{'} Pc
  5. 最后, P c ′ P_c^{'} Pc经过内参后,对应到它的像素坐标: P u v = K P c ′ P_{uv}=KP_c^{'} Puv=KPc

综上所述,我们一共谈到了四种坐标:世界坐标、相机坐标、归一化坐标和像素坐标。

双目相机模型

针孔相机模型描述了单个相机的成像模型。然而,仅根据一个像素,我们无法确定这个空间点的具体位置。这是因为,从相机光心到归一化平面连线上的所有点,都可以投影至该像素上。只有当 P P P的深度确定时(比如通过双目或RGB-D相机),我们才能确切地知道它的空间位置。如图5-5所示。

在这里插入图片描述

双目相机的原理是通过同步采集左右相机的图像,计算视差来估计每个像素的深度。双目相机通常由水平放置的左眼和右眼相机组成,这两个相机可以被视为针孔相机。由于它们水平放置,两个相机的光圈中心都位于 x x x 轴上。两者之间的距离称为基线(Baseline,记作 b b b),是双目相机的重要参数。

现在,考虑一个空间点 P P P,它在左眼相机和右眼相机各成一像,记作 P L , P R P_{L},P_{R} PL,PR。由于相机基线的存在,这两个成像位置是不同的。理想情况下,由于左右相机只在 x x x轴上有位移,因此 P P P的像也只在 x x x轴(对应图像的 u u u轴)上有差异。记它的左侧坐标为 u L u_L uL,右侧坐标为 u R u_R uR,几何关系如图5-6右侧所示。根据 △ P P L P R \bigtriangleup PP_{L}P_{R} PPLPR △ P O L O R \bigtriangleup PO_{L}O_{R} POLOR的相似关系,有:

z − f z = b − u L + u R b \frac{z-f}{z}=\frac{b-u_{L}+u_{R}}{b} zzf=bbuL+uR

稍加整理,得:

z = f b d , d ≜ u L − u R z=\frac{f b}{d}, \quad d \triangleq u_{L}-u_{R} z=dfb,duLuR

在这里插入图片描述

其中 d d d定义为左右图的横坐标之差,称为视差(Disparity)。

RGB-D 相机模型

相比于双目相机通过视差计算深度的方式,RGB-D相机的做法更为“主动”一些,它能够主动测量每个像素的深度。目前的RGB-D相机按原理可分为两大类(见图5-7):

  1. 通过红外结构光(StructuredLight)来测量像素距离的。例子有Kinect1代、ProjectTango1代、Intel RealSense 等。
  2. 通过飞行时间法(Time-of-flight,ToF)原理测量像素距离的。例子有Kinect2代和一些现有的ToF传感器等。

在这里插入图片描述

无论是哪种类型,RGB-D相机都需要向探测目标发射一束光线(通常是红外光)。在结构光原理中,相机根据返回的结构光图案,计算物体与自身之间的距离。而在ToF原理中,相机向目标发射脉冲光,然后根据发送到返回之间的光束飞行时间,确定物体与自身之间的距离。ToF原理和激光传感器十分相似,只不过激光是通过逐点扫描来获取距离,而ToF相机则可以获得整个图像的像素深度,这也正是RGB-D相机的特点。

RGB-D相机能够实时地测量每个像素点的距离。但是,由于这种发射−接收的测量方式,其使用范围比较受限。用红外光进行深度值测量的RGB-D相机,容易受到日光或其他传感器发射的红外光干扰,因此不能在室外使用。在没有调制的情况下,同时使用多个RGB-D相机时也会相互干扰。对于透射材质的物体,因为接收不到反射光,所以无法测量这些点的位置。此外,RGB-D相机在成本、功耗方面,都有一些劣势。

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

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

相关文章

主机加固是什么?主机加固与产线工控安全关系

1. 需求背景 随着工业4.0的发展,生产线日益智能化,生产网已经发展成一个复杂的计算机环境。尽管这些网络通常进行了物理隔离,但在实际操作中仍需要与外部进行数据交互。这种交互可能导致病毒和恶意软件的入侵,威胁工控主机和产线…

k8s分布式存储-ceph

文章目录 Cephdeploy-ceph部署1.系统环境初始化1.1 修改主机名,DNS解析1.2 时间同步1.3 配置apt基础源与ceph源1.4关闭selinux与防火墙1.5 **创建** ceph **集群部署用户** cephadmin1.6分发密钥 2. ceph部署2.1 **安装** ceph 部署工具2.2 **初始化** mon **节点**…

计算机毕业设计选题推荐-小型民营加油站管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

使用 Java Swing 创建一个最大公约数计算器 GUI 应用

使用Java语言,设计一个程序,实现求取两个正整数的最大公约数。 比较基础的一个Java小程序。 1、效果展示 2、程序代码 package demo; import javax.swing.*; import java.awt.*;

用python连接mysql的方法

如何将个人主机上的mysql服务发布到公网:frp内网穿透 用python连接mysql的方法 方法一: 1.设置清华镜像站:从国内下载安装包,提高下载和安装速度 pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simp…

航向角、前轮转角、偏航角的区别及其在MPC中的使用

目录 前言一、概念解析二、三种角度在MPC中的应用三、总结四、MPC算法流程 前言 航向角、偏航角、前轮转角是车辆控制中描述方向的关键概念。本文将简要介绍它们的区别及在MPC(模型预测控制)中的应用。 一、概念解析 φ 为车体的航向角; δ…

[ACP云计算]组件介绍

一、IaaS、PaaS、SaaS 二、交换机 三、VPC 四、ECS 云服务器ECS(Elastic Compute Service)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期…

jupyter项目使用Anaconda环境内核

1、创建虚拟环境 conda create --name myjupyter python3.7 2、进入虚拟环境 conda activate myjupyter 3、切换到自己jupyter notebook项目想在的目录 E: cd E:\first\project\jupyter\jupyter01 4、安装IPython内核包,这是Jupyter Notebook使用Python内核所必需的…

【MySQL 03】库的操作 (带思维导图)

前置:之后的所有的 SQL 语句中,凡是被中括号 [ ] 括起来的均为可选项。 🌈 一、创建数据库 数据库创建语句 创建数据库本质就是在 /var/lib/mysql 中创建一个目录。 if not exists:如果指定数据库不存在则创建该数据库&#xf…

[Java]面向对象-static继承

Static static表示静态,是Java中的一个修饰符,可以修饰成员方法、成员变量 静态变量: 被static修饰的成员变量,叫静态变量 特点: 被该类所有对象共享 调用方式:1.类名调用 2.对象名调用 静态方法&…

PyFluent入门之旅(8) PyFluent API 分类与区别

PyFluent提供了两种主要的API来与Ansys Fluent进行交互: Settings APITUI API 通过这两种接口方式,可以控制 Ansys Fluent 的各个方面,包括从网格生成到后处理的所有操作。 分类 Settings API pyFluent 的 Settings API类似于 Ansys Flu…

线性表——数据结构

线性表 文章目录 线性表线性表的定义和基本操作线性表的定义线性表的基本操作 线性表的顺序表示顺序表的定义顺序表的实现——静态分配顺序表的实现——动态分配顺序表的特点 线性表的定义和基本操作 线性表的定义 线性表(Linear List)的定义 ​ 线性…

略谈set与map的pair封装与进入哈希

引子:之前我们讲了红黑树的自实现,与小小的接口实现,那set与map的pair封装是如何实现的呢?,今天我们来一探究竟,而且我们也要进入新章节--哈希 对于operator--()的封装: 注意:牢记思…

动手学深度学习V2每日笔记(批量归一化、ResNet)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1Uv411G71b/spm_id_fromautoNext&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d https://cv.gluon.ai/model_zoo/classification.html 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不…

【OpenHarmony】openharmony移植到RK3568------搭建开发环境

一、关于OpenHarmony OpenHarmony是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促…

各种高端链游 区块链游戏 休闲小游戏DAPP开发

【西游闯关】-高端区块链3D手游 【我朝有马】-高端区块链3D手游 【弹弹岛2】-高端区块链3D手游

FiddlerCharles请求包导入Postman教程

前言 晓杰因开发需要经常需要使用抓包工具进行抓包然后使用POSTMAN测试,每次复制都很麻烦,就想着如何直接抓包工具中导出,postman导入! Fiddler 这个有2个方案,第一个方案是因为第二个方案发现的! 方案…

html+css+js网页设计 找法网2个页面(带js)ui还原度百分之90

htmlcssjs网页设计 找法网2个页面(带js)ui还原度百分之90 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑…

私域流量运营中的精准量化与开源AI智能名片O2O商城小程序的应用深度解析

摘要:在数字化时代,私域流量作为品牌直接与消费者建立联系的重要桥梁,其管理和运营策略直接影响着企业的市场竞争力。本文深入探讨了私域流量运营的底层逻辑——精准量化运营,详细分析了其核心要素及实现路径。同时,结…

Java学习篇(一)| 如何生成分布式全局唯一ID

Java学习篇(一)| 如何生成分布式全局唯一ID 一、使用场景二、常用方法1、UUID (尽量不要用)2、数据库自增 (用的最多-但不适合做分布式ID)3、Redis 生成ID (可用)1、原因2、通过代码…