【相机与图像】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.mzph.cn/diannao/49809.shtml

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

相关文章

py Qt5学习记录

1.Qt5的安装 可参考一些博客如:Python 小白从零开始 PyQt5 项目实战(2)菜单和工具栏_pyqt 二级菜单-CSDN博客 2.Qt5的界面显示 3.新建一个工具栏并打开本地文件方法 (1)在Qt5界面右下角有个“动作编辑器”&#xff…

每日一题~961div2A+B+C(阅读题,思维,数学log)

A 题意&#xff1a;给你 n*n 的表格和k 个筹码。每个格子上至多放一个 问至少占据多少对角线。 显然&#xff0c;要先 格数的多的格子去放。 n n-1 n-2 …1 只有n 的是一个&#xff08;主对角线&#xff09;&#xff0c;其他的是两个。 #include <bits/stdc.h> using na…

基于微信小程序图书馆座位预约管理系统设计与实现

1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及各种计算机硬件的完善和升级&#x…

JS 事件循环(Event Loop)机制

事件循环机制的作用 事件循环机制是 JS 的一种执行机制&#xff0c;一种可以实现异步编程的机制。 因为 JS 是单线程的&#xff0c;单线程意味着所有任务需要排队执行。但是有一些 API&#xff08;比如&#xff1a;定时器和 Ajax 等&#xff09;是需要等待一定的时间才能得到…

【Python】一文向您详细介绍 K-means 算法

【Python】一文向您详细介绍 K-means 算法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff…

Visual Studio 2022新建 cmake 工程测试 tensorRT 自带样例 sampleOnnxMNIST

1. 新建 cmake 工程 vs2022_cmake_sampleOnnxMNIST_test( 如何新建 cmake 工程&#xff0c;请参考博客&#xff1a;Visual Studio 2022新建 cmake 工程测试 opencv helloworld ) 2. 删除默认生成的 vs2022_cmake_sampleOnnxMNIST_test.h 头文件 3. 修改默认生成的 vs2022_cma…

BSV区块链在人工智能时代的数字化转型中的角色

​​发表时间&#xff1a;2024年6月13日 企业数字化转型已有约30年的历史&#xff0c;而人工智能&#xff08;以下简称AI&#xff09;将这种转型提升到了一个全新的高度。这并不难理解&#xff0c;因为AI终于使企业能够发挥其潜力&#xff0c;实现更宏大的目标。然而&#xff0…

MySQL中实现动态表单中JSON元素精准匹配的方法

目录 前言 一、动态表单技术 1、包含的主要信息 2、元素属性设置 3、表单内容 二、表单数据存储和查询 1、数据存储 2、数据的查询 3、在5.7版本中进行JSON检索 4、8.0后的优化查询 三、总结 前言 在很多有工作流设置的地方、比如需要在不同的流程中&#xff0c;需要…

服务器数据恢复—V7000存储硬盘故障脱机的数据恢复案例

服务器存储数据恢复环境&#xff1a; 某品牌P740小型机AIXSybaseV7000磁盘阵列柜&#xff0c;磁盘阵列柜中有12块SAS机械硬盘&#xff08;其中包括一块热备盘&#xff09;。 服务器存储故障&#xff1a; 磁盘阵列柜中有一块磁盘出现故障&#xff0c;运维人员用新硬盘替换掉故障…

网络安全等级保护解决方案的主打产品

网络安全等级保护解决方案的主打产品&#xff1a; HiSec Insight安全态势感知系统、 FireHunter6000沙箱、 SecoManager安全控制器、 HiSecEngine USG系列防火墙和HiSecEngine AntiDDoS防御系统。 华为HiSec Insight安全态势感知系统是基于商用大数据平台FusionInsight的A…

【LeetCode】201. 数字范围按位与

1. 题目 2. 分析 这题挺难想的&#xff0c;我到现在还没想明白&#xff0c;为啥只用左区间和右区间就能找到目标值了&#xff0c;而不用挨个做与操作&#xff1f; 3. 代码 class Solution:def rangeBitwiseAnd(self, left: int, right: int) -> int:left_bin bin(left).…

k8s集群可视化工具安装(dashboard)

可视化安装 2.1、下载相关的yaml文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml Vim recommended.yaml 2.2、部署 kubectl apply -f recommended.yaml 查看那kubernetes-dashboard命令空间下的资源 kubectl get …

ZLMRTCClient配置说明与用法(含示例)

webRTC播放视频 后面在项目中会用到通过推拉播放视频流的技术&#xff0c;所以最近预研了一下webRTC 首先需要引入封装好的webRTC客户端的js文件ZLMRTCClient.js 下面是地址需要的自行下载 http://my.zsyou.top/2024/ZLMRTCClient.js 配置说明 new ZLMRTCClient.Endpoint…

技术分享!国产ARM + FPGA的SDIO通信开发介绍!

SDIO总线介绍 SDIO(Secure Digital lnput and Output),即安全数字输入输出接口。SDIO总线协议是由SD协议演化而来,它主要是对SD协议进行了一些扩展。 SDIO总线主要是为SDIO卡提供一个高速的I/O能力,并伴随着较低的功耗。SDIO总线不但支持SDIO卡,而且还兼容SD内存卡。支持…

韦东山嵌入式linux系列-具体单板的按键驱动程序(查询方式)

1 GPIO 操作回顾 &#xff08;1&#xff09;使能模块&#xff1b; &#xff08;2&#xff09;设置引脚的模式&#xff08;工作于GPIO模式&#xff09;&#xff1b; &#xff08;3&#xff09;设置GPIO本身&#xff08;输入/输出&#xff09;&#xff1b; &#xff08;4&…

在VMware创建Ubuntu24

目录 一、创建虚拟机 1. 自定义创建虚拟机 2. 设置虚拟机兼容 3. 选择镜像 4. 命名虚拟机&#xff0c;选择存放位置 5. 处理器配置 6. 内存配置 7. 网络类型配置 8. I/O控制器类型 9. 磁盘配置 10. 完成虚拟机创建 二、Ubuntu安装 1. 进入虚拟机中进行ubuntu的安…

浏览器打开PDF卡在加载(侧边翻译插件打不开PDF)

如果你的浏览器安装了一些翻译插件&#xff0c;那么可能会导致PDF加载不出来 比如我的浏览器中安装了“侧边翻译”&#xff0c;而我在view Elsever的论文时出现了加载不出来的问题—— 仍然以此扩展为例&#xff0c;那么解决办法是&#xff1a; 取消勾选——

Docker简单快速入门

1. 安装Docker 基于 Ubuntu 24.04 LTS 安装Docker 。 # 更新包索引并安装依赖包 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common# 添加Docker的官方GPG密钥并存储在正确的位置 curl -fsSL https://mirror…

【屏显MCU】多媒体接口总结

本文主要介绍【屏显MCU】的基本概念&#xff0c;用于开发过程中的理解 以下是图层叠加示例 【屏显MCU】多媒体接口总结 0. 个人简介 && 授权须知1. 三大引擎1.1 【显示引擎】Display Engine1.1.1 【UI】 图层的概念1.1.2 【Video】 图层的概念1.1.3 图层的 Blending 的…

nginx代理缓存配置-Linux(CentOS)

代理缓存 1. 编写主配置文件2. 编辑虚拟机配置文件3. 重启nginx服务 nginx代理服务配置&#xff0c;基于http协议 开启代理缓存的前提是已经开启了代理服务&#xff0c;请确保已经开启代理服务 1. 编写主配置文件 主配置文件通常在/etc/nginx/nginx.conf&#xff0c;在该文件…