数字图像处理 --- 相机的内参与外参(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,v表示。

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],使得:

M=[R|t]\begin{bmatrix} x_{w}\\ y_{w}\\ z_{w} \end{bmatrix}=\begin{bmatrix} x_{c}\\ y_{c}\\ z_{c} \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]左乘该点的世界坐标系坐标实现。这样一来就完成了世界坐标系到相机坐标系的转化。


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,在相机坐标系中的关系。

        又因为,虚拟成像平面中的小m点,不仅在3D相机坐标系中,也在2D虚拟成像坐标系中。我们必须先找到两个坐标系的相对关系,继而找到小m点在虚拟成像坐标系中的坐标值。

        已知相机坐标系中小m点的坐标值为m=[{x_{c}^{m}}{y_{c}^{m}},f],在虚拟成像平面坐标系中点m的坐标值为m=[{x_{i}^{m}}{y_{i}^{m}}]。对于这两个不同的坐标系,我们最先想到的是2D虚拟成像坐标系的中心O_{i}=[{x_{i}^{Oi}}{y_{i}^{Oi}}]可能不在主光轴上,即O_{i}与相机坐标系下的光心O=[{x_{c}^{O}}{y_{c}^{O}}]在2维平面中不是同一点,而是存在一定偏差,即:

{x_{i}^{Oi}}={x_{c}^{O}}+{x_{i}^{offset}}

{y_{i}^{Oi}}={y_{c}^{O}}+{y_{i}^{offset}}

这两个式子的意义是:偏离了主光轴的中心O_{i}和光心加上一定的偏移量表示的是同一个点。

        又因为,在相机内部,物理成像平面被sensor以pixel为单位采样了,因此,需要一个由mm为单位的相机坐标系(image plane)到以pixel为单位的图像坐标系(pixel plane)之间的转换。且,二维图像坐标系的起点往往是图像的左上角。因此,在这一转换中还需要加一个x,y方向的偏移量Offset。

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

dx=m/w(mm/pixel)

dy=n/h(mm/pixel)

表示每个pixel占多少mm。

这样一来由相机坐标系x_{c}y_{c}z_{c}表示的实际3D场景,就转化为了物理成像平面上:

x_{i}(pixel)=x_{c}(mm)/dx(mm/pixel)

参考文献:

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.hqwc.cn/news/57767.html

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

相关文章

代码分析Java中的BIO与NIO

开发环境 OS:Win10(需要开启telnet服务,或使用第三方远程工具) Java版本:8 BIO 概念 BIO(Block IO),即同步阻塞IO,特点为当客户端发起请求后,在服务端未处理完该请求之前&#xff…

UE中低延时播放RTSP监控视频解决方案

第1章 方案简介 1.1 行业痛点 在各种智慧城市、智慧社区、智慧水利、智慧矿山等数字孪生项目中,经常使用通UE来开发三维可视化场景。在这些场景中通常都需要把现场的各种监控视频在UE的可视化场景中接入,主要包含海康威视、大华、宇视、华为等众多监控…

网络编程——数据包的组装和拆解

数据包的组装和拆解 一、数据包在各个层之间的传输 二、各个层的封包格式 1、链路层封包格式 -------------------------------------------------------------------------------------------------------------------------------------- | 目标MAC地址(6字节&a…

WebView2对比CefSharp的超强优势

第一次使用了CefSharp组件,集成开发结束后,测试及使用过程中遇到了一些无法处理的bug及严重的性能问题。然后又测试对比了其他多种组件,具体情况可以阅读我的博客​ ​《.NET桌面程序集成Web网页开发的十种解决方案》​​。最终选用了微软新出…

Ubuntu 22.04安装和使用ROS1可行吗

可行。 测试结果 ROS1可以一直使用下去的,这一点不用担心。Ubuntu会一直维护的。 简要介绍 Debian发行版^_^ AI:在Ubuntu 22.04上安装ROS1是可行的,但需要注意ROS1对Ubuntu的支持只到20.04。因此,如果要在22.04上安装ROS1&am…

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面,挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用,需要在里面支持多个版本的中间件客户端;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT,百度,googl…

linux下.run安装脚本制作

1、安装文件(install.sh) PS: .run安装包内部执行脚本文件 2、资源文件(test.zip) PS: 待安装程序源文件 3、制作.run脚本(install.run) cat install.sh test.zip > install.run chmod ax install.run

【软件工程】3 ATM系统的设计

目录 3 ATM系统的设计 3.1体系结构设计 3.2 设计模式选择 3.3 补充、完善类图 3.4 数据库设计 3.4.1 类与表的映射关系 3.4.2 数据库设计规范 3.4.3 数据库表 3.5 界面设计 3.5.1 界面结构设计 3.5.2 界面设计 3.5.2.1 功能界面设计 3.5.2.2 交互界面 总博客&…

基于Python++PyQt5马尔科夫模型的智能AI即兴作曲—深度学习算法应用(含全部工程源码+测试数据)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境PC环境配置 模块实现1. 钢琴伴奏制作1)和弦的实现2)和弦级数转为当前调式音阶3)根据预置节奏生成伴奏 2. 乐句生成1)添加音符2)旋律生成3)节…

SpringBoot + Docker 实现一次构建到处运行~

一、容器化部署的好处 图片 Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行…

linuxARM裸机学习笔记(7)----RTC实时时钟实验

基础概念: I.MX6U 内部也有个RTC 模块,但是不叫作“ RTC ”,而是叫做“ SNVS ”。 SNVS 直译过来就是安全的非易性存储, SNVS 里面主要是一些低功耗的外设,包括一个 安全的实时计数器 (RTC) 、一个单调计数器 (mo…

socket 到底是个啥

我相信大家在面试过程中或多或少都会被问到这样一个问题:你能解释一下什么是 socket 吗 我记得我当初的回答很是浅显:socket 也叫套接字,用来负责不同主机程序之间的网络通信连接,socket 的表现方式由四元组(ip地址&am…