CV01_相机成像原理与坐标系之间的转换

news2024/11/25 0:58:09

目录

0.引言:小孔成像->映射表达式

1. 相机自身的运动如何表征?->外参矩阵E

1.1 旋转

1.2 平移

2. 如何投影到“像平面”?->内参矩阵K

2.1 图像平面坐标转换为像素坐标系      

3. 三维到二维的维度是如何丢失的?->透视变换

4. 坐标变换的应用

附:像平面投影实际的偏差问题

参考资料


0.引言:小孔成像->映射表达式

视觉包含着大量的信息,是几乎所有生物感知环境的主要工具,也是机器人的重要传感器之一,但是相机究竟是如何成像的呢?

现在我们假设一种情况:黑暗的环境下,空中有一个发光的小球,小球对面是铺满了墙壁的一张纸,我们会发现小球照亮了整个纸面,但是小球的二维投影圆却没有呈现在纸上。

现在我们再给一个平面放在小球和纸之间,这个平面中心有一个小孔,光透过小孔,我们发现纸面整体虽然变暗了,但是小球二维投影圆却能清晰看见了。这就是小孔成像。

但是小孔到底起着怎样的作用?从数学角度看,小孔就是一个映射或者函数表达式,它让“物点”与“像点”的空间位置有了一一对应的关系。如果没有“小孔”,那么物点会“漫射”到所有像点,自然不会呈现任何形状。

小孔成像就是相机的基本原理,因为镜头本身和小孔一样,也是一个映射。镜头将物点投射到图像传感器上,将光强信号转换到成电流信号,电流信号再由运算电路转化成数字信号,合成数字图像,就是照片。

下面我们就来具体求解这个镜头代表的映射函数的具体形式,从而构建物和像之间的数学关系。

1. 相机自身的运动如何表征?->外参矩阵E

首先,我们建立一个世界坐标系W,而我们的相机自身也有一个坐标系,我们称为相机坐标系C,而且相机坐标系C可以在世界坐标系W中运动,这就引出几个问题:

1.相机自身的运动如何表征?

2.世界坐标系中的“物点”投影到相机的成像平面,这又如何表示?

3.三维到二维的维度是如何丢失的?

4.这些坐标的变换有什么应用?

问题一个一个解决。我们先看第一个问题,为了明白背后的原理我先采用二维坐标(三维坐标是同理的),这样便于理解。

从世界坐标系变换到相机坐标系属于刚体变换。首先介绍刚体运动的概念:刚体(即形状和大小不变的理想化物体)进行的运动,这种运动保持了物体内部所有点之间的相对距离不变。刚体变换通常包括“平移”和”旋转“。

(注意说明旋转和平移时用的是二维举例,三维坐标系的原理是相同的,推广即可)

1.1 旋转

我们先看旋转。现在在二维空间(三维空间同理)有一点P,其W坐标系下(x,y),红色的相机坐标系原来与世界坐标系重合,现在其旋转了θ角:

那么,P点在做了旋转运动了的相机坐标系C下的坐标(x',y')是多少呢?

这个问题我们回头解决,我们先看一下二维平面内的旋转运动是如何表达的:

二维空间内一点P的坐标为(x,y),其绕原点旋转θ后得到P’的坐标是(x',y'),如何求x',y'?

假设OP连线与X轴夹角为 α,由于旋转不改变OP长度,所以有这个等式

\frac x{\cos\alpha}=\frac{x^{\prime}}{\cos{(\alpha+\theta)}}                     

利用和角公式展开可得到x',相似,我们也能得到y'

y'=x\sin\theta+y\cos\theta

我们利用线性代数的知识写成矩阵的形式,这就得到一个旋转矩阵R,也是一个二维的线性变换

\begin{bmatrix}x'\\y'\end{bmatrix}=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}

我们记作p'=Rp,R为上面的旋转矩阵。


我们回到刚才的问题,用同样的思路,还是有OP长度相等的关系,我们计算可得x'y'x^{\prime}=x\cos\theta+y\sin\theta\\y^{\prime}=-x\sin\theta+y\cos\theta

还是用矩阵来表达,我们就得到了一个坐标基变换的表达式

\begin{bmatrix}x'\\y'\end{bmatrix}=\begin{bmatrix}\cos\theta&\sin\theta\\-\sin\theta&\cos\theta\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}

上面的矩阵我们记作A,写作p'=Ap(其实这就是坐标基变换

矩阵A的作用就是对同一点不同坐标系下的表达式进行转化

如果我们把刚刚得到的R和A相乘,结果会发现是一个单位矩阵I,则A和R就是互逆的。换句话说:再量相同的情况下,旋转点和坐标系变换是互逆的操作。

\begin{aligned}\mathbf{AR}&=\begin{bmatrix}1&0\\0&1\end{bmatrix}=\mathbf{I}\\\mathbf{A}&=\mathbf{R}^{-1}\end{aligned}

这一点非常有用,也就是只要我们知道了相机的运动,就可以求表示相机运动的逆矩阵来求空间物点在运动后的相机坐标系下的表达

1.2 平移

上面的是旋转运动,下面我们看一下平移运动。

点P移动到P',(x',y')的坐标很容易得到。但是我们要注意,平移不是线性变换,也就是说我们不能用矩阵表示平移运动。但是如果我们硬要用矩阵来表示平移呢?----这就引出了齐次坐标(homogeneous)

我们可以用如下方式表示点P的平移

\begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}1&0&a\\0&1&b\\0&0&1\end{bmatrix}\begin{bmatrix}x\\y\\1\end{bmatrix}

上面的矩阵其实就是三维剪切变换,带入到三维中通过线性变换来达到“平移”的效果

那条白色的线其实都发生了成比例的缩放,缩放因子就是最后一个维度的值ω,ω=1时称为归一化平面,齐次坐标ω不同的点在笛卡尔坐标系下是同一个点。

这就是所谓的透视投影(中心投影变换)。透视中心就在ω=0的所谓无穷远点处。

这样我们就明白,我们可以通过高维的剪切变换来实现低维度的平移变换,从而解决了平移运动的矩阵表示问题。

我们通常把线性变换+ 平移称为“仿射变换”(Affine) 

同样地,对于相机坐标系的平移,我们可以通过直接求平移矩阵T的逆矩阵来得到基变换矩阵A。

\begin{aligned} &\mathbf{p}^{\prime}=\mathbf{Tp} \\ &\mathbf{p}^{\prime}=\mathbf{Ap}=\mathbf{T}^{-1}\mathbf{p} \\ &\mathbf{T}=\begin{bmatrix}1&0&a\\0&1&b\\0&0&1\end{bmatrix}\quad\mathbf{A}=\begin{bmatrix}1&0&-a\\0&1&-b\\0&0&1\end{bmatrix} \end{aligned}

然后我们把刚刚提到的平移和旋转合在一起,拼成一个矩阵,就得到了能够转换二维(三维同理)世界坐标到运动的相机坐标系的桥梁(线性变换)。

\left[\begin{array}{ccc}\cos\theta&\sin\theta&a\\-\sin\theta&\cos\theta&b\\0&0&1\end{array}\right]

我们把这个矩阵写成更一般的形式,T和R分别表示平移和旋转,我们称E为相机的“外参矩阵”(Extrinsic Matrix)

E=\begin{bmatrix}R&T\\0^T&1\end{bmatrix},\mathbf{p}'=E\mathbf{p}

写成这种形式的好处是,可以统一的表达有限维空间的情况,比如二维和三维

(注:基于欧拉角的旋转矩阵,其具体形式与旋转轴是否固定以及旋转顺序有关)

如此一来,我们就把第一个问题解决了。

2. 如何投影到“像平面”?->内参矩阵K

我们已经把世界坐标系通过外参矩阵E转换到了运动了的相机坐标系下了,现在我们把目光聚焦到相机坐标系就可以了。像平面与XY平面的距离我们称为焦距f,相机坐标系下一点P(x,y,z)与坐标原点所连直线与像平面的交点P'就是:P在像平面上或者说焦平面上的投影点。

现在我们来求P' 的坐标,根据两个三角形相似,可得

\frac{x'}x=\frac fz\\\frac{y'}y=\frac fz  则P'的坐标为p'(xf/z,yf/z,f)

我们再定义像平面上的坐标为(xf/z,yf/z)这就是图像坐标系下的坐标值。

写成齐次坐标下矩阵的形式为

z\begin{bmatrix}x'\\y'\\1\end{bmatrix}=\begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0\end{bmatrix}\begin{bmatrix}x\\y\\z\\1\end{bmatrix}, z代表点p的深度信息。


 


2.1 图像平面坐标转换为像素坐标系      

像素坐标系和图像坐标系都在成像平面上只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位是mm,是物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这两者之间的转换关系如下:

\begin{array}{l}u=\frac{xf/z}{dx}+u_0\\\nu=\frac{yf/z}{dy}+\nu_0\end{array}

其中,dx和dy分别表示每一列和每一行分别代表多少mm,即1pixel=dxmm。以齐次坐标形式表示为:
 \begin{bmatrix}u\\\\\nu\\1\end{bmatrix}=\begin{bmatrix}\frac{1}{dx}&0&u_0\\\\0&\frac{1}{dy}&\nu_0\\\\0&0&1\end{bmatrix}\begin{bmatrix}{xf/z}\\{yf/z}\\1\end{bmatrix}

那么将上面得线性变换矩阵与之前的作矩阵乘法,有

\begin{bmatrix}\frac{1}{dx}&0&u_0\\0&\frac{1}{dy}&\nu_0\\0&0&1\end{bmatrix}\begin{bmatrix}f&0&0&0\\0&f&0&0\\0&0&1&0\end{bmatrix}=\begin{bmatrix}f_x&0&u_0&0\\0&f_y&\nu_0&0\\0&0&1&0\end{bmatrix} ,其中fx,fy是焦距(mm)像素值表示(pixel)

右侧的矩阵即为相机的内参矩阵,我们记作K。我们可以看到,这个矩阵其实也是一个仿射变换的形式。

这样,我们的第二个问题也解决了。

3. 三维到二维的维度是如何丢失的?->透视变换

我们把内外参矩阵写在一起,就得到了之前“小孔成像”所代表的映射的表达式P^{\prime}=KEP

内参矩阵K在三维空间是一个3x4的矩阵,外参矩阵E在三维空间是一个4x4的矩阵,作矩阵相乘,结果为一个3x4的矩阵。

这里本质上是一个透视变换,即齐次坐标转笛卡尔坐标(降维了),相机成像三维到二维的维度丢失,就是在这里发生的,得到的归一化像素坐标系下的uv值就是我们要找的图像坐标了。

一句话总结第三个问题的答案:相机坐标系到归一化像素坐标系的透视变换(投影)

4. 坐标变换的应用

1.相机标定:

每一个相机生产出来之后都要进行标定,这样才能把相机的内参写进产品手册卖给客户,而外参会随着相机运动变化而变化,一般把相机固定之后再校正。常用的标定方法是张正友老师提出的棋盘格校定法,此外还有直接线性法DLT。但无论哪种方法,本质都是求解内外参矩阵K和E

2.视觉测量:
iphone的measure也是通过内外参矩阵,才能把图像像素的距离和真实的物理距离对应起来。

3.视觉导航:

如果我们用摄像头作为传感器进行导航和定位,尤其是在视觉SLAM中,如果我们不知道相机的内外参矩阵,又怎么能通过摄像头提供的图像信息解算真实世界的位置,构建真实世界的物理地图呢?

附:像平面投影实际的偏差问题

在实际情况下,相机的成像并没有那么理想。

首先,由于图像传感器的尺寸和形状误差,导致像平面沿xy轴有不同尺度的缩放(scale):

\begin{aligned}(u,v)=(\alpha xf/z,\beta yf/z)\end{aligned}

再者,相机在实际生产过程中存在公差和不确定性因素,导致Z轴或者说主光轴未穿过像平面的中心而产生偏移(offset):
\begin{aligned}(u,v)=(\alpha xf/z+x_0,\beta yf/z+y_0)\end{aligned}

最后,由于工艺问题,像平面不再是矩形而是平行四边形,我们用θ来刻画这种偏斜(skew)。我们会发现这本质也是一个坐标基变换的问题,从垂直XY轴,变成了非垂直的xy轴,从正交基变为了非正交基。

x'=x-y\cot\theta\quad y'=y/\sin\theta

(u,v)=(\alpha(x-y\cot\theta)f/z+x_0,\beta(y/\sin\theta)f/z+y_0)

参考资料

参考1

参考2

参考3

参考4

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

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

相关文章

重载一元运算符

自增运算符 #include<iostream> using namespace std; class CGirl { public:string name;int ranking;CGirl() { name "zhongge"; ranking 5; }void show() const{ cout << "name : "<<name << " , ranking : " <…

matplotlib下载安装

matplotlib下载安装过程同之前写的pygame很类似。 Pygame下载安装 python官网 1.搜索matplotlib 直接点进去 查看历史版本&#xff0c;因为新版本可能出现与python不匹配问题。 我选择3.6.3版本&#xff0c;因为我安装的python是3.8&#xff0c;可以匹配版本。同时window操…

C++:拷贝构造函数

拷贝构造函数的引入 用对象来初始化对象 (1)简单变量定义时&#xff0c;可以直接初始化&#xff0c;也可以用另一个同类型变量来初始化。举例说明 (2)用class来定义对象时&#xff0c;可以直接初始化&#xff0c;也可以用另一个对象来初始化。举例说明 testperson xiaohong(na…

搜索+动态规划

刷题刷题刷题刷题 ​​​​​​​​​​​​​​Forgery - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; 需要两个数组&#xff0c;一个数组全部初始化为".",另一个数组输入数据&#xff0c;每碰到一个“.”就进行染色操作&#xff0c;将其周围的…

鸿蒙:1.入门

概述 简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是华为公司发布的一款智能终端系统&#xff0c;是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验&#xff0c;可通过技术手段对应用程序和设备进行智能协同&#xf…

「植物大战僵尸杂交版」保姆级攻略大全以及下载指南

植物大战僵尸杂交版自推出以来&#xff0c;以其独特的植物组合和策略玩法&#xff0c;迅速赢得了玩家们的喜爱。如果你正准备加入这场植物与僵尸的战斗&#xff0c;或者已经在战斗中寻求突破&#xff0c;那么这份保姆级的攻略大全将是你的得力助手。同时&#xff0c;我们也提供…

【收藏级神丹】Liae384_刘亦菲_直播可用,平衡度最高的原创神丹,独家珍稀资源

Liae384_刘亦菲_DFL神丹&#xff1a;点击下载 此丹较重&#xff0c;小卡可以使用但不能训练&#xff0c;实测复训适合24G卡8G、12G、16G卡下载练好的专丹直接使用即可384的Liae对各类杂论视频兼容比较好&#xff0c;高参也能容忍高分辨率的DST复用方式: 非必要不用删除AB&…

解决前后端同一个端口跨域问题

前端起了一个代理 如果url是api开头的自动代理访问8080端口&#xff08;解决前后端端口不一致要么是前端代理&#xff0c;要么是后端加过滤器&#xff09; proxy:{/api:{target:http://localhost:8080,changeOrigin : true,// 替换去掉路径上的api// rewrite:(path)>path.r…

(0)2024年基于财务的数据科学项目Python编程基础(Jupyter Notebooks)

目录 前言学习目标&#xff1a;学习内容&#xff1a;大纲 前言 随着数据科学的迅猛发展&#xff0c;其在财务领域的应用也日益广泛。财务数据的分析和预测对于企业的决策过程至关重要。 本专栏旨在通过Jupyter Notebooks这一强大的交互式计算工具&#xff0c;介绍基于财务的数…

【SqlServer无法远程连接】之解决办法

【SqlServer无法远程连接】之解决办法 打开这个软件&#xff0c;并把对应的项启动即可

Https网站如何申请免费的SSL证书及操作使用指南

前言 在当今互联网环境下&#xff0c;HTTPS已成为网站安全的标配&#xff0c;它通过SSL/TLS协议为网站数据传输提供加密&#xff0c;保障用户信息的安全。申请并部署免费SSL证书&#xff0c;不仅能够提升网站的专业形象&#xff0c;还能增强用户信任。本文将详细介绍如何在知名…

vue 模糊查询加个禁止属性

vue 模糊查询加个禁止属性 父组件通过属性传&#xff0c;是否禁止输入-------默认可以输入

AJAX-day1:

注&#xff1a;文件布局&#xff1a; 一、AJAX的概念&#xff1a; AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用&#xff1a; 使用axios库&#xff0c;与服务器进行数据通信 基于XMLHttpRequest封装&#xff0c;代码简单 Vue,React项目使用 学习…

C++基础22 字符串与字符数组及其相关操作

这是《C算法宝典》C基础篇的第22节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;C基础&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&#xff1a;数据结构啦 ​ 目…

野指针的概念 如果规避野指针

目录 野指针的概念 有关野指针的代码 如何规避野指针 野指针的概念 野指针就是指针指向的位置是不可知的&#xff08;随机的&#xff0c;不正确的&#xff0c;没有明确限制的&#xff09; 有关野指针的代码 指针未初始化&#xff1a; #include<stdio.h> int main…

【全网最全ABC三题完整版】2024年APMCM第十四届亚太地区大学生数学建模竞赛(中文赛项)完整思路解析+代码+论文

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

【fastadmin开发实战】经营数据自动识别录入

项目场景描述&#xff1a;每日录入各个门店的员工经营数据&#xff0c;直接从微信复制报数、系统识别录入。 解决方案&#xff1a;各个门店按照固定的汇报模板进行汇报&#xff08;如福田店有员工1、2、3、4、5号员工&#xff0c;每个员工按模板报数&#xff09; 例如&#xf…

FTP、http 、tcp

HTTP VS FTP HTTP &#xff1a;HyperText Transfer Protocol 超文本传输协议&#xff0c;是基于TCP协议 FTP&#xff1a; File Transfer Protocol 文件传输协议&#xff0c; 基于TCP协议&#xff0c; 基于UDP协议的FTP 叫做 TFTP HTTP 协议 通过一个SOCKET连接传输依次会话数…

《安全行业大模型技术应用态势发展报告(2024)》

人工智能技术快速迭代发展&#xff0c;大模型应用场景不断拓展&#xff0c;随着安全行业对人工智能技术的应用程度日益加深&#xff0c;大模型在网络安全领域的应用潜力和挑战逐渐显现。安全行业大模型技术的应用实践不断涌现&#xff0c;其在威胁检测、风险评估和安全运营等方…

SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断

SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断 目录 SCI一区级 | Matlab实现BO-Transformer-LSTM多特征分类预测/故障诊断效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现BO-Transformer-LSTM特征分类预测/故障诊断&…