《视觉SLAM十四讲》-- 相机与图像

news2024/11/26 5:57:36

04 相机与图像

4.1 相机模型

4.1.1 针孔相机模型

针孔模型描述了一束光线通过针孔后,在针孔背面投影成像的关系(类似小孔成像原理)。

在这里插入图片描述

根据相似三角关系

Z f = − X X ′ = − Y Y ′ (3-1) \frac{Z}{f}=-\frac{X}{X^{\prime}}=-\frac{Y}{Y^{\prime}} \tag{3-1} fZ=XX=YY(3-1)

其中,负号表示成的像是倒立的。

但实际相机得到的图像并不是倒像,我们等价地将成像平面对称地放到相机前方,这样就可以把负号去掉,
在这里插入图片描述

Z f = X X ′ = Y Y ′ (3-2) \frac{Z}{f}=\frac{X}{X^{\prime}}=\frac{Y}{Y^{\prime}} \tag{3-2} fZ=XX=YY(3-2)

整理得

{ X ′ = f X Z Y ′ = f Y Z (3-3) \left\{\begin{array}{l} {X^{\prime}}=f\frac{X}{Z} \\ \\ {Y^{\prime}}=f\frac{Y}{Z} \end{array}\right. \tag{3-3} X=fZXY=fZY(3-3)

像素坐标与成像平面之间,相差了一个缩放和一个原点的平移。假设像素坐标在 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 = α X ′ + c x v = β Y ′ + c y (3-4) \left\{\begin{array}{l} u=\alpha X^{\prime}+c_{x} \\ v=\beta Y^{\prime}+c_{y} \end{array}\right. \tag{3-4} {u=αX+cxv=βY+cy(3-4)

代入式(3-3),得

{ u = α f X Z + c x v = β f Y Z + c y (3-5) \left\{\begin{array}{l} u=\alpha f \frac{X}{Z}+c_{x} \\ \\ v=\beta f \frac{Y}{Z}+c_{y} \end{array}\right. \tag{3-5} u=αfZX+cxv=βfZY+cy(3-5)
α f = f x , \alpha f=f_x, αf=fx, β f = f y \beta f=f_y βf=fy

{ u = f x X Z + c x v = f y Y Z + c y (3-6) \left\{\begin{array}{l} u=f_{x} \frac{X}{Z}+c_{x} \\ \\ v=f_{y} \frac{Y}{Z}+c_{y} \end{array}\right. \tag{3-6} u=fxZX+cxv=fyZY+cy(3-6)

写成矩阵形式

[ u v 1 ] = 1 Z [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] =  def  1 Z K P (3-7) \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}{c} X \\ Y \\ Z \end{array}\right] \stackrel{\text { def }}{=} \frac{1}{Z} \boldsymbol{K} \boldsymbol{P} \tag{3-7} uv1 =Z1 fx000fy0cxcy1 XYZ = def Z1KP(3-7)

Z Z Z 移到左边

Z [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] =  def  K P (3-8) Z\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} X \\ Y \\ Z \end{array}\right] \stackrel{\text { def }}{=} \boldsymbol{K} \boldsymbol{P} \tag{3-8} Z uv1 = fx000fy0cxcy1 XYZ = def KP(3-8)

中间的矩阵称为相机内参数,一般在相机出厂后便已确定。

由于相机在运动,点 P P P 的相机坐标应由他的世界坐标( P w P_w Pw)根据相机当前位姿变换得到

Z P u v = Z [ u v 1 ] = K P = K ( R P w + t ) = K T P w (3-9) Z \boldsymbol{P}_{u v}=Z\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\boldsymbol{K} \boldsymbol{P}=\boldsymbol{K}\left(\boldsymbol{R} \boldsymbol{P}_{\mathrm{w}}+\boldsymbol{t}\right)=\boldsymbol{K} \boldsymbol{T} \boldsymbol{P}_{\mathrm{w}} \tag{3-9} ZPuv=Z uv1 =KP=K(RPw+t)=KTPw(3-9)
其中, R \boldsymbol{R} R t \boldsymbol{t} t外参

上式描述了从世界坐标系相机坐标系再到像素坐标系的过程。

将世界坐标转换到相机坐标后,再除掉最后一维的数值,这相当于把最后一维作归一化处理,得到它在归一化平面上的投影:

( R P w + t ) = [ X , Y , Z ] T ⏟ 相机坐标  → [ X / Z , Y / Z , 1 ] T ⏟ 归一化坐标  \left(\boldsymbol{R} \boldsymbol{P}_{\mathrm{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

可知,点的深度信息在投影过程中丢失了(变成二维),所以单目视觉无法得到像素点深度值。

4.1.2 畸变模型

(1)由透镜形状引起的畸变称为径向畸变,一般有桶形畸变枕形畸变两类。

在这里插入图片描述

对于径向畸变,离中心距离越远,畸变越严重;穿过图像中心和光轴有交点的直线形状不变。

(2)在相机组装过程中,透镜和成像平面无法完全平行,会产生切向畸变

(3)下面用数学模型进行描述:假设归一化平面上存在一点 P P P,坐标为 [ x , y ] T [x, y]^T [x,y]T,极坐标为 [ r , θ ] T [r, \theta]^T [r,θ]T,那么,正常归一化平面坐标和畸变后的坐标之间的关系为

{ x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) (3-10) \left\{\begin{array}{l} x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)\\ \\ y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6) \end{array}\right. \tag{3-10} xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)(3-10)

类似的,切向畸变数学模型为

{ 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 (3-11) \left\{\begin{array}{l} \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} \end{array}\right. \tag{3-11} {xdistorted =x+2p1xy+p2(r2+2x2)ydistorted =y+p1(r2+2y2)+2p2xy(3-11)

(4)去畸变的过程:

  • 将三维空间上的点投影到归一化平面,得到坐标 [ x , y ] T [x, y]^T [x,y]T

  • 计算径向畸变和切向畸变

{ x d i s t o r t e d = 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 d i s t o r t e d = 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 (3-12) \left\{\begin{array}{l} x_{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)+2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right)\\ \\ y_{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6)+p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x y \end{array}\right. \tag{3-12} xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy(3-12)

  • 通过内参矩阵将相机坐标投影到像素平面。
    在这里插入图片描述

(5)单目相机的成像过程

  • 世界坐标系下一点 P w P_w Pw

  • 经旋转平移得到相机坐标 P ~ c = R P w + t \tilde{P}_{\mathrm{c}}=\boldsymbol{RP_w+t} P~c=RPw+t

  • 将坐标的三个分量分别除以 Z Z Z,得到归一化坐标 P c = [ X / Z , Y / Z , 1 ] T P_c=[X/Z, Y/Z, 1]^T Pc=[X/Z,Y/Z,1]T

  • 计算发生畸变后的坐标;

  • 经过内参矩阵,得到像素坐标 P u v = K P c \boldsymbol{P}_{uv}=\boldsymbol{KP_c} Puv=KPc

4.1.3 双目相机模型

在这里插入图片描述

其中, O L O_L OL O R O_R OR为左右相机光圈中心,两者之间的距离称为基线 f f f 为焦距; u R u_R uR 为负数,需加负号。

根据几何关系,有

z − f z = b − ( u L − u R ) b = b − u L + u R b (3-13) \frac {z-f}{z}=\frac {b-(u_L-u_R)} {b}=\frac {b-u_L+u_R} {b} \tag{3-13} zzf=bb(uLuR)=bbuL+uR(3-13)

定义 d = u L − u R d=u_L-u_R d=uLuR,称为视差, 整理上式得,

z = f b d (3-14) z=\frac {fb}{d} \tag{3-14} z=dfb(3-14)

可见,视差越大,距离越近。基线 b b b 越大,可测量的距离就越大;反之,小型双目器件只能测量很近的距离。

4.1.4 RGB-D 相机模型

RGB-D 相机可以主动测量每个像素的深度,按原理可分为两类:

  • 通过红外结构光原理测量像素距离。

  • 通过飞行时间原理测量像素距离。

在这里插入图片描述

RGB-D 相机容易受到日光或其他传感器的干扰,因此不能在室外使用。

4.2 图像

在这里插入图片描述

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

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

相关文章

[架构之路-246]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:获取、分析、定义、验证

目录 前言: 架构师为什么需要了解需求分析 一、需求工程概述 1.1 概述 1.2 需求工程的两大部分 (1)需求开发:系统工程师的职责、目标系统开发角度 (2)需求管理:项目管理者的职责、项目管…

Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类(二进制/多类)多标签图像分类对象检测实例分段 二、用于推理的数据格式输入格式输出格式图像分类多标签图像分类对象检测实例分段 了解如何设置Azure中 JSONL 文件格式,以便在训练和推理期间在计算机视觉…

Kotlin文件和类为什么不是一对一关系

在Java中,一个类文件的public类名必须和文件名一致,如何不一致就会报异常,但是在kotlin的文件可以和类名一致,也可以不一致。这种特性,就跟c有点像,毕竟c的.h 和 .cpp文件是分开的。只要最终编译的时候对的…

工业相机基本知识理解:工业相机IO接口,功耗和供电方式

I-input 相机接收外部信号,可用于触发相机(硬触发),也可用于定制不同的 功能,例如使用不同信号宽度来改变相机的曝光时间。主要用于现场设 备控制相机使用,常常配合各种传感器使用 O-output 相机输出信号&a…

MS1112,一款16-bit 多输入内置基准模数转换器

MS1112 是一款高精度 16bit 模数转换器,具有 2 组差分输入 或 3 组单端输入通道,高达 16bits 的分辨率。内部集成 2.048V 基 准源,差分输入范围达到 2.048V 。 MS1112 使用了 I 2 C 兼容接口, 并有 2 个地址管…

【Java 进阶篇】JSTL 详解

Java JSTL(JavaServer Pages Standard Tag Library)是用于简化在 JSP 页面上的开发工作的 Java 标签库。它提供了在 JSP 页面上使用的标准标签,可以帮助开发人员更轻松地访问和操作数据,而无需编写大量的 Java 代码。Java JSTL 是…

ros1 自定义topic 主题的发布,监听以及和消息体的定义

1. 在功能包下新增msg 文件夹 在功能包的下面新建 msg 文件夹,如下图所示 2. 新增Person.msg 消息实体 右键打开命令框,输入 touch Person.msg 就会在msg 目录下新增 Person.msg 文件 在Person.msg中输入如下内容完成.msg文件的创建,msg文…

【Leetcode】【每日一题】【简单】2609. 最长平衡子字符串

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-the-longest-balanced-subs…

【Java】基于SpringBoot创建Web页面并热更新

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍基于SpringBoot创建Web页面并热更新。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…

在微信小程序中怎么实现报名功能

在当今数字化时代,微信小程序已经成为各行各业进行营销和客户管理的必备工具。其中,报名功能作为微信小程序的一个重要应用场景,为企业或组织提供了方便、高效、实时的数据收集与管理方式。本文将为你详细介绍如何在微信小程序中实现报名功能…

shm4mn.dll没有被指定

每次打开excel,都会弹出提示“shm4mn.dll没有被指定” 网上各种方法都试了一次,没效果 解决方案: 直接在设置中删除所有添加的打印机

基于斑马算法的无人机航迹规划-附代码

基于斑马算法的无人机航迹规划 文章目录 基于斑马算法的无人机航迹规划1.斑马搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用斑马算法来优化无人机航迹规划。 1.斑马搜索算法 …

查看apk签名

cmd 命令: keytool -v -list -keystore "E:\xxx\release.jks"

01MyBatisPlus入门案例,常见注解,常用配置

一、入门案例 需求:基于课前资料提供的项目,实现下列功能: 新增用户功能根据id查询用户根据id批量查询用户根据id更新用户根据id删除用户 1.引入MybatisPlus的起步依赖 MybatisPlus官方提供的starter,其中集成了Mybatis和Myba…

Navicat16连接不上mysql

博主是因为服务里MySQL没启动, 如果确定自己的数据库正确无误的朋友就可以退出寻找其它解决办法了。 如图,一打开navicat就初始化,啥都没有,也连接不上 1,搜索里搜【服务】找到MySQL, 发现MySQL未启动。点击…

Map(关联数组)和Set(集合)

目录 Map和Set是用来专门查找的数据结构,查找效率非常高 Map是key-value模型(对应了两个东西) Set是纯key模型(只对应i一个东西) Map的使用 Map的方法 Map的put()方法 Map的get()方法 Map的getOrdefault()方法 Map的keySet()方法 Map的entrySet()方法 Entry是Map的内部接口类​…

OpenAI开发者大会掀起风暴:GPT模型价格狂降50%,应用商店即将亮相,AI技术将引爆全球!

OpenAI首届开发者大会召开了! 关键信息: GPT-4升级版GPT-4 Turbo来了,上下文窗口达到128k,为GPT-4的4倍;OpenAI还降低了几乎所有模型的API使用价格,整体便宜了一半多;GPT-4系列的多模态能力向B…

OAuth2.0双令牌

OAuth 2.0是一种基于令牌的身份验证和授权协议,它允许用户授权第三方应用程序访问他们的资源,而不必共享他们的凭据。 在OAuth 2.0中,通常会使用两种类型的令牌:访问令牌和刷新令牌。访问令牌是用于访问资源的令牌,可…

关于Python hydra库(OmegaConf)(yaml)

这为博友介绍的很清晰,就给大家引荐一下: Python hydra库(OmegaConf)(yaml)_hxxjxw的博客-CSDN博客 安装Python hydra-core我遇到的问题: which pip 确实是虚拟环境(pytorch_gpu) 依然报错 :ModuleNotF…

字节8年经验之谈 —— 如何从0开始做自动化测试?

自动化测试是使用软件工具在应用程序上自动运行测试的过程,无需任何人为干预。这可以通过减少手动测试的需要来保存时间并提高软件开发过程的效率。由于人为错误或不一致性,手动测试可能容易出错,这可能导致错误未被检测到。自动化测试通过提…