数字图像处理 --- 相机的内参与外参(CV学习笔记)

Pinhole Camera Model(针孔相机模型)

        针孔相机是一种没有镜头、只有一个小光圈的简单相机。 光线穿过光圈并在相机的另一侧呈现倒立的图像。为了建模方便,我们可以把物理成像平面(image plane)上的图像移到实际场景(3D object)和焦点(focal point)之间,把他想象成一个和物理成像平面等大小的虚拟图像平面(Virtual image plane),这样一来就不再是倒立的图像,而是直立图像。

 

        有了相机后,上图中的蓝色盒子就变成了相机,上图中的物理成像平面Image plane也被数字化到由一个个pixel组成的sensor上,并保存下来。因此,对于相机而言,上图中的焦点就是相机的镜头,而上图中的物理成像平面,需要被转换成像素平面(pixel plane),物理成像平面(image plane)与像素平面(pixel plane)大小相同,计量单位不同。物理成像平面的单位是一个物理单位,例如mm,,而像素平面实际上就是一个二维图像,他的单位实际上是某某pixel在图像中的第几行第几列。

为了后续的描述方便我们这里先定义四个坐标系:

1,二维像平面(焦平面)坐标系Image plane,原点为O_{i},坐标轴用x_{i}y_{i}表示。

2,二维图像坐标系pixel plane,原点为O_{p},坐标轴用u_{p}v_{p}表示。

3,三维相机坐标系pinhole plane/camera,原点为O_{c},坐标轴用x_{c}y_{c}z_{c}表示。

4,三维世界坐标系world,原点为O_{w},坐标轴用x_{w}y_{w}z_{w}表示。

        将3D世界场景映射成2D图像(像素平面pixel plane)总共分两步,第一步是把定义在世界坐标系中的实际3D物体映射到3D相机极坐标系中。相当于是把实际世界中的物体分别通过两个不同的坐标系来表示,然后通过找到这两个不同坐标系之间的差异,建立这两个坐标系之间的联系。这一转换关系就是下图中O_{w}O_{c}的转换。

        从3D世界坐标系(world coordinates)到3D相机坐标系(camera coordinates),需要用到外参(extrinsic parameters)或外参矩阵(extrinsic matrix)--->[R t]

        其次,从3D相机坐标系(camera coordinates)到2D像素坐标系(pixel plane)需要用到内参(intrinsic parameters)或内参矩阵(intrinsic matrix)--->K。同样是把成像后的图像,用两个不同的坐标系来表示,然后再建立这两个坐标系(物理成像坐标系与二维图像坐标系)之间的联系,使两者可以相互转换。


extrinsic parameters外参:世界坐标系到相机坐标系

        对于世界坐标系中的某一点大M而言,他本身是存在了,并不会因为我们有没有建立坐标系而受影响。但当我们人为的建立坐标系以后,这个点在我们所定义的坐标系下就有坐标值了。首先,对于点M而言,他在世界坐标系下可表示为M=[x_{w}^{M},y_{w}^{M},z_{w}^{M}],而在相机坐标系中M=[x_{c}^{M},y_{c}^{M},z_{c}^{M}],这是同一个点,只不过在不同的坐标系所对应的坐标值不同。(其中:x_{w}^{M}中的上角标“M”表示点M,下角标"w"表示世界坐标系worl,以此类推,关于下角标的定义可参照我上面定义的四个坐标系。)

         相机坐标系相对于世界坐标系而言,我们不能保证两个坐标系的原点完全重合,因此,对于x-y-z都存在一定的位移,由一个3x1矩阵t(translation)表示,其中每个元素分别对应了x-y-z方向上的位移:

t=\begin{bmatrix} t_{x}\\ t_{y}\\ t_{z} \end{bmatrix}

此外,我们也不能保证相机在拍照时没有任何角度的偏差,因此,这两个坐标系的坐标轴存在一个整体的旋转。由一个3x3矩阵R(rotation)表示:

R=\begin{bmatrix} r_{11} &r_{12} &r_{13} \\ r_{21} &r_{22} &r_{23} \\ r_{31} &r_{32} & r_{33} \end{bmatrix}

二者合并得到增广矩阵[R|t],使得:

[R|t]\begin{bmatrix} x_{w}^{M}\\ y_{w}^{M}\\ z_{w} ^{M}\end{bmatrix}=\begin{bmatrix} x_{c}^{M}\\ y_{c}^{M}\\ z_{c}^{M} \end{bmatrix} 

其中:

[R|t]=\begin{bmatrix} r_{11} &r_{12} &r_{13} & t_{x}\\ r_{21} & r_{22} &r_{23} & t_{y} \\ r_{31} &r_{32} &r_{33} & t_{z} \end{bmatrix}

        这一数学表达式的意义是:一个在世界坐标系中定义的点,如果要用相机坐标系来表示,可以用矩阵[R|t]左乘该点的世界坐标系坐标实现。

这样一来就完成了大M点在世界坐标系下的坐标值到相机坐标系下的坐标值的转化:

\begin{bmatrix} x_{c}^{M}\\ y_{c}^{M}\\ z_{c}^{M} \end{bmatrix} = \begin{bmatrix} r_{11} &r_{12} &r_{13} & t_{x}\\ r_{21} & r_{22} &r_{23} & t_{y} \\ r_{31} &r_{32} &r_{33} & t_{z} \end{bmatrix} \begin{bmatrix} x_{w}^{M}\\ y_{w}^{M}\\ z_{w}^{M}\\ 1 \end{bmatrix}


Intrinsic parameters内参:

        通过前面的研究,我们找到了世界坐标系与相机坐标系的联系,相当于学会了用相机坐标系来表示世界的物体(3D Object),现在,我们用相机坐标系来分别描述世界中的实际物体“挪到前面来的”物理成像平面中物体的像,即,在相机坐标系中用不同的坐标值定义了世界中的实际物体大M点虚拟成像平面上的像---小m点(图一),并找到他们之间的联系。

 (图一)

        O表示光心,也叫摄影中心。过光心做垂直于物理成像平面的直线叫主光轴(principal axis),垂点O主点(principal point)。光心O与主点O_{c}之间的距离为焦距f。

        现在,在相机坐标系中,我们令世界中的某一点大M的坐标值为M=[x_{c}^{M},y_{c}^{M},z_{c}^{M}]。在虚拟成像平面中所成的像为小m,且小m的坐标值为m=[x_{c}^{m},y_{c}^{m},z_{c}^{m}](注意:x-y-z的上角标,我用大写的M表示实际点大M所对应的坐标值,用小写的m表示虚拟成像平面中的点小m)。同时,我们令主光轴与相机坐标系中的z_{c}轴重合,单看相机坐标系中由y_{c}z_{c}轴组成的平面(图二),我们令大M在这一平面上的投影为M_{y},令小m在y_{c}-z_{c}平面上的投影为m_{y}

 (图二)

        在三角形O_{c}Om_{y}中,线段O_{c}O的长度为小m在z_{c}轴方向的坐标值z_{c}^{m},线段m_{y}O的长度为小m在y_{c}轴方向的坐标值y_{c}^{m}。在三角形O_{c}QM_{y}中,线段O_{c}Q的长度为z_{c}^{M},线段M_{y}Q的长度为y_{c}^{M}。根据三角形O_{c}Om_{y}与三角形O_{c}QM_{y}相似,可以建立如下关系:

z_{c}^{M}/z_{c}^{m}=y_{c}^{M}/{y_{c}^{m}}

        又因为小m点一定在物理成像平面上,则,在3D相机坐标系中,z_{c}^{m}恒等于等于焦距f,代入上式后得出:

z_{c}^{M}/f=y_{c}^{M}/{y_{c}^{m}}

{y_{c}^{m}}={f}*y_{c}^{M}/z_{c}^{M}

        同样,如果单看相机坐标系中的x_{c}z_{c}轴所组成的平面(见图三),且用M_{x}表示大M在这一平面上的投影,用m_{x}表示小m在x_{c}-z_{c}平面上的投影:

  (图三)

根据相似相似三角形 O_{c}Om_{x}与三角形O_{c}QM_{x},可以建立如下关系

z_{c}^{M}/z_{c}^{m}=x_{c}^{M}/{x_{c}^{m}}

z_{c}^{M}/{f}=x_{c}^{M}/{x_{c}^{m}}

{x_{c}^{m}}={f}*x_{c}^{M}/z_{c}^{M}

        这样一来,我们就建立了世界中的大M与虚拟成像平面上的对应点小m,在相机坐标系中的关系:

{x_{c}^{m}}={f}*x_{c}^{M}/z_{c}^{M}

{y_{c}^{m}}={f}*y_{c}^{M}/z_{c}^{M}

(上面两式合称为公式1


相机坐标系到像平面坐标系:

        又因为,虚拟成像平面中的小m点,不仅在3D相机坐标系中,也在2D像平面坐标系中。且,像平面坐标系的中心在主光轴上。这就意味着,对于同一个点光心O而言,他在相机坐标系下的坐标值和在2D像平面坐标系下的坐标值相同。即,光心在相机坐标系下的坐标值为[{x_{c}^{O}}=0,{y_{c}^{O}}=0],同时,他在2D像平面坐标系中的坐标值也等于[{x_{i}^{O}}=0,{y_{i}^{O}}=0]

        同理,已知相机坐标系中小m点的坐标值为m=[{x_{c}^{m}}{y_{c}^{m}}],令小m点在相平面中的坐标值为m=[{x_{i}^{m}}{y_{i}^{m}}],则有:

{x_{i}^{m}}={x_{c}^{m}}

{y_{i}^{m}}={y_{c}^{m}}

公式2

如图四所示:

 (图四)

这就完成了相机坐标系到像平面坐标系的转换。


像平面坐标系到图像坐标系:

        在相机内部,物理成像平面被sensor以pixel为单位采样了,且,图像坐标系的原点O_{p}在图像的左上角,见图五。因此,像平面坐标系中的小m点的坐标值,还需要一个转换关系。

 (图五)

        一方面,图像坐标系是用mxn个像素对像平面坐标系的采样。所以需要一个由mm为单位的像平面坐标系到以pixel为单位的图像坐标系的转换。

        假设图像传感器的物理尺寸,也就是物理成像平面的大小为mxn(mm),传感器保存的图像尺寸为wxh(pixel)。要想把mxn的像保存到wxh的图上,则,以mm为单位的物理成像平面与以pixel为单位的图像之间的比例关系为:

dx=m/w(mm/pixel)

dy=n/h(mm/pixel)

第一个等式表示,图像中每个pixel的物理尺寸有多宽mm。

第二个等式表示,图像中每个pixel的物理尺寸有多高mm。

        这样一来,就能用图像坐标系的坐标值(第几行第几列)来替换小m点在像平面坐标系中的坐标值(即,在x_{i}方向的长度为x_{i}^{m}(mm)和在y_{i}方向的长度为y_{i}^{m}(mm)):

u_{p}^{m}(pixel)=x_{i}^{m}(mm)/dx(mm/pixel)

v_{p}^{m}(pixel)=y_{i}^{m}(mm)/dy(mm/pixel)

公式3


        另一方面:二维图像坐标系的原点在图像(sensor)的左上角,而像平面坐标系的原点则是在senor的中心。因此,对于同一个点光心O而言,他在2D图像坐标系下的坐标值和在2D像平面坐标系下的坐标值不同,这两个坐标值之间存在一个偏移量Offset。我们在图像坐标系内定义u_{p}方向上O_{p}O_{i}的偏移量为u_{p}^{offset},他等于图像的宽度的一半---w/2,在v_{p}方向上O_{p}O_{i}的偏移量为v_{p}^{offset},他等于图像的长度的一半---h/2。

光心O在图像坐标系中的坐标值是:

{u_{p}^{O}}(pixel)={x_{i}^{O}}(mm)+{u_{p}^{offset}}(pixel)

{v_{p}^{O}}={y_{i}^{O}}+{v_{p}^{offset}}

公式4

其中:

{u_{p}^{offset}}=w/2(pixel)

{v_{p}^{offset}}=h/2(pixel)

        公式4的意思是:光心O在图像平面中的坐标值等于他在像平面中的坐标值加上一定的偏移量。同理,已经转换到图像坐标系内的小m点的坐标值(见公式3),加上Offset后为:

u_{p}^{m}(pixel)=x_{i}^{m}(mm)/dx(mm/pixel)+{u_{p}^{offset}}(pixel)

v_{p}^{m}(pixel)=y_{i}^{m}(mm)/dy(mm/pixel)+{v_{p}^{offset}}(pixel)

公式5) 

进一步,将公式2带入公式5后有:

u_{p}^{m}(pixel)=x_{c}^{m}(mm)/dx(mm/pixel)+{u_{p}^{offset}}(pixel)

v_{p}^{m}(pixel)=y_{c}^{m}(mm)/dy(mm/pixel)+{v_{p}^{offset}}(pixel)

然后再带入公式1,得到:

u_{p}^{m}(pixel)={f}*x_{c}^{M}/z_{c}^{M}(mm)/dx(mm/pixel)+{u_{p}^{offset}}(pixel)

v_{p}^{m}(pixel)={f}*y_{c}^{M}/z_{c}^{M}(mm)/dy(mm/pixel)+{v_{p}^{offset}}(pixel)

公式6

我们令f_{x}=f/d_{x},f_{y}=f/d_{y},则上式可简化为:

u_{p}^{m}(pixel)=f_{x}*x_{c}^{M}/z_{c}^{M}(pixel)+{u_{p}^{offset}}(pixel)

v_{p}^{m}(pixel)=f_{y}*y_{c}^{M}/z_{c}^{M}(pixel)+{v_{p}^{offset}}(pixel)

公式7

其中:

1,f_{x}表示以mm为单位的物理焦距f,在横向等于多少个像素。

2,f_{y}表示以mm为单位的物理焦距f,在竖向等于多少个像素。

 

公式7用矩阵的方式可表示为:

\begin{bmatrix}u_{p}^{m} \\v_{p}^{m} \\1 \end{bmatrix}=\begin{bmatrix} f_{x} & 0&u_{p}^{offset} \\ 0& f_{y} &v_{p}^{offset} \\ 0& 0& 1\end{bmatrix}\begin{bmatrix}x_{c}^{M}/z_{c}^{M} \\y_{c}^{M}/z_{c}^{M} \\1 \end{bmatrix}

其中的3x3矩阵,就叫内参矩阵,用大写的英文字母K表示。


 总结:

最后我们来梳理一下整个转换过程:

1,大M点在世界坐标系下的坐标值[x_{w}^{M},y_{w}^{M},z_{w}^{M}],通过外参矩阵[R t]得到了大M点在相机坐标系中的坐标值[x_{c}^{M},y_{c}^{M},z_{c}^{M}]。(通过同一点在不同坐标系中的坐标值,找到两个坐标系之间的关系。)

2,在相机坐标系中,根据相似三角形求出大M点在虚拟成像平面中所对应的小m点的坐标值[x_{c}^{m},y_{c}^{m},z_{c}^{m}]。(通过同一坐标系下的不同点,找到这两个点之间坐标值的联系)

3,根据虚拟成像平面在相机坐标系中的位置,根据小m点在相机坐标系下的坐标值[{x_{c}^{m}}{y_{c}^{m}}{z_{c}^{m}}=f]得到他在像平面坐标系下的坐标值[{x_{i}^{m}}={x_{c}^{m}}{y_{i}^{m}}={y_{c}^{m}}]。(通过同一点在不同坐标系中的坐标值,找到两个坐标系之间的关系。)

4,最后,根据像平面坐标系与图像坐标系的相对关系,通过内参矩阵把小m点在像平面中的坐标值[{x_{i}^{m}}{y_{i}^{m}}]转到了图像坐标系中所对应的坐标值[u_{p}^{m}v_{p}^{m}]。

参考文献:

        1,https://www.cnblogs.com/xiaohuidi/p/15711767.html

        2,What Is Camera Calibration?- MATLAB & Simulink- MathWorks 中国

        3,2.3 透视投影的相机模型_哔哩哔哩_bilibili

版权声明:文中的部分图片,文字或者其他素材,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27 

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

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

相关文章

基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux

2023年目前要说最热的点,肯定是ChatGPT了。 ChatGPT官方提供的网页版本,还有需要科*上网,很多人都会基于此进行封装。 现在是移动互联网时代,基于手机APP的需求还是很大的。 所以,今天给大家推荐一个ChatGPT客户端开…

Vue电商项目--组件通信

组件通信6种方式 第一种:props 适用于的场景:父子组件通信 注意事项: 如果父组件给子组件传递数据(函数):本质其实是子组件给父组件传递数据 如果父组件给子组件传递的数据(非函数&#xf…

期权定价模型系列【1】—BSM通用式模型

这是期权定价模型专栏的第一篇文章,此专栏旨在分享一些期权定价模型,将会从最基础的BSM模型开始写起,逐步扩散到蒙特卡洛模拟、二叉树等数值法模型,以及跳跃扩散模型、随机波动率模型,神经网络模型等等。 如果你觉得有…

Java负载均衡算法实现与原理分析(轮询、随机、哈希、加权、最小连接)

文章目录 一、负载均衡算法概述二、轮询(RoundRobin)算法1、概述2、Java实现轮询算法3、优缺点 三、随机(Random)算法1、概述2、Java实现随机算法 四、源地址哈希(Hash)算法1、概述2、Java实现地址哈希算法…

198、仿真-基于51单片机函数波形发生器调幅度频率波形Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…

Leetcode-每日一题【剑指 Offer 27. 二叉树的镜像】

题目 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入: 4 / \ 2 7 / \ / \ 1 3 6 9 镜像输出: 4 / \ 7 2 / \ / \ 9 6 3 1 示例 1: 输入:root [4,2,…

(vue)获取对象的键遍历,同时循环el-tab页展示key及内容

(vue)获取对象的键遍历,同时循环el-tab页展示key及内容 效果: 数据结构: "statusData": {"订购广度": [ {"id": 11, "ztName": "广", …

YAPi在线接口文档简单案例(结合Vue前端Demo)

在前后端分离开发中,我们都是基于文档进行开发,那前端人员有时候无法马上拿到后端的数据,该怎么办?我们一般采用mock模拟伪造数据直接进行测试,本篇文章主要介绍YApi在线接口文档的简单使用,并结合Vue的小d…

[保研/考研机试] KY183 素数 北京航空航天大学复试上机题 C++实现

题目链接&#xff1a; 素数https://www.nowcoder.com/share/jump/437195121691718444910 描述 输入一个整数n(2<n<10000)&#xff0c;要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数&#xff0c;如果没有则输出-1。 输入描述&#xff1a; 输入有多…

vue3+element-plus点击列表中的图片预览时,图片被表格覆盖

文章目录 问题解决 问题 视觉 点击图片进行预览&#xff0c;但还能继续选中其他的图片进行预览&#xff0c;鼠标放在表格上&#xff0c;那一行表格也会选中&#xff0c;如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…

云原生K8S------Yaml文件详解

目录 一&#xff1a;K8S支持的文件格式 1&#xff0c;yaml和json的主要区别 2&#xff0c;YAML语言格式 二&#xff1a;yuml 1、查看 api 资源版本标签 2、写一个yaml文件demo 3、创建service服务对外提供访问并测试 4、详解k8s中的port 三&#xff1a;文件生成 1、kubec…

Vue2到3 Day5 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…

类与对象(加深)

目录 1.类的6个默认成员函数 2. 构造函数 2.1 概念 2.2 特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1 运算符重载 5.2 赋值运算符重载 6.const成员 7.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果…

Mysql 和Oracle的区别

、mysql与oracle都是关系型数据库&#xff0c;Oracle是大型数据库&#xff0c;而MySQL是中小型数据库。但是MySQL是开源的&#xff0c;但是Oracle是收费的&#xff0c;而且比较贵。 1 2 mysql默认端口&#xff1a;3306&#xff0c;默认用户&#xff1a;root oracle默认端口&…

shell脚本开发

shell脚本语言属于弱类型的语言&#xff0c;无需声明变量类型&#xff0c;直接定义使用 shell语言定义的变量&#xff0c;数据类型默认都是字符串类型 调用历史记录命令&#xff1a;&#xff01; 历史记录id

netty基础与原理

Netty线程模型和Reactor模式 简介&#xff1a;reactor模式 和 Netty线程模型 设计模式——Reactor模式&#xff08;反应器设计模式&#xff09;&#xff0c;是一种基于 事件驱动的设计模式&#xff0c;在事件驱动的应用中&#xff0c;将一个或多个客户的 服务请求分离&#x…

【ARM Cache 系列文章 9 -- ARM big.LITTLE技术】

文章目录 big.LITTLE 技术背景big.LITTLE 技术详解big.LITTLE 硬件要求 big.LITTLE 软件模型CPU MigrationGlobal Task SchedulingGlobal Task Scheduling比CPU Migration的优势 转自&#xff1a;https://zhuanlan.zhihu.com/p/630981648 如有侵权&#xff0c;请联系删除 big.L…

Leetcode 21. 合并两个有序链表

题目描述 题目链接&#xff1a;https://leetcode.cn/problems/merge-two-sorted-lists/description/ 思路 两个链表都是升序链表&#xff0c;新建一个链表&#xff0c;引入伪头节点作为辅助节点&#xff0c;将各节点添加到伪节点之后&#xff0c;再用一个cur节点指向新链表的…

2022年03月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536 输入 只有一行,一个双精度浮点数。 输出 一行,保留8位小数的浮点数。 样例输入 3.1415926535798932 样例输出 3.14159265 下面是一个使用C语言编写的双精…

51单片机学习--红外遥控(外部中断)

需要利用下面这个红外接收头&#xff0c;OUT口会发出红外信号对应的高低电平&#xff0c;由于发送的速度很快&#xff0c;所以需要把OUT引脚接在外部中断引脚上&#xff0c;当OUT一旦产生下降沿&#xff0c;马上进中断&#xff0c;这样响应会更及时。 外部中断引脚位于P3_2和P…