【相机与图像】1. 相机模型的介绍:内参、外参、畸变参数

想着整理下相机模型(内容上参考 slam十四讲)、相机的内外参标定。方便自己的使用和回顾。
不过,内外参标定啥时候记录随缘 -_-

概述

构建相机模型
相机将三位世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程,使用一个集合模型进行描述。

  • 最简单且常见的为针孔模型,他描述了一束光通过针孔后,在针孔背面投影成像的关系;
  • 同时由于相机镜头上的透镜的存在,使得光线投影到成像平面过程中会产生畸变。所以使用针孔和畸变两个模型来描述整个投影过程。

单目相机成像过程】(这里先上最终的结论)

  • 1 【世界坐标】世界坐标系下有点P,世界坐标为 P w P_w Pw
  • 2 【相机坐标】相机在运动,对应的外参为 R , t R,t R,t。P的相机坐标为 P c = R P w + t P_{c}=RP_w+t Pc=RPw+t.
  • 3 【归一化坐标】此时 P c = ( X , Y , Z ) P_c=(X,Y,Z) Pc=(X,Y,Z),将点投影到归一化平面 Z = 1 Z=1 Z=1 上,得到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 【去畸变】存在畸变时,使用畸变参数计算 对应的坐标。
  • 5 【像素坐标】通过内参矩阵,计算对应的像素坐标: P ~ u v = K P c ′ \tilde{P}_{uv}=KP_c^{'} P~uv=KPc

公式与图示

  • 在不考虑畸变的影响,可将整过过程写成表达式如下,: s P ~ = K ( R P w + t ) s\tilde{P}=K(RP_w+t) sP~=K(RPw+t)
  • 以及图示公式细节( s = Z c s=Z_c s=Zc,所以图示等号左边与最终的uv还有个s倍的关系)
    在这里插入图片描述

1 针孔模型建模

小孔成像原理,成像平面的图像 为实际物品按照z轴旋转180度状态。在实际相机中,会将成像平面上倒转的图像处理成与3D目标,直观上是一致的。然后根据等边三角形相似原理,构建了一个 等效成像面,这样也简化了点 在坐标系的构建和空间与图像上映射时的坐标问题。
如下图
在这里插入图片描述
在上图中,构建3维坐标与2维坐标的转换中所需的坐标系(共四种)。

  • 世界坐标系 o w x w y w z w o_wx_wy_wz_w owxwywzw
    世界坐标系不是一个又明确定义的坐标系,可以任意制定一个字 “在当前场景下固定不变的坐标系” 作为世界坐标系。
  • 相机坐标系 o c x c y c z c o_cx_cy_cz_c ocxcyczc
    相机坐标系习惯上定义:假设手持相机,相机光心作为原点;右边为x轴正方向;下边为y轴正方向;相机前方为z轴正方向(拍摄远处的物体距离为正)。
  • 图像坐标系 o i x i y i o_ix_iy_i oixiyi
    为二维坐标系。图像坐标系的原点位于感光芯片的中心(感光芯片是位于镜头背后的用于成像的小板子),x、y轴方向和相机坐标系的x、y轴相同。
  • 像素坐标系 o p x p y p o_px_py_p opxpyp
    像素坐标系也位于成像平面上,是图像坐标系通过平移和缩放得到的。值得注意是,不同的软件或者库对于像素坐标 (u,v) 的定义不一样。
    在这里插入图片描述
    我们先探究目标从 相机坐标系 转换到 图像坐标系的关系。
    在这里插入图片描述
    在这里插入图片描述
    其中,3D点的坐标为 ( X c , Y c , Z c ) (X_c,Y_c,Z_c) (Xc,Yc,Zc),图片上的2D坐标为 ( X i , Y i ) (X_i, Y_i) (Xi,Yi)。则有 Z c f = X c X i = Y c Y i \frac{Z_c}{f}=\frac{X_c}{X_i}=\frac{Y_c}{Y_i} fZc=XiXc=YiYc

2 相机内参

内参矩阵为相机坐标系下的3D坐标转换到像素坐标的变化关系。

  1. 相机坐标–> 图像坐标
    通过上面的公式可以得到二者转换关系。其中 f f f 为相机焦距。
    X i = f Z c X c Y i = f Z c Y c \begin{aligned} X_i &=\frac{f}{Z_c}X_c \\ Y_i &=\frac{f}{Z_c}Y_c \end{aligned} XiYi=ZcfXc=ZcfYc

  2. 图像坐标–>像素坐标
    图像坐标实连续值,而像素坐标是离散的正值,经过平移和缩放,得到两者之间的关系:
    u = α X i + c x v = β Y i + c x \begin{aligned} u &=\alpha X_i+c_x \\ v &=\beta Y_i+c_x \\ \end{aligned} uv=αXi+cx=βYi+cx

    • α 、 β \alpha、\beta αβ 与实际传感器的物理尺寸相关,单位为 pixel每m。
      c x 、 c y c_x、c_y cxcy 为光心,单位为 pixel。
      X i , X j X_i, X_j Xi,Xj 为 图像坐标系下的坐标,单位为 m。
  3. 相机坐标–> 像素坐标
    通过上面的公式,可得以下转换关系
    u = α f Z c X c + c x u = f x X c Z c + c x v = β f Z c Y c + c y v = f y Y c Z c + c y \begin{aligned} u &=\alpha\frac{f}{Z_c}X_c+c_x\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,u =f_x\frac{X_c}{Z_c} +c_x\\ v &=\beta\frac{f}{Z_c}Y_c+c_y\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,v =f_y\frac{Y_c}{Z_c} +c_y \end{aligned} uv=αZcfXc+cxu=fxZcXc+cx=βZcfYc+cyv=fyZcYc+cy可以发现,当相机硬件固定下来, f x 、 f y 、 c x 、 c y f_x、f_y、c_x、c_y fxfycxcy 也就固定下来了。此时 u u u X c X_c Xc v v v Y c Y_c Yc 的变化并不成正比,因为还存在 Z c Z_c Zc的变量。
    为了公式更好的转换和表达,引入了齐次坐标(在原有的坐标维度额外补充1维,数值为1),在这里像素的齐次坐标为 P ~ u v \tilde{P}_{uv} P~uv

    在相机的坐标转换过程中,是否使用齐次式主要取决于转换的复杂性和需要表示的信息类型。对于涉及平移、旋转、缩放等多种变换的复杂场景,以及需要表示无穷远点或区分点和向量的场合,使用齐次坐标可以更方便地实现坐标的线性转换和统一处理。然而,在计算资源受限或特定应用场景下,可能会选择不使用齐次坐标进行坐标转换。

    则可将上面的表达式整理为 ( u v 1 ) = 1 Z c ( f x 0 c x 0 f y c y 0 0 1 ) ( X c Y c Z c ) \begin{pmatrix} u\\ v\\ 1 \end{pmatrix}=\frac{1}{Z_c}\begin{pmatrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} X_c\\ Y_c\\ Z_c \end{pmatrix} uv1 =Zc1 fx000fy0cxcy1 XcYcZc 该式中,将中间的定量组成的矩阵成为相机的内参数(Camera Intrinsic)矩阵K。通常认为,相机的内参在出厂之后是固定的,不会在使用过程中发生变化。
    相机坐标转换到像素坐标的公式可记如下 s P ~ u v = K P c s \tilde{P}_{uv} = KP_c sP~uv=KPc其中 s = Z c s=Z_c s=Zc,将该值记成s也是说明它为一个缩放尺度,为数值。

    从另一个角度考虑该投影过程。
    相机坐标系下的点 除以最后一个维度(即该点距离相机成像平面的深度),即对最后一维度进行归一化处理,得到点P在相机的归一化平面上的归一化坐标。于是定义 z = 1 z=1 z=1为归一化平面,该平面上的点为归一化坐标 ( X c , Y c , Z c ) − ˜ ( X c / Z c , Y c / Z c , 1 ) (X_c,Y_c,Z_c)\~{-}(X_c/Z_c, \,Y_c/Z_c,\,1) (Xc,Yc,Zc)˜(Xc/Zc,Yc/Zc,1)

注意:

  • 另外,有时会引入一个 λ \lambda λ 参数,来描述坐标轴垂直程度的误差(感光芯片的X,Y轴没有完全垂直) K = ( f x λ c x 0 f y c y 0 0 1 ) K= \begin{pmatrix} f_x & \lambda & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{pmatrix}\ K= fx00λfy0cxcy1  
  • 感光芯片的最小单位一般不是严格的正方形,所以得到的 f x f_x fx f y f_y fy 不一定相等。
  • K一般会由相机生产商提供,如果没有提供则可通过单目棋盘格张正友标定法进行获取,该过程被称作未内参标定。
  • 实际使用XY坐标轴的不垂直误差不需要考虑
  • 这个内参矩阵为小孔成像原理推导出来的,畸变模型后续进行介绍。

3 相机外参

外参矩阵描述的是,世界坐标系下的坐标转换为相机坐标系下的坐标的过程。这两个坐标系均为3维的,转换过程为旋转平移操作的刚体变换。
在这里插入图片描述
相机外参:旋转矩阵 R 为3x3,平移向量 t 为 3x1。
点P:相机坐标系下的坐标 P c P_c Pc为3x1,在世界坐标系下的坐标 P w P_w Pw为 3x1,对应的齐次世界坐标 P ~ w \tilde{P}_{w} P~w为 4x1。
则有 P c = R P w + t P_c=R P_w+t Pc=RPw+t对应的齐次公式为 P c = [ R t ] P ~ w P_c=\begin{bmatrix} R & t \end{bmatrix} \tilde{P}_{w} Pc=[Rt]P~w则,将世界坐标转换为像素坐标的完整的转换公式为 s P u v = s [ u v 1 ] = K ( R P w + t ) s P_{uv}=s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=K(RP_w+t) sPuv=s uv1 =K(RPw+t)

4 畸变

畸变的分类
为了更好的成像效果,在相机的前方加入了透镜,会对成像过程中光线的传播产生新的影响。

  • 【径向畸变】透镜自身的形状对光线的传播产生的影响。
    • 桶形畸变:放大率随着光轴之间的距离增加而减小。
    • 枕形畸变:与桶形畸变刚好相反
      在这里插入图片描述
  • 【切向畸变】在机械组装过程中,透镜和成像平面不可能完全平行,对光的传播产生的映像。
    在这里插入图片描述

畸变的数学表达
为了更好理解畸变,使用更严格的数学形式对这两者进行描述。
考虑归一化平面上的任意一点 p,它的坐标为 [ x , y ] T [x,y]^T [x,y]T,对应的极坐标形式为 [ r , θ ] T [r,\theta]^T [r,θ]T,其中 r r r 表示点 p 与坐标系原点的距离, θ \theta θ 表示与水平轴的夹角。通常假设这些畸变呈多项式关系。

  • 径向畸变可以看成坐标点沿着长度方向发生了变化,即 点距离远点的长度发生了变化。 x d i s t o r e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y d i s t o r e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) \begin{aligned} x_{distored}& =x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distored}& =y(1+k_1r^2+k_2r^4+k_3r^6) \end{aligned} xdistoredydistored=x(1+k1r2+k2r4+k3r6)=y(1+k1r2+k2r4+k3r6)
  • 切向畸变可以看成坐标点沿着切线方向发生了变化,即 水平夹角发生了变化。
    x d i s t o r e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r e d = y + p 1 ( r 2 + 2 y 2 ) + 2 P 2 x y \begin{aligned} x_{distored}& =x+2p_1xy+p_2(r^2+2x^2) \\ y_{distored}& =y+p_1(r^2+2y^2)+2P_2xy \end{aligned} xdistoredydistored=x+2p1xy+p2(r2+2x2)=y+p1(r2+2y2)+2P2xy

因此对于相机坐标系中的一点P,可通过5个畸变系数找到对应的像素平面上的正确位置。流程如下:

  1. 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [ x , y ] T [x,y]^T [x,y]T
  2. 对于归一化平面上的点计算畸变 x d i s t o r e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y d i s t o r e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + y + p 1 ( r 2 + 2 y 2 ) + 2 P 2 x y \begin{aligned} x_{distored} = x(1+k_1r^2+k_2r^4+k_3r^6)+x+2p_1xy+p_2(r^2+2x^2) \\ y_{distored} = y(1+k_1r^2+k_2r^4+k_3r^6)+y+p_1(r^2+2y^2)+2P_2xy \end{aligned} xdistored=x(1+k1r2+k2r4+k3r6)+x+2p1xy+p2(r2+2x2)ydistored=y(1+k1r2+k2r4+k3r6)+y+p1(r2+2y2)+2P2xy
  3. 将畸变后的点通过内参矩阵投影到像素平面,得到在图像上的 uv 坐标 u = f x x d i s t o r t e d + c x v = f y y d i s t o r t e d + c y \begin{aligned} u= f_xx_{distorted}+c_x \\ v = f_yy_{distorted}+c_y \end{aligned} u=fxxdistorted+cxv=fyydistorted+cy

去畸变
实际使用中,畸变矫正的做法:

  1. 先对整张图像进行去畸变,然后在该图像中讨论像素坐标与空间坐标的映射(更常用)
  2. 将畸变方程使用到3D点到畸变后图像的过程,会增加计算的麻烦程度

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目实战二

Git 服务器 公共代码平台GitLab 配置gitlab 1.设置管理员帐号密码 2.让程序员传代码到20主机上需要配置: 创建用户 mark 1234.com 创建用户组devops 然后把mark 添加到devons 创建项目 http://192.168.88.20/devops/myproject.git 3.客户端操作&#x…

大数据、区块链与人工智能

大数据、区块链与人工智能:技术融合与未来展望 摘要 本文旨在探讨大数据、区块链和人工智能这三个技术领域的基本概念、发展历程、应用场景及其相互之间的融合。文章首先分别介绍这三个技术的定义和特点,然后分析它们在不同行业中的实际应用&#xff0…

mac下010editor的配置文件路径

1.打开访达,点击前往,输入~/.config 2.打开这个文件夹 把里面的 010 Editor.ini 文件删除即可,重新安装010 Editor即可

SpringSecurity如何正确的设置白名单

在SpringSecurity中,往往需要对部分接口白名单访问,而大部分在使用Security中就有一个误区,那就是免鉴权访问和白名单的区别。 大部分的Security文章包括官方文档给出免鉴权访问都是使用.permitAll()去对相应路径进行免鉴权访问,但实际上这仅仅只表示该资源不需要相应的权限访问…

k8s 公共服务

修改named.conf。修改第13行和第21行 下面是 named.rfc1912 修改位置,在最后 所以用cp -p 复制文件,保留权限 nslookup 回车,server是看哪个dns 在起作用 dns服务器要配置给所有公共服务节点和 k8s 节点 就在网络文件加个DNS2就行了&…

【人工智能】AI音乐创作兴起与AI伦理的新视角

文章目录 🍊AI音乐创作:一键生成,打造你的专属乐章🍊1 市面上的AI音乐应用1.1 Suno AI1.2 网易天音 🍊2 AI音乐创作的流程原理(直接制作可跳到第3点)2.1 AI音乐流派2.2 AI音乐风格2.3 AI音乐的结构顺序2.5 选择AI音乐乐…

AI学习记录 - 激活函数的作用

试验,通过在线性公式加入激活函数,可以拟合复杂的情况(使用js实现) 结论:1、线性函数的叠加,无论叠加多少次,都是线性的 如下图 示例代码 线性代码,使用ykxb的方式,叠加10个函数…

前端:Vue学习-3

前端:Vue学习-3 1. 自定义指令2. 插槽2.1 插槽 - 后备内容(默认值)2.2 插槽 - 具名插槽2.3 插槽 - 作用域插槽 3. Vue - 路由3.1 路由模块封装3.2 声明式导航 router-link 高亮3.3 自定义匹配的类名3.4 声明式导肮 - 跳转传参3.5 Vue路由 - 重…

这6款Python IDE代码编辑器,你都用过吗?

工欲善其事,必先利其器,选择编辑器或IDE(集成开发环境)是学习python编程的第二件大事。 Python开发工具有很多,诸如IDLE、Pycharm、Spyder、EclipsePydev、VScode、Wing、Jupyter等,可以说各有千秋。 新手…

Unity | Shader基础知识(第十九集:顶点着色器的进一步理解-易错点讲解)

目录 一、前言 二、网格 三、方法UnityObjectToClipPos 四、顶点着色器和片元着色器的POSITION 五、作者的碎碎念 一、前言 之前我们简单讲解过顶点着色器,也简单讲解了表面着色器,并且一起做了一些案例,因为顶点着色器本身是更自由一些…

docker基础镜像

一、配置 docker 本地源 [docker-ce-stable] nameDocker CE Stable baseurlhttp://10.35.186.181/docker-ce-stable/ enabled1 gpgcheck0 配置阿里云Docker Yum源 yum install -y yum-utils device-mapper-persistent-data lvm2 git yum-config-manager --add-repo http://mirr…

SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析

目录 1.什么是springboot 2.配置文件的优先级 2.1 配置文件的优先级 2.2 系统配置以及命令行配置 3.Bean对象的管理 3.1 如何获取对应的bean对象 3.2 bean的作用域 3.3 声明第三方bean Component 及衍生注解 与 Bean注解使用场景? 如何查看项目已有的bean对象&…

【C++】:AVL树的深度解析及其实现

目录 前言一,AVL树的概念二,AVL树节点的定义三,AVL树的插入3.1 第一步3.2 第二步 四,AVL树的旋转4.1 右单旋4.2 左单旋4.3 右左双旋4.4 左右双旋4.5 插入代码的完整实现4.6 旋转总结 五,AVL树的验证六,实现…

埃文科技受邀出席2024年河南省工业领域网络和数据安全政策宣贯会

2024年7月18日,由河南省工业和信息化厅主办,河南省工业信息安全产业发展联盟、河南省信息安全产业协会承办的2024年河南省工业领域网络和数据安全政策宣贯会在郑州召开,活动旨在提升河南省工业领域网络和数据安全保护能力,助力企业…

python模拟12306订火车票【代码示例】

实现效果:从给定的车次信息里选择车票,如果车票在车次信息里,系统提示填写乘车人,并出具购票凭据;如果车票不在车次里,提示车次不存在。 代码 # 定义一个字典,存储车次信息 ticket{G1569:[北京…

2023年码蹄杯专科组第一场初赛 解题报告 | 珂学家

前言 题解 有几道感觉还行,不过数据有些弱 安全验证(字符串)旅行(图论) 安全验证 难度: 钻石 思路: 字符串hash 二分 先提炼下题意: 即存在字符串T, 它即是S的前缀, 也是S的后缀, 同时在S[1:-2]中存在子数组ST…

刷题了:344.反转字符串|541. 反转字符串II|卡码网:54.替换数字

344.反转字符串 题目链接:https://leetcode.cn/problems/reverse-string/description/ 文章讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html 视频讲解:https://www.bilibili.com/video/BV1fV4y17748/?spm_id_from333.788&vd_s…

PostgreSQL简介和安装

一、Postgresql简介: 1、PostgreSql是功能强大的,开源的关系型数据库,底层基于C语言实现; 2、开源:允许对PostgreSql进行封装,用于商业收费; 3、版本迭代速度快,正式版本已经到15.R…

Linux网络命令

文章目录 Linux网络命令1、ping 命令2、netstat命令3、pidof Linux网络命令 1、ping 命令 使用命令:ping [-c 次数]网址或者IP地址。可以查看当前客户端与IP的网络是否可达。 ping -c 5 www.baidu.com PING www.a.shifen.com (157.148.69.74) 56(84) bytes of data…

嵌入式代码编译过程概述

嵌入式代码编译过程概述 前言一、c/c编译过程1.1 代码编译过程1.1.1 预处理1.1.2 编译阶段1.1.3 汇编阶段1.1.4 链接阶段 1.2 编译过程中的编译工具GCC /Gclang/clangMinGW / MSVCArm GNU ToolchainarmccMAKE/CMAKE/qmake 二、常见IDE编译过程2.1 keil代码编译过程2.2 windows-…