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

news2024/12/28 18:40:39

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的坐标值,并找到他们之间的联系。(图一与图二所要表达的东西相同,只是为了便于理解和观看使用了不同的绘制方式)

 (图一)

  (图二)

         在上图相机坐标系中,世界中的某一点M的坐标为M=[x_{c}^{M},y_{c}^{M},z_{c}^{M}]。成像后,在物理成像平面中与M所对应的点为m,m的坐标为m=[x_{c}^{m},y_{c}^{m},z_{c}^{m}](注意:x-y-z的上角标,我用大写的M表示实际点大M,用小写的m表示物理成像平面中的点小m)。O表示光心,也叫摄影中心。O与O_{i}之间的距离为焦距f。过光心做垂直于物理成像平面的直线叫主光轴(principal axis),垂点O_{i}叫主点(principal point)

        我们令主光轴与相机坐标系中的z_{c}轴重合,单看相机坐标系中由y_{c}z_{c}轴组成的平面。在三角形O_{c}Om中,线段O_{c}O的长度为z_{c}^{m},线段mO的长度为y_{c}^{m}。在三角形O_{c}QM中,线段O_{c}Q的长度为z_{c}^{M},线段MQ的长度为y_{c}^{M}。因为,三角形O_{c}Om与三角形O_{c}QM相似,可以建立如下关系:

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

又因为小m点一定在物理成像平面上,则,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}轴,有:

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物理成像坐标系中。则,我们还可以根据在物理成像平面中主点在相机坐标系中的{x_{c}^{O}}{y_{c}^{O}}与主点在物理成像平面坐标系中的{x_{i}^{O}}{y_{i}^{O}}的相对关系,找到小m点在2D物理成像坐标系中的坐标值。

        首先,我们最先想到的是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.coloradmin.cn/o/845640.html

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

相关文章

leetcode357周赛

2810. 故障键盘 核心思想:自己想的笨办法,枚举s,然后遇到i就翻转。比较好的方法就是双端队列,遇到i字母原本往后加的就往前加,然后读的时候反过来读,往前加的就往后加,读的话就从前往后&#x…

Java并发系列之八:ThreadPoolExecutor

线程池的意义 在讲解线程池之前,有些读者可能存在这样的疑惑:为什么需要线程池,线程池有什么优越性? 关于这个问题,主要从两个角度来进行解答: 减少开销 在大部分JVM上,用户线程与操作系统内核线程是1:1…

【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)

作者:伊利诺伊大学芝加哥分校-Akul Goyal、Gang Wang、Adam Bates;维克森林大学-Xueyuan Han、 引用:Goyal A, Han X, Wang G, et al. Sometimes, You Aren’t What You Do: Mimicry Attacks against Provenance Graph Host Intrusion Detect…

第一百二十三天学习记录:C++提高:STL-vector容器(下)(黑马教学视频)

vector插入和删除 功能描述: 对vector容器进行插入、删除操作 函数原型: push_back(ele); //尾部插入元素ele pop_back(); //删除最后一个元素 insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele insert(const_iterator pos, int cou…

Arduino 项目笔记 | Arduino LED Memory Game 颜色记忆游戏机

成果展示 颜色记忆游戏机 | Arduino DIY 1. 线路链连接 1.1 原理图 1.2 PCB 免费PCB打样 Arduino LED Memory Game 颜色记忆机资料下载 1.3 烧录 Bootloader 第二部分:Burn bootloader 2. 程序实现 #define NOTE_B0 31 #define NOTE_C1 33 #define NOT…

在Linux上进行项目部署--手动和自动

在Linux上进行项目部署–手动和自动 文章目录 在Linux上进行项目部署--手动和自动1、手动部署项目2、通过Shell脚本自动部署项目 1、手动部署项目 1、在IDEA中开发SpringBoot项目并打成jar包 在idea中的Maven中的package(基于Springboot项目) 2、将jar包…

React Native连接Zebra斑马打印机通过发送CPCL指令打印(Android 和 iOS通用)

自 2015 年发布以来,React Native 已成为用于构建数千个移动应用程序的流行跨平台移动开发框架之一。通常,我们有开发人员询问如何将 Link-OS SDK 与 React Native 应用程序集成,以便在 Zebra 打印机上打印标签。在本教程中,我们将…

机器视觉赛道持续火热,深眸科技坚持工业AI视觉切入更多应用领域

随着深度学习等算法的突破、算力的不断提升以及海量数据的持续积累,人工智能逐渐从学术界向工业界落地。而机器视觉作为人工智能领域中一个正在快速发展的分支,广泛应用于工业制造的识别、检测、测量、定位等场景,相较于人眼,在精…

系统架构设计高级技能 · 软件可靠性分析与设计(三)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…

记录:在 TransnormerLLM 的纯线性注意力(改)中,出现的值异常现象

实验记录 注意,我为了让线性注意力在 fp16-mix 中稳定训练,作为以下修改。 输入线性注意力前,q 和 k 均做了以下操作 q q / torch.norm(q, dim-1, keepdimTrue) k k / torch.norm(k, dim-1, keepdimTrue)把 SRmsNorm 替换为普通的 RmsNo…

QT6 QML CMake工程添加qml到qrc中

参考QT官方文档 前言:使用qt6.2.4 qml的CMake工程时遇到qrc中的qml文件和图片无法使用的情况,查了好久终于找到解决办法,在此记录一下 1. 新建qml.qrc资源文件 可以在目录下看到qrc文件表示新建成功 2.给qrc文件添加前缀 添加完成后如下: 3. 修改CMakeLists.txt 我需要在一个q…

『SpringBoot 源码分析』自动配置

『SpringBoot 源码分析』自动装配 基于 2.2.9.RELEASE问题:Spring Boot 到底是如何进行自动配置的,都把哪些组件进行了自动配置? 首先创建测试主程序 package com.lagou;SpringBootApplication//标注在类上说明这个类是SpringBoot的主配置…

PHP序列化,反序列化

一.什么是序列化和反序列化 php类与对象 类是定义一系列属性和操作的模板&#xff0c;而对象&#xff0c;就是把属性进行实例化&#xff0c;完事交给类里面的方法&#xff0c;进行处理。 <?php class people{//定义类属性&#xff08;类似变量&#xff09;,public 代表可…

【计算机网络笔记】第一章

1、计算机网络定义 计算机网络主要是由一些通用的、可编程的硬件&#xff08;包含CPU、计算机、手机、智能电器…&#xff09;互连而成的&#xff0c;而这些硬件并非专门用来实现某一特定目的&#xff08;例如&#xff0c;传送数据或视频信号&#xff09;。这些可编程的硬件能…

matplotlib库的用法——各种图的绘制

matplotlib是一个流行的Python绘图库&#xff0c;用于创建各种静态、动态、交互式可视化。以下是一些基本的用法&#xff1a; 线图 plt.plot([1, 2, 3, 4]) plt.ylabel(Some Numbers) plt.show()散点图 x [1,2,3,4,5] y [2,3,4,5,6] plt.scatter(x, y) plt.show() 条形图 …

浅析 String

浅析String 一、创建字符串二、字符串与常量池三、字符串的不可变性四、字符串的拼接五、StringBuilder和StringBuffer 一、创建字符串 //三种常用的构造字符串的方式public static void main(String[] args) {String str1 "hello";String str2 new String("w…

Effective Java笔记(26)请不要使用原生态类型

首先介绍一些术语 。 声明中具有一个或者多个类型参数&#xff08; type parameter &#xff09;的类或者接口&#xff0c;就是泛型&#xff08; generic &#xff09;类或者接口 。 例如&#xff0c;List 接口就只有单个类型参数 E &#xff0c;表示列表的元素类型 。这个接口…

码云 Gitee + Jenkins 配置教程

安装jdk 安装maven 安装Jenkins https://blog.csdn.net/minihuabei/article/details/132151292?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132151292%22%2C%22source%22%3A%22minihuabei%22%7D 插件安装 前往 Manage Jen…

聊聊汽车电子的话题

当谈到汽车电子时&#xff0c;有许多有趣的话题可以探讨。以下是一些可能感兴趣的话题&#xff1a; 自动驾驶技术&#xff1a;自动驾驶技术正变得越来越先进&#xff0c;它们如何在汽车中实现&#xff1f;它们将如何改变我们的交通方式以及对道路安全的影响&#xff1f; 电动汽…

【LeetCode每日一题】——85.最大矩形

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 困难 三【题目编号】 85.最大矩形 四【题目描述】 给定一个仅包含 0 …