课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 。视频评论区可以找到课程所使用课件与练习题的下载地址。

第3章介绍了透视投影、相机内参、畸变矫正、原像与余像的概念。

1. 数学表示

1.1 从相似三角形开始

用一张图表示相机成像的光学过程(小孔成像)。

图中 \(F_l\) 与 $ F_r $ 是焦点,焦点即垂直通过透镜的光线的汇集点。

图中蓝色标明的三角形与红色标明的三角形相似:

\[ {Y \over y} = - {Z \over f} \]

同理在像平面另一个方向 \(X\) 轴上也有三角形相似:

\[ {X \over x} = - {Z \over f} \]

式子中存在负号是因为成的像是倒像,与原像是中心对称的关系。这样计算很不方便,于是将成像平面从焦点 \(F_r\) 的后侧移动到焦点的前侧,并且翻转,于是有:

\[ \begin{cases} x = f{X \over Z} \\ y = f{Y \over Z} \end{cases} \]

翻转之后的成像如下所示:

总结一下,透视投影是将三维点坐标投影到平面形成二维点坐标:

\[ \pi: \mathbb{R}^3 \rightarrow \mathbb{R}^2; \mathbf{X} \mapsto \mathbf{x} = \pi(\mathbf{X}) = \begin{bmatrix} f {X \over Z} \\ f {Y \over Z} \end{bmatrix} \]

以上是使用薄透镜时的透视原理,使用厚透镜时光线在透镜内部存在不可忽略不计的折射,需要进行变形纠正。

1.2 矩阵表示

将投影过程在齐次坐标下用矩阵表示:

\[ Z \mathbf{x} = 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} = K_f \Pi_0\mathbf{X} \]

这里引入了两个新的矩阵 $ K_f, \Pi_0 $:

\[ K_f \equiv \begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{bmatrix}; \Pi_0 \equiv \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \]

$ \Pi_0 $ 被称作标准投影矩阵(Standard Projection Matrix),作用是将齐次坐标转化为非齐次坐标。

假设物体离相机很远,其景深 \(Z\) 为常数 \(\lambda\)。景深一定是正数,因为相机成像的物体在焦点(上图中的 $ F_l $)之前,所以有 $ \lambda \gt 0 $。我们得到投影过程的简洁形式:

\[ \lambda \mathbf{x} = K_f\Pi_0\mathbf{X} \]

其中 \(\mathbf{x}\) 是相机投影平面坐标(单位m),\(\mathbf{X}\) 是三维点在相机坐标系中的坐标。

1.3 从世界坐标系到相机投影平面

上式中的 \(\mathbf{X}\) 是相机坐标系坐标,将相机的位姿加入考虑范围,求世界坐标系坐标到相机投影平面坐标系的坐标。

由上一章的内容可知,相机当前坐标系坐标与世界坐标系坐标之间的转换关系如下:

\[ \mathbf{X} = g\mathbf{X_0} = \begin{bmatrix} R & T \\ 0 & 1 \end{bmatrix}\mathbf{X_0} \]

所以从世界坐标系坐标到相机投影平面坐标系坐标的转换关系为

\[ \lambda \mathbf{x} = K_f\Pi_0g\mathbf{X_0} \]

还可以做进一步的简化,如果将相机投影平面坐标系的单位长度设置为焦距 \(f\),那么 \(K_f\) 为单位阵,公式可化简为

\[ \lambda \mathbf{x} = \Pi_0g\mathbf{X_0} \]

2. 相机内参

上面的公式推导是世界坐标系坐标转化为相机投影平面坐标系坐标,相机投影平面坐标系坐标的单位是 m,但使用相机拍摄的影像时我们读取的是像素坐标,所以还需要进一步的坐标转换。进一步的坐标转换如下:

\[ \lambda \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} s_x & s_{\theta} & o_x \\ 0 & s_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} \]

这里引入了新的矩阵 \(K_s\)

\[ K_s \equiv \begin{bmatrix} s_x & s_{\theta} & o_x \\ 0 & s_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \]

矩阵 $ K_s $ 中各个参数的解释如下:

  1. \(o_x, o_y\) 相机相主点在相机投影平面坐标系下的像素坐标,单位为 pixel;
  2. \(s_x (s_y)\) 在 \(x(y)\) 方向上单位长度包含的像素个数,单位为 pixel / m;
  3. \(s_{\theta}\) 在像素形状为矩形时值为0,像素形状为平行四边形时值不为0,一般像素形状都为矩形,该值为0。

定义相机内参矩阵为

\[ K \equiv K_sK_f = \begin{bmatrix} fs_x & fs_{\theta} & o_x \\ 0 & fs_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \]

将 $ K $ 代入上面的公式

\[ \lambda \mathbf{x'} = K\Pi_0\mathbf{X} = K\Pi_0g\mathbf{X_0} \equiv \Pi \mathbf{X_0} \]

这里定义了一个新的矩阵 \(\Pi \equiv K \Pi_0 g = \begin{bmatrix} KR & KT \end{bmatrix}\) ,称作一般投影矩阵(General Projection Matrix),可将世界坐标转化为像素坐标。

3. 球面投影

小孔相机的透视模型是将影像投影在平面上,同样的影像也可以投影在球面上。

将影像投影到单位球面 $ \mathbb{S}^2 \equiv \left{x \in \mathbb{R}^3 \right.\left | |x| = 1\right} $ 上,球面投影 \(\pi_s\) 可以表示为

\[ \pi_s: \mathbb{R}^3 \rightarrow \mathbb{S}^2; \mathbf{X} \mapsto \mathbf{x} = {\mathbf{X} \over \| \mathbf{X} \|} \]

\[ \lambda \mathbf{x'} = K\Pi_0g\mathbf{X_0} \]

其中 $ \lambda = | \mathbf{X} | = \sqrt{X^2 + Y^2 + Z^2} $

4. 径向畸变

径向畸变(Radial Distortion)是影像中以 \((o_x, o_y)\) 为中心的投影畸变,投影畸变发生在以该点为起点的射线上。畸变影像上距离该点距离相同的点,在正常影像上距离该点的距离也相同,即镜像畸变保持到 $ (o_x, o_y) $ 的距离不变。

下图是径向畸变的示意(图片来源 TUM 课程 Slides):

径向畸变是非线性畸变(需要平方坐标以计算径向距离),使用多项式拟合径向畸变以纠正。

\[ \begin{cases} x = x_d (1 + a_1 r^2 + a_2 r^4) \\ y = y_d (1 + a_1 r^2 + a_2 r^4) \end{cases} \]

$ \mathbf{x_d} \equiv (x_d, y_d) $ 是畸变影像的投影平面坐标,$ (x, y) $ 是纠正后的像素坐标,$ r^2 = x^2_d + y^2_d $。这个公式纠正径向畸变需要先使用相机内参矩阵将确定相机成像中心的像素坐标,从而确定相机投影平面坐标系,量测出正确的 $ \mathbf{x_d} $ 。

一种自由度更高的投影纠正模型如下

\[ \mathbf{x} = c + f(r)(\mathbf{x_d} - \mathbf{c}); f(r) = 1 + a_1 r + a_2 r^2 + a_3 r^3 + a_4 r^4 \]

$ r = | \mathbf{x_d} - \mathbf{c} | $ 是影像点距离任意一中心点 $ \mathbf{c} \(的距离,\)\mathbf{c}$ 是一个待求量。

计算径向畸变参数利用现实世界中的直线(图中的书架存在直线),本应是直线的线在影像中却是弧线,使用这种对应关系进行计算。

5. 原像与余像

原像(Preimage)的意义与函数映射中的原像类似。

原像是相对于影像中的一个像(比如说影像中的一个点,或一条线,或一个形状)在现实世界中对应的区域。可以用函数映射的方式进行理解,假设有函数 \(y = f(x)\),$ y $ 的原像就是 \(x\)。本质上投影就是 $ \pi: \mathbb{R}^3 \rightarrow \mathbb{R}^2 $ 的过程,这就是一个函数映射。

余像(Coimage)在函数映射中我也不清楚。在线性代数中是与原像共同组成整个线性空间的向量。

在讨论原像与余像之前,需要了解空间中的一条直线如何定义。空间中的一条直线 \(L\) 可以通过直线上的一点 $ \mathbf{X_0} = (X_0, Y_0, Z_0, 1)^T \in \mathbb{R}^4 $ 和一个方向 $ \mathbf{V} = (V_1, V_2, V_3, 0)^T $ 定义:

\[ \mathbf{X} = \mathbf{X_0} + \mu \mathbf{V}, \mu \in \mathbb{R} \]

这条直线的像可以用投影公式给出:

\[ \mathbf{x} \sim \Pi_0 \mathbf{X} = \Pi_0(\mathbf{X_0} + \mu \mathbf{V}) \]

将所有的点 \(\mathbf{x}\) 当做向量,这些向量张成的二维子空间是直线 \(L\) 的原像。对应的,与该二维子空间垂直的向量是直线 \(L\) 的余像。

成像平面上的一条直线 \(L\) 一般使用其余像进行描述,假设其余像为 $\mathscr{l} \in \mathbb{R}^3 $,余像与原像垂直,直线上的点 \(\mathbf{x}\) 在原像中,所以有

\[ \mathscr{l}^T \mathbf{x} = 0 \]

直线 \(L\) 的原像是与其余像垂直的平面,设其原像是 \(P\),则

\[ P = span(\hat{\mathscr{l}}) \]

\[ \hat{\mathscr{l}}\mathscr{l} = \mathscr{l} \times \mathscr{l} = 0 \]

$ \mathscr{l} $ 的秩为2,其张成的线性空间的维度为2,表示一个平面。

同理可知影像上一个点 \(\mathbf{x}\) 的原像与余像。

影像上点的原像是一条射线,连接相机成像中心与影像上这一点形成的射线。如图所示,图中红色点的原像是图中绿色的射线,绿色射线上的点经投影形成的像是红色的点。绿色射线是三维线性空间的一维子空间,可以用一个向量表示。图中红色点的余像是与其原像垂直的二维子空间(平面),在图中未画出。

影像上线的原像是一个平面,取影像线的两个端点,分别做从成像中心到这两个点的连线形成两条射线。如图所示,取红色线的两个端点,连接相机成像中心到这两个点,形成两条蓝色射线,夹在两条射线间面上的点经投影会落在影像线上。直线的原像是这两条蓝色射线对应向量张成的二维子空间,余像是一维子空间。

最后整理一下像(image)、原像(preimage)、余像(coimage)之间的关系(表格图片来源 TUM 课程 Slides):

\[ image = preimage \cap image plane, \quad preimage = span(image) \]

\[ preimage = coimage^{\bot}, \quad coimage = preimage^{\bot} \]

6. 透视几何

在齐次坐标系下可以使用一个四维向量的集合表示一个三维点:

\[ \mathbf{X} = (XW, YW, ZW, W) \in \mathbb{R}^4 \]

这种表示方法中只有方向是重要的,比例系数 \(W\) 不重要。对于所有的 \(W \in \mathbb{R}\) 的取值,$ \mathbf{X} $ 表示同一个点。这些所有只有 $ W $ 不同的向量只相差一个数值因数,它们被称为相等(equivalent):

\[ \mathbf{X} \sim \mathbf{Y} \]

An n-dimensional projective space $ \mathbb{P}^n $ is the set of all one-dimensional subspaces (i.e. lines through the origin) of the vector space \(\mathbb{R}^{n+1}\).

上面这一句话的意思是 n 维透视空间是 n+1 维线性空间的所有 1 维子空间的集合。可以想象从原点引出无数条射线(像刺猬一样,当然刺猬的身体不是一个点),同一条射线上的线在透视空间中是等价的,所以 2 维透视空间是三维透视空间这些射线的集合,3 维线性空间不同射线相当于 2 维透视空间中的一个点。

但是对于现实世界的三维线性空间 \(\mathbb{R}^3\) 对应的透视空间是 $ \mathbb{P}^2 $。

表示透视空间中的一个点有两种方式:

  1. 对应着小孔成像的平面投影,将三维点投影到一个平面上,平面上的 \(z\) 处处相等,所以点坐标表示为 $ (x, y, z), z = constant $;
  2. 对应着球面投影,将三维点投影到一个单位球面 \(\mathbb{S}^2\) 上,球面上所有点的范数相等,所以点坐标表示为 $ (x, y, z), \sqrt{x^2 + y^2 + z^2} = 1 $。

【多视图几何】TUM 课程 第3章 透视投影的更多相关文章

  1. 【多视图几何】TUM 课程 第6章 多视图重建

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  2. 【多视图几何】TUM 课程 第5章 双视图重建:线性方法

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  3. 【多视图几何】TUM 课程 第4章 同名点匹配

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  4. 【多视图几何】TUM 课程 第2章 刚体运动

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  5. 【多视图几何】TUM 课程 第1章 数学基础:线性代数

    在 YouTube 上找到了慕尼黑工业大学(Technische Universitaet München)计算机视觉组 Daniel Cremers 教授的 Multiple View Geomet ...

  6. javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...

  7. C#入门到精通系列课程——第3章变量及运算符

    ◆本章内容 (1)变量是什么 (2)变量的声明及初始化 (3)常量 (4)运算符 (5)数据类型转换 (6)运算符优先级及结合性 (7)难点解答 ◆本章简述 很多人认为学习C#之前必须要学习C++,其 ...

  8. C#入门到精通系列课程——第2章编写C#程序

    ◆本章内容 (1)熟悉Visual Studio 2017开发环境 (2)编写第一个C#程序 (3)C#程序结构预览 (4)程序编写规范 (5)难点解答 ◆本章简述 要学习C#编程,必然要熟悉C#程序 ...

  9. C#入门到精通系列课程——第1章软件开发及C#简介

    ◆本章内容 (1)了解软件 (2)软件开发相关概念 (3)认识.NET Framework (4)C#语言 (5)Visual Studio 2017 ◆本章简述 软件在现代人们的日常生活中随处可见, ...

随机推荐

  1. MDN & IRC

    MDN IRC MDN IRC xgqfrms https://developer.mozilla.org/en-US/docs/Mozilla/QA/Getting_Started_with_IRC ...

  2. linux下tomcat、jenkins环境搭建

    1.安装JDK  我不列出来了,自行百度 java -version 2.安装tomcat (1)将下载的tomcat压缩包 tar -zxvf apache-tomcat-8.5.29.tar.gz ...

  3. 第215天:Angular---指令

    指令(Directive) AngularJS 有一套完整的.可扩展的.用来帮助 Web 应用开发的指令集 在 DOM 编译期间,和 HTML 关联着的指令会被检测到,并且被执行 在 AngularJ ...

  4. 关于nginx的一点记录

    (1) 安装nginx官网下载:http://nginx.org下载适合Windows的安装包,是一个压缩包,直接解压就可以了. (2) 启动nginx有三种方式启动:a. 双击nginx.exe图标 ...

  5. 【刷题】BZOJ 1537 [POI2005]Aut- The Bus

    Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个 ...

  6. 【JQuery】DOM元素

    一.前言         接着上一章的内容,继续本章的学习. 二.内容 .get 获得由选择器指定的DOM元素, 可输入匹配元素的index编号 $(selector).get(index) .ind ...

  7. 51nod 1208 窗上的星星 | 线段树 扫描线

    51nod 1208 Stars In Your Window 题面 整点上有N颗星星,每颗星星有一个亮度.用一个平行于x轴和y轴,宽为W高为H的方框去套星星.套住的所有星星的亮度之和为S(包括边框上 ...

  8. 【Cf #502 H】The Films(莫队)

    题面的简述:总共有$m$种书,书架上共有$n$本书,给出$n$本书的种类,并有$Q$个询问,每次询问给出$l, r, k$.每次询问时都会先出现$k * m$本书,每种书各$k$本,然后再加入书架上的 ...

  9. 【NOI 2018】归程(Kruskal重构树)

    题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...

  10. bzoj 4871: [Shoi2017]摧毁“树状图”

    4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec  Memory Limit: 512 MBSubmit: 53  Solved: 9[Submit][Status ...