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

这篇具有很好参考价值的文章主要介绍了2.3ORBSLAM3之相机模型与畸变模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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空间点在成像平面的坐标,通过将坐标系进行相应的平移和缩放,最终得到像素平面坐标。
2.3ORBSLAM3之相机模型与畸变模型

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对应的齐次坐标系。

详细过程为:
2.3ORBSLAM3之相机模型与畸变模型

1.世界坐标系到相机坐标系
2.3ORBSLAM3之相机模型与畸变模型

2.相机坐标系到成像坐标系
根据三角形相似关系有:
2.3ORBSLAM3之相机模型与畸变模型

整理得:
2.3ORBSLAM3之相机模型与畸变模型

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

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

其中,

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

最终,写成矩阵的形式为:
2.3ORBSLAM3之相机模型与畸变模型

2.2 针孔相机畸变模型

普通相机畸变通常包括径向畸变切向畸变,如下图所示:
2.3ORBSLAM3之相机模型与畸变模型

切向畸变表达式沿半径方向的偏移量,径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷,通常又分为桶性畸变和枕形畸变,表现在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 径向畸变

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

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

实际情况中我们常用r = 0处的泰勒级数展开的前几项来近似描述径向畸变,径向畸变后的归一化坐标为:
2.3ORBSLAM3之相机模型与畸变模型

2.2.2 切向畸变

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

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

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

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

由于参数过多导致数值求解不稳定, 通常只使用 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.3ORBSLAM3之相机模型与畸变模型

2.3 针孔相机投影过程总结

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

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:组合多个相机来重叠相机视野。
    2.3ORBSLAM3之相机模型与畸变模型

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)
2.3ORBSLAM3之相机模型与畸变模型

  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采用一种逐渐逼近式去畸变方法.
2.3ORBSLAM3之相机模型与畸变模型

根据畸变强度越靠近图像边缘越大 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数据再进行联合标定。

对于基于ROS的双目相机标定见博客《使用ROS功能包camera_calibration进行单目相机和双目相机的内参和外参标定》文章来源地址https://www.toymoban.com/news/detail-510749.html

到了这里,关于2.3ORBSLAM3之相机模型与畸变模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ubuntu18.04安装灭霸SLAM:ORBSLAM3

    终于有时间好好整理一下最近跑通ORB-SLAM3的一些笔记了,在xavier上安装了一下谷歌拼音输入法,具体可以参考:AGX Xavier安装中文输入法 先说结论: 1)不建议安装最新版,安装时有许多坑需要填,即使填好了,运行时依然会有很多坑,比如依赖于最新版的opencv4.4等等,最新版

    2023年04月09日
    浏览(53)
  • Windows10使用OrbSlam3-VS2017-VC12版本

    OrbSlam3集成了IMU信息,可用以VIO融合重建。参考这哥们的地址,依据GitHub上的介绍git clone --recursive 之后编译即可 ORBSLAM3 Win10 VS2017 配置简明指南_滥觞LanShang的博客-CSDN博客_orbslam3 windows Git地址:GitHub - chanho-code/ORB-SLAM3forWindows: ORB-SLAM3 for Windows Platform 编译过程: 1.使用sourcetree

    2024年02月09日
    浏览(39)
  • 机器视觉【1】相机的成像(畸变)模型

    很久没写文章,简单唠一唠。 不知道巧合还是蜀道同归,部门领导设定了些研究课题,用于公司部门员工的超前发展,该课题是“2D to 3D的三维重建”,这一块刚好是我个人看中的一个大方向,所以就有了这一系列的文章。其实我还发现不少同学是没搞清楚 什么是 机器视觉

    2024年02月03日
    浏览(27)
  • 手把手带你死磕ORBSLAM3源代码(三十)Tracking.cc PreintegrateIMU介绍

    目录 一.前言 二.代码 2.1 完整代码 2.2 预积分技术     Tracking::PreintegrateIMU() 是 Tracking 类中的一个成员函数,用于对从IMU(Inertial Measurement Unit,惯性测量单元)获取的数据进行预积分处理。预积分是视觉-惯性里程计(VIO)中的一个关键技术,它允许将多个IMU测量值整合到一

    2024年02月03日
    浏览(38)
  • 手把手带你死磕ORBSLAM3源代码(二十九)Tracking.cc GrabImageMonocular介绍

    目录 一.前言 二.代码 2.1 完整代码 2.2 单目相机估计深度结构     Tracking::GrabImageMonocular 是 Tracking 类中的另一个成员函数,用于从单目相机(Monocular Camera)捕获的图像中提取信息,创建一个新的帧ÿ

    2024年02月02日
    浏览(34)
  • orbslam3 生成标定板rosrun kalibr kalibr_create_target_pdf --type

    小师妹要做相机视觉标定,需要制作棋盘格,无奈其电脑有些卡,对此毫无经验的博主从头开始安装(此前博主已经安装了ROS环境),如果没有安装ROS环境,请参照以下链接: 安装Kalibr请参考,按照次教程安装过程build一次过。 之后cd到Kalibr的目录下进行测试时,主要遇到的

    2024年02月16日
    浏览(35)
  • 手把手带你死磕ORBSLAM3源代码(三十四)Tracking.cc MonocularInitialization编辑

    目录 一.前言 二.代码 2.1完整代码 2.2 单目视觉跟踪初始化     这段代码是一个名为 MonocularInitialization 的函数,它属于 Tracking 类。从函数名称和代码内容来看,这个函数主要用于单目视觉跟踪的初始化过程。以下是代码的详细解读:     首先,函数检查一个名为 m

    2024年02月02日
    浏览(33)
  • 【视觉SLAM入门】3. 相机模型,内外参,畸变推导

    本节讨论围绕这个问题展开 机器人如何观测外部世界? quadlargetextcolor{red}{机器人如何观测外部世界?} 机器人如何观测外部世界? 注意: 的研究的目的是为了求出点在世界坐标系下的信息,也就是    P w ;P_w P w ​ 是要求出来的量。 以针孔相机为例,我们来推导内参的

    2024年02月13日
    浏览(46)
  • 5.如何利用ORBSLAM3生成可用于机器人/无人机导航的二维/三维栅格地图--以octomap为例

            这里我们用ROS自带的安装方式即可:         如上图就是安装成功了:         如果安装失败了,尝试用小鱼ROS换一下源再去安装:         一些官方的文档如下,大家感兴趣可以学习一下: https://octomap.github.io/octomap/doc/index.html#gettingstarted_sec https://oct

    2024年02月03日
    浏览(27)
  • ORBSLAM3 --- 优化(一):g2o优化中的节点与边的定义-G2oTypes.h、G2oTypes.cc解析

    目录 1.节点类 1.1 ImuCamPose类 1.1.1 类的定义 1.1.2  ImuCamPose::ImuCamPose 1.1.3  ImuCamPose::SetParam 1.1.4  ImuCamPose::isDepthPositive 1.2 VertexPose类 1.2.1 节点定义 1.2.2 ImuCamPose::Update函数解析 1.3 VertexPose4DoF类 1.3.1 节点定义 1.3.2  ImuCamPose::UpdateW函数解析 1.4 速度节点VertexVelocity 1.4.1 节点定义 1.5

    2024年02月03日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包