2.3ORBSLAM3之相机模型与畸变模型

news2024/11/24 11:04:37

1.简介

主要内容:

1. 对SLAM中常见的相机模型进行介绍,包括针孔相机模型和鱼眼相机模型
2. 对每种相机模型的畸变模型进行介绍
3. 对VSLAM中常见的几种去畸变方法进行介绍
4. 对常见的几种相机标定方法进行总结

对于VSLAM来说关于相机投影模型和畸变模型暂时不需要了解过于深入,通常来说在VSLAM领域相机的投影模型主要分为针孔模型(Pinhole)全向模型(Omni)两种,相机的畸变模型分为切向径向畸(RanTan)等距畸变(Equidistant,EQUI)两种,也是ORBSLAM3中针对针孔相机和鱼眼相机使用的两种畸变模型。

每种相机模型又可以和畸变模型互相搭配,并对不同的搭配方式进行了命名:

  • MEI Camera: Omni + RanTan
  • Pinhole Camera: Pinhole + Rantan

下面将挨个对上述投影模型和畸变模型原理进行介绍。

参考链接:
[1]相机的成像模型(Pinhole + Omni)和畸变模型(RanTan, FOV, EQUI)

2 针孔相机投影模型和畸变模型

2.1 针孔相机投影模型

针孔相机投影模型本质上是根据小孔成像原理,基于相似三角形关系计算得到3D空间点在成像平面的坐标,通过将坐标系进行相应的平移和缩放,最终得到像素平面坐标。
在这里插入图片描述

O-x-y-z为相机坐标系,习惯上将z轴指向相机前方,x轴向右,y轴向下,O为摄像机的光心也是针孔模型中的针孔。现实世界的点P,经过小孔O投影后,落在物理成像平面O'-x'-y'上,成像点为P’。

世界坐标系中三维点 P = [ X , Y , Z ] T P = \left [ X, Y, Z \right ]^{T} P=[X,Y,Z]T 和像素坐标系中二维点 p = [ u , v ] T p = \left[u,v\right]^{T} p=[u,v]T 的关系为:
s p ~ = A [ R    t ] P ~ s\tilde{p}=A\left[R\space \space t\right]\tilde{P} sp~=A[R  t]P~
其中, s s s 为缩放因子(即 Z c Z_{c} Zc ),A为相机内参矩阵, [ R , t ] T \left[R,t\right]^{T} [R,t]T 为相机外参矩阵, m ~ \tilde{m} m~ M ~ \tilde{M} M~表示分别为m和M对应的齐次坐标系。

详细过程为:
在这里插入图片描述

1.世界坐标系到相机坐标系
在这里插入图片描述

2.相机坐标系到成像坐标系
根据三角形相似关系有:
在这里插入图片描述

整理得:
在这里插入图片描述

3.成像坐标系到像素坐标系

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

其中,

  • f为镜头焦距,单位为
  • α和β的单位为像素/米
  • fx,fy为x,y方向的焦距,单位为像素

最终,写成矩阵的形式为:
在这里插入图片描述

2.2 针孔相机畸变模型

普通相机畸变通常包括径向畸变切向畸变,如下图所示:
在这里插入图片描述

切向畸变表达式沿半径方向的偏移量,径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷,通常又分为桶性畸变和枕形畸变,表现在dr上即往图像的外面偏和往图像里面偏。
[ x d i s t o r t e d , y d i s t o r t e d ] T \left[x_{distorted},y_{distorted}\right]^{T} [xdistorted,ydistorted]T 是畸变后点的归一化坐标。

2.2.1 径向畸变

在这里插入图片描述

真实的摄像头使用的并不是针孔,它们使用的是能一次性聚焦大量光线的镜头,这使得其能迅速生成图像,但是,镜头仍会产生失真,光线通常会在摄像机镜头的边缘出现较大或较小幅度的弯曲,这会产生图像边缘扭曲的效果,因此,线条或者物体会比真实情况呈现出或多或少的弯曲。这种失真被称为径向畸变,是最常见的失真类型。
在这里插入图片描述

实际情况中我们常用r = 0处的泰勒级数展开的前几项来近似描述径向畸变,径向畸变后的归一化坐标为:
在这里插入图片描述

2.2.2 切向畸变

在这里插入图片描述

切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致(相机的组装过程中由于不能使得透镜和成像面严格平行),切向畸变需要两个额外的畸变参数来描述,切向畸变后的归一化坐标为:
在这里插入图片描述

其中, r 2 = x 2 + y 2 r^2 = x^2 + y^2 r2=x2+y2

对于相机坐标系中的一点P,我们能够通过5个畸变系数找到这个点在像素平面上的正确位置:
在这里插入图片描述

由于参数过多导致数值求解不稳定, 通常只使用 k 1 , k 2 , k 3 , k 4 , k 5 k_1,k_2,k_3,k_4,k_5 k1,k2,k3,k4,k5 。综上,我们一共需要5个畸变参数 ( k 1 , k 2 , k 3 , k 4 , k 5 ) \left(k_1,k_2,k_3,k_4,k_5\right) (k1,k2,k3,k4,k5) 来描述透镜畸变。将畸变后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置:
在这里插入图片描述

2.3 针孔相机投影过程总结

在这里插入图片描述

3.全向相机模型

参考链接:
[1]相机模型-Unified Camera Model

全向相机模型又被称为统一相机模型(UNIFIED PROJECTION MODEL),因为它既可以表示一般针孔相机投影过程,也可以表示广角相机(鱼眼相机)的投影模型。这个模型的本质其实是将原始的光心在光轴方向上进行移动,得到一个虚拟的光心,从而达到模拟畸变的目的。用这个模型可以模拟针孔相机的成像过程,也可以模拟广角以及鱼眼相机的成像过程。需要注意的是,在广角或鱼眼相机中,该模型不会完全模拟畸变过程,所以还需要搭配一些其他畸变模型,比如 相机模型–针孔相机投影(pinhole camera model)中讲的Brown畸变模型。

3.1 广角相机介绍

广角相机(omnidirectional camera): 有360度视野的相机,或视野能覆盖半个球或近似整个球的相机。根据镜头聚光方式的不同可以分为以下三种:

  1. Dioptric cameras:一组shaped lenses,如鱼眼镜头,可以得到大于180度视野;通过透镜来实现, 主要是折射。
  2. Catadioptric cameras:一个标准相机和一个面镜,在水平面可以提供360度视野,仰角方向大于100度;
  3. polydioptric camera:组合多个相机来重叠相机视野。
    在这里插入图片描述

3.2 全向相机投影模型

接下来结合示意图对投影模型进行详细说明。假设相机坐标系下的3D空间点 P = ( x , y , z ) P=\left(x,y,z\right) P=(x,y,z),将其归一化到以相机光心为中心的单位球面上 P s = ( x s , y s , z s ) P_{s}=\left(x_{s},y_{s},z_{s}\right) Ps=(xs,ys,zs).若无畸变的情况下,可以直接得到归一化坐标 p = ( x s z s , y s z s , 1 ) p=\left(\frac{x_{s}}{z_{s}},\frac{y_{s}}{z_{s}},1 \right) p=(zsxs,zsys,1),在有畸变的情况下,可以找到一个以虚拟光心(与原光心只存在光轴上的平移,设平移量为ξ)为原点的虚拟相机坐标系,那么此时 P s P_s Ps在虚拟相机坐标系下的坐标变为 ( x s , y s , z s + ξ ) \left(x_s,y_s,z_s+ξ \right) (xs,ys,zs+ξ),投影到成像平面中可以得到畸变后的归一化坐标 p d = ( x s z s + ξ , y s z s + ξ , 1 ) p_d=\left(\frac{x_s}{z_s+ξ},\frac{y_s}{z_s+ξ},1 \right) pd=(zs+ξxs,zs+ξys,1)
在这里插入图片描述

  1. 设相机坐标系下的3D空间点 P = ( x , y , z ) P=\left(x,y,z\right) P=(x,y,z),将其归一化到以相机为光心的单位球面上 P s = ( x s , y s , z s ) = ( x c ∥ P c ∥ , y c ∥ P c ∥ , z c ∥ P c ∥ ) P_{s}=\left(x_{s},y_{s},z_{s}\right)=\left (\frac{x_c}{\left \| P_c \right \| },\frac{y_c}{\left \| P_c \right \| },\frac{z_c}{\left \| P_c \right \| } \right ) Ps=(xs,ys,zs)=(Pcxc,Pcyc,Pczc).
  2. 转换到虚拟成像平面上可以得到 p = ( x p , y p , 1 ) = ( x s z s + ξ , y s z s + ξ , 1 ) p=\left(x_p,y_p,1 \right)=\left(\frac{x_s}{z_s+ξ},\frac{y_s}{z_s+ξ},1 \right) p=(xp,yp,1)=(zs+ξxs,zs+ξys,1).
  3. 对p添加畸变(如针孔相机畸变模型),得到包含畸变的归一化坐标 p d = ( x d , y d , 1 ) p_d = \left(x_d,y_d,1 \right) pd=(xd,yd,1).
  4. 根据针孔模型可以到像素坐标 u = f x x d + c x , v = f y y d + c y u=f_xx_d+c_x, v=f_yy_d+c_y u=fxxd+cx,v=fyyd+cy.

3.3 全向相机反投影模型

反投影就是已知图像平面的一点 p u v = ( u , v ) p_{uv}=\left(u,v \right) puv=(u,v)求解得到相机坐标系下的坐标 P c P_c Pc或者单位球坐标

  1. 设图像上存在某个点 p = ( u , v ) p=(u,v) p=(u,v).
  2. 根据内参得到归一化平面坐标 p d = ( u − c x f x , v − c y f y , 1 ) p_d=\left(\frac{u-c_x}{fx},\frac{v-c_y}{fy},1 \right) pd=(fxucx,fyvcy,1).
  3. 根据畸变模型进行去畸变处理,得到畸变前的归一化坐标 p u d = ( x u d , y u d , 1 ) p_{ud}=\left(x_{ud},y_{ud},1 \right) pud=(xud,yud,1).
  4. 将归一化坐标转换到相机坐标系下 P c = ( x u d , y u d , 1 − ξ ( r 2 + 1 ) ξ + 1 + r 2 ( 1 − ξ 2 ) ) P_c = \left (x_{ud},y_{ud},1-\frac{\xi \left(r^2+1 \right)}{\xi+\sqrt{1+r^2\left(1-\xi^2 \right)} } \right ) Pc=(xud,yud,1ξ+1+r2(1ξ2) ξ(r2+1))
  5. 将相机坐标系坐标转换为单位球坐标.

对于第4步相机坐标系3D点的z值计算过程如下:
对于上述全向相机投影模型图示,可以假设 O P s OP_s OPs上存在一点 P ′ = ( x d , y d , z ′ ) P'=\left(x_d,y_d,z' \right) P=(xd,yd,z),将其归一化后就是 P s P_s Ps,可见 P ′ P' P P s P_s Ps对应同一像素点。按照上述投影过程可以得到 p d p_d pd,即:
( x d z ′ + ξ z ′ 2 + r 2 , y d z ′ + ξ z ′ 2 + r 2 , 1 ) = ( x d , y d , 1 ) \left ( \frac{x_d}{z'+\xi \sqrt{z'^2+r^2} },\frac{y_d}{z'+\xi \sqrt{z'^2+r^2}},1 \right )=\left (x_d,y_d,1 \right ) (z+ξz′2+r2 xd,z+ξz′2+r2 yd,1)=(xd,yd,1)

从而:
z ′ + ξ z ′ 2 + r 2 = 1 z'+\xi \sqrt{z'^2+r^2}=1 z+ξz′2+r2 =1

解得:
z ′ = ξ 1 + r 2 ( 1 − ξ 2 ) − 1 ξ 2 − 1 z'=\frac{\xi \sqrt{1+r^2(1-\xi ^2)}-1}{\xi ^2-1} z=ξ21ξ1+r2(1ξ2) 1

4.常见去畸变方法

4.1 基于Opencv的去畸变方法

  1. 直接对整副图像进行remap
    对图像进行remap的操作在ros节点中实现,首先将带有畸变信息的图像根据标定的参数对整副图像进行映射得到去畸变后的图像,然后再送入SLAM系统。

对于EuRoC这种图像带有畸变信息的数据集,一般采用该操作。对于zed,Realsense相机以及kitty数据集,图像本身是已经矫正过得,无需去畸变操作。

  1. 只对特征点进行去畸变
    ORBSLAM3中对特征点去畸变在构造Frame时完成,基于OpenCV函数cv::undistortPoints()实现,关键部分代码如下:
// 将mat变为N行4列,前两列为含有畸变的坐标,后两列为对应去畸变坐标
mat=mat.reshape(2);
// 参数依次为:输入矩阵,输出矩阵,相机内参矩阵,畸变系数,R参数是用在双目里的单目里置为空矩阵,相机内参 
cv::undistortPoints(mat,mat, static_cast<Pinhole*>(mpCamera)->toK(),mDistCoef,cv::Mat(),mK);
mat=mat.reshape(1);

4.2 逐渐逼近式去畸变方法

参考链接:https://blog.csdn.net/qq_33733356/article/details/124356158
畸变的程度越靠近图像边缘越高,这点是VINS中去畸变的主要依据思想。VINS采用一种逐渐逼近式去畸变方法.
在这里插入图片描述

根据畸变强度越靠近图像边缘越大 AA’ > BB’ > CC’

已知含有畸变的A'坐标,需要求出发生畸变前的真实坐标A
根据畸变公式可以由真实坐标得到包含畸变坐标是比较容易计算的,反之要复杂很多。
因此VINS中将已知的A'当做真实的坐标B,通过畸变公式得到畸变后的B'。得到畸变强度(近似表示)BB',从A'移动BB',得到更加靠近AC点。然后以C继续推导出更靠近A点的D。反复迭代,即可得到在接受范围内无限靠近A的点。

5.常见相机标定方法和标定工具

目前使用过的相机标定工具主要有以下几种:

  1. Kalibr工具
  2. 基于Opencv的标定
  3. 基于ROS的标定

目前来说基于ROS的标定感觉效果最好,可以实现单目和双目相机的标定。

对于相机和IMU的联合标定可以使用Kalibr工具,或者使用港科大imu_utils工具标定好IMU数据再进行联合标定。

参考链接:
[1]使用kalibr标定工具进行单目相机和双目相机的标定
[2]基于opencv进行双目相机的标定
[3]相机和IMU联合标定参考链接notes
[4]ROS下采用camera_calibration进行单目相机标定
[5]ROS下采用camera_calibration进行双目相机标定

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

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

相关文章

Mybatis如何解决循环依赖问题

1、Mybatis如何解决循环依赖问题 mybatis的循环依赖&#xff0c;即是mapper.xml里面的A查询的resultMap包含了B属性&#xff08;B属性是通过子查询得到的&#xff09;&#xff0c;而B属性中又包含了A&#xff08;B查询的resultMap中又包含了A的查询&#xff09;&#xff0c;就…

【系统架构】第五章-软件工程基础知识(软件测试、净室软件工程、基于构件的软件工程、 软件项目管理)

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 软件测试 一、测试方法 以测试过程中程序执行状态为依据可分为静态测试&#xff08;ST&#xff09;和动态测试&#xff08;DT&#xff09; 以具体实现算法细节和系统内部结构的相关情况为根据…

【Leetcode60天带刷】day35——452. 用最少数量的箭引爆气球,435. 无重叠区间,763.划分字母区间

​ 题目&#xff1a; 452. 用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着…

SuperMap GIS基础产品云GIS FAQ集锦(3)

SuperMap GIS基础产品云GIS FAQ集锦&#xff08;3&#xff09; 【iServer】如何自定义iServer服务能力文档中提供者的信息&#xff1f; 【解决办法】操作步骤如下&#xff1a; 1&#xff09;进入iServer管理界面&#xff0c;依次点击服务-服务接口&#xff1b; 2&#xff09;点…

PL SQL结构化编程

第一章、存储过程 1.1、概念 存储过程是一个命名的程序块&#xff0c;包括过程的名称、过程使用的参数&#xff0c;以及过程执行的操作。 &#xff08;类似于java中的一种函数&#xff0c;但是存在区别&#xff09; 可以指定输入参数&#xff0c;和输出参数。 1.2、创建存…

Elasticsearch 地理空间计算

地理位1置搜索&#xff1a;使用查询API进行搜索 1、Geo Distance Query Geo Distance Query是在给定的距离范围内搜索数据的查询。例如&#xff0c;可以搜索给定地理位置附近指定距离内的所有文档。 GET /my_index/_search {"query": {"bool" : {"fi…

基于Python+Django+mysql+html图书管理系统V2.0

基于PythonDjangomysqlhtml图书管理系统V2.0 一、系统介绍二、功能展示1.图书查询2.图书添加3.图书修改4.图书删除5.数据库 三、其它系统四、获取源码 一、系统介绍 该系统实现了图书查询、图书添加&#xff0c;图书修改、图书删除 运行环境&#xff1a;python3.7/mysql5.7以…

STM32单片机(八)DMA直接存储器存取----第二节:DMA直接存储器存取练习1(DMA数据转运)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

TiDB 7.1资源管控和Oceanbase 4.0多租户使用对比

作者&#xff1a; seiang 原文来源&#xff1a; https://tidb.net/blog/a33d3498 一、背景 TiDB和Oceanbase都是非常优秀的国产分布式数据库&#xff1b;公司从2021年第一套生产业务的TiDB集群落地&#xff0c;随着第一套TiDB生产集群的落地&#xff0c;主要面向不同的业务…

[230607] 阅读TPO69汇总|9:00-10:00

目录 TPO6601 5 事实信息题 7 推理题 9 句子插入题 10 小结题 TPO6602 5 修辞目的题 7 词汇题 tame 10 小结题 TPO6603 TPO6601 5 事实信息题 做题技巧&#xff1a;实词对应 定位在&#xff08;1&#xff09;spread the tines of their tongue apart when they ret…

Greenplum数据库优化器——新Path类型CdbMotionPath

Path表示了一种可能的计算路径&#xff08;比如顺序扫描或哈希关联&#xff09;&#xff0c;更复杂的路径会继承Path结构体并记录更多信息以用于优化。Greenplum为Path结构体(src/include/nodes/relation.h/Path)新加CdbPathLocus locus字段&#xff0c;用于表示结果元组在当前…

ConstraintLayout使用指南

ConstraintLayout ConstraintLayout 可让您使用扁平视图层次结构&#xff08;无嵌套视图组&#xff09;创建复杂的大型布局。它与 RelativeLayout 相似&#xff0c;其中所有的视图均根据同级视图与父布局之间的关系进行布局&#xff0c;但其灵活性要高于 RelativeLayout&#x…

【读书笔记】《软件工程导论》

目录 一、软件工程概述 二、启动阶段 三、计划阶段 四、实施阶段 五、收尾阶段 一、软件工程概述 软件危机&#xff1a;在计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的产生与自身的特点有关&#xff0c;还与软件开发、管理的方法不正确有关。 软件危…

ELK 多用户登录

先搭建ELK集群环境 请移步至&#xff1a;FilebeatELK 搭建日志收集平台 ES开启TLS加密通信与身份认证 进入ES集群任意一台安装目录&#xff0c;生成ca证书 这里最好使用ES启动账号操作&#xff0c;证书生成过程中一直回车到完成&#xff0c;不要去输入密码。 # 生成CA证书 bi…

UNIX网络编程卷一 学习笔记 第二十一章 多播

单播地址标识单个IP接口&#xff0c;广播地址标识某个子网的所有IP接口&#xff0c;而多播地址标识一组IP接口。单播和广播是寻址方案的两个极端&#xff08;要么单个要么全部&#xff09;&#xff0c;多播则意在两者之间提供一种折衷方案。多播数据报只应由对它感兴趣的接口接…

【软考网络管理员】2023年软考网管初级常见知识考点(8)-广域网技术

涉及知识点 广域网交换方式&#xff0c;广域网流量控制&#xff0c;广域网链路层协议&#xff0c;广域网传输标准&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&a…

MATLAB——Matlab R2018b软件安装教程

Matlab R2018b软件安装教程 1.选中【Matlab R2018b】压缩包&#xff0c;鼠标右击选择【解压到Matlab R2018b】。 2.双击打开【Matlab R2018b】文件夹。 3.双击打开【R2018b_win64】文件夹。 4.选中【setup】可执行文件&#xff0c;鼠标右击选择【以管理员身份运行】。 5.选择【…

AQS源码分析——以ReentrantLock为例

AQS自身属性&#xff1a; private transient volatile Node head; private transient volatile Node tail; private volatile int state; Node属性&#xff1a; // 共享 static final Node SHARED new Node(); // 独占 static final Node EXCLUSIVE null; // 线程被…

360手机黑科技“位置穿越”功能修复 360手机位置穿越不能用了 360手机刷机

360手机黑科技“位置穿越”功能修复 360手机位置穿越不能用了 360手机刷机 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360刷机包360手机刷机&#xff1a;360rom.github.io 【前言】 360手机&#xff0c;内置的黑科技“位置穿越”&#xff0c;引用高德地图&#xff…

基于NSGA-II算法的多目标多旅行商问题建模求解

基于NSGA-II算法的多目标多旅行商问题建模求解 1引言2多目标多旅行商问题3多目标遗传算法NSGA-II3.1 编码3.2选择&#xff08;锦标赛选择&#xff09;3.3 交叉&#xff08;顺序交叉&#xff09;3.4 变异3.5快速非支配排序3.5.1符号说明3.5.2快速非支配排序[^7][^6]3.5.3快速非支…