• 《计算机视觉中的多视图几何》笔记(6)


    前面的1-5章在序号上被标为Part 0,标题是The Background: Projective Geometry, Transformations and Estimation,讲述了一些背景知识,包括投影几何、变换和估计。接下来的部分进入到Part 1,标题是Camera Geometry and Single View Geometry,这一部分集中在单个视角相机的几何形状上,它包含3章。

    第6章介绍了3D场景空间在2D图像平面上的投影。相机映射由矩阵表示,在映射点的情况下,它是一个 3 × 4 3 \times 4 3×4矩阵 P P P,该矩阵 P P P从3个空间的世界点的齐次坐标到图像平面上成像点的齐次坐标。该矩阵通常具有11个自由度,可以从中提取相机的性能,例如其中心和焦距。特别是,内部摄像机参数(例如焦距和纵横比)封装在 3 × 3 3 \times 3 3×3矩阵 K K K中,该矩阵 K K K是通过简单分解从 P P P获得的。有两种特别重要的相机矩阵类别:1. 有限的摄像机和 2. 其中心在无穷大的相机,例如代表平行投影的仿射相机。

    第7章介绍了摄像机矩阵 P P P的估计,基于给定一组相应的世界和图像点的坐标。本章还介绍了如何有效地将摄像机上的约束结合到估计中,以及一种校正径向镜头失真的方法。

    第8章有3个主要主题。首先,它涵盖了相机对有限点以外的几何对象的作用。这些包括无限的线条,圆锥,四元和点。无穷大的点/线的图像是消失的点/线。第二个主题是摄像机校准,其中计算摄像机矩阵的内部参数 K K K,而没有计算整个矩阵 P P P。特别是描述了内部参数与绝对圆锥的图像的关系,并且校准了来自消失点和消失线的相机。最后的主题是校准锥体,这是一种可视化摄像机校准的简单几何设备。

    6 Camera Models

    主要介绍两种摄像机模型:1.光心在有穷点 2. 光心在无穷点,也叫仿射摄像机。

    6.1 Finite cameras

    我们先从pinhole camera讲起,然后一步步推广。
    在这里插入图片描述
    假设在相机坐标系下有一点 X = ( X , Y , Z ) T X=(X,Y,Z)^{T} X=(X,Y,Z)T,由于摄像机的平面在 Z = f Z=f Z=f f f f就是焦距,那么 ( X , Y , Z ) T (X,Y,Z)^{T} (X,Y,Z)T就变到了 ( f X / Z , f Y / Z , f ) T (fX/Z,fY/Z,f)^{T} (fX/Z,fY/Z,f)T,忽略最后一项,就成了 ( f X / Z , f Y / Z ) T (fX/Z,fY/Z)^{T} (fX/Z,fY/Z)T,在图像坐标系下就是这样表达的。倘若我们使用齐次坐标来表达,那么中心投影就可以轻松地表示为它们的齐次坐标之间的线性映射,写成矩阵就是如下形式:

    ( f X f Y Z ) = [ f 0 f 0 1 0 ] ( X Y Z 1 ) \left( \begin{matrix} fX\\ fY\\ Z\\ \end{matrix} \right)= \left[ \begin{matrix} f & & & &0 \\ & f & & &0 \\ & & & 1 &0 \end{matrix} \right] \left( \begin{matrix} X\\ Y\\ Z\\ 1 \end{matrix} \right) fXfYZ = ff1000 XYZ1

    到了图像坐标系以后,我们下面继续转换,到像素坐标系。
    上面的表达式其实假设了图像平面中的坐标原点位于主点。 实际上,可能不是,如下图所示,会有一个偏置。所以一般来说有一个映射。
    在这里插入图片描述

    ( X , Y , Z , 1 ) (X,Y,Z,1) (X,Y,Z,1)就变成了 ( f X / Z + p x , f Y / Z + p y ) (fX/Z+p_x,fY/Z+p_y) (fX/Z+px,fY/Z+py) ( p x , p y ) (p_x,p_y) (px,py)就是摄像机的光心。我们使用齐次坐标来表达映射:

    ( f X + Z p x f Y + Z p y Z ) = [ f p x 0 f p y 0 1 0 ] ( X Y Z 1 ) \left( \begin{matrix} fX+Zp_{x}\\ fY+Zp_{y}\\ Z\\ \end{matrix} \right)= \left[ \begin{matrix} f & & p_x&0 \\ & f & p_y&0 \\ & & 1 &0 \end{matrix} \right] \left( \begin{matrix} X\\ Y\\ Z\\ 1 \end{matrix} \right) fX+ZpxfY+ZpyZ = ffpxpy1000 XYZ1

    我们可以令:

    K = [ f p x f p y 1 ] K= \left[ \begin{matrix} f & & p_x \\ & f & p_y \\ & & 1 \end{matrix} \right] K= ffpxpy1

    那么就可以化简为:
    x = K [ I ∣ 0 ] X c a m x = K[I | 0]X_{cam} x=K[I∣0]Xcam

    K就是摄像机的camera calibration matrix,也就是内参

    最后,我们还需要从世界坐标系转换到相机坐标系,所以有一个旋转加平移的矩阵。

    在这里插入图片描述
    ( f X f Y Z ) = [ f p x 0 f p y 0 1 0 ] [ R t 0 1 ] ( X Y Z 1 ) \left( \begin{matrix} fX\\ fY\\ Z\\ \end{matrix} \right)= \left[ \begin{matrix} f & & p_x&0 \\ & f & p_y&0 \\ & & 1 &0 \end{matrix} \right] \left[ \begin{matrix} R & t \\ 0 & 1 \end{matrix} \right] \left( \begin{matrix} X\\ Y\\ Z\\ 1 \end{matrix} \right) fXfYZ = ffpxpy1000 [R0t1] XYZ1

    其中
    [ R t 0 1 ] \left[ \begin{matrix} R & t \\ 0 & 1 \end{matrix} \right] [R0t1]

    就是相机的外参

    把整个摄像机矩阵 K R [ I ∣ − C ~ ] KR[I|-\widetilde{C}] KR[IC ]写成 P P P P P P就是一个 3 × 4 3 \times 4 3×4的矩阵。这个 P P P有9个自由度, K K K贡献了3个( f , p x , p y f,p_{x},p_{y} f,px,py), R R R贡献了3个, C ~ \widetilde{C} C 也贡献了3个。

    刚刚导出的针孔相机模型假设图像坐标是在两个轴向上具有相等尺度的欧几里得坐标。 对于 CCD 相机,还可能存在非方形像素。 如果图像坐标以像素为单位测量,那么这会产生在每个方向上引入不相等的比例因子 m x , m y m_{x},m_{y} mx,my的额外效果,如下所示:

    K = [ a x x 0 a y y 0 1 ] K= \left[ \begin{matrix} a_{x} & & x_{0}\\ & a_{y} & y_{0}\\ & & 1 \end{matrix} \right] K= axayx0y01

    其中 a x = f m x a_{x}=fm_{x} ax=fmx a y = f m y a_{y}=fm_{y} ay=fmy表示焦距,而 x 0 = m x p x x_{0}=m_{x}p_{x} x0=mxpx y 0 = m y p y y_{0}=m_{y}p_{y} y0=mypy表示中心点坐标。因此,CCD相机就有10个自由度。

    接下来推广到更普遍的情况,终于来到了finite projective camera。

    相机内参有时候会加一个偏斜系数(skew parameter),因为相机的两个轴可能不是完全垂直的。当然了,大部分情况下都是垂直的。此时矩阵如下:

    K = [ a x s x 0 a y y 0 1 ] K= \left[ \begin{matrix} a_{x} & s & x_{0}\\ & a_{y} & y_{0}\\ & & 1 \end{matrix} \right] K= axsayx0y01

    因此,此时finite projective camera的自由度就是11了。此时它的自由度已经和一个定义为任意比例的 3 × 4 3 \times 4 3×4的矩阵一样了。

    我们注意到摄像机矩阵 P P P中的左边的 3 × 3 3 \times 3 3×3子矩阵,也就是 K R KR KR,是一个非奇异矩阵。反过来,任何一个 3 × 4 3 \times 4 3×4的矩阵都可以是finite摄像机矩阵,只要左边 3 × 3 3 \times 3 3×3的子矩阵不是奇异矩阵就可以。

    如果你说非要左边子矩阵是奇异矩阵呢?你说非要,这本书也讲得很明白:如果该矩阵是奇异矩阵,那么该摄像机模型就是general projective camera。我们终于推广到了最后一步,移除了这个限制。

    那么我们把 P P P写成 P = [ M ∣ p 4 ] P=[M|p_4] P=[Mp4] p i p_i pi代表列。将摄像机性质总结如下:

    1. 光心位置 C C C M M M不奇异,则 C = ( − M − 1 p 4 , 1 ) T C=(-M^{-1}p_4,1)^T C=(M1p4,1)T C C C是奇异矩阵则 C = ( d , 0 ) T C=(d,0)^T C=(d,0)T
    2. p 1 , p 2 , p 3 p_1,p_2,p_3 p1,p2,p3 x , y , z x,y,z x,y,z轴的消失点, p 4 p_4 p4是相机坐标系的原点
    3. P P P的最后一行,也就是 P 3 P^{3} P3,是主平面
    4. P P P的第一第二行,也就是 P 1 , P 2 P^{1},P^{2} P1,P2,是轴平面
    5. 主点是 x 0 = M m 3 x_{0}=Mm^3 x0=Mm3 m 3 T m^{3T} m3T就是相机矩阵第三行
    6. 主光线(主轴)穿过光心 C C C方向为 m 3 T m^{3T} m3T的线,主轴矢量 v = d e t ( M ) m 3 v = det(M)m^{3} v=det(M)m3指向相机的前方

    6.2 The projective camera

    6.2.1 Camera anatomy

    下面我们详细说明一下相机的各个关键词。

    相机中心 P P P的rank是3,那么它就有一个1维的零空间C,满足 P C = 0 PC=0 PC=0,这个 C C C就是相机的中心
    列向量 前三个列向量是消失点,最后一个列向量是世界原点
    行向量 行向量代表平面
    主平面 主平面就是通过相机中心并且与成像平面平行的平面
    主轴 主轴通过主平面并且与其垂直交点是相机中心

    6.2.2 Action of a projective camera on points

    空间点 X X X投影到 x = P X x=PX x=PX,图像点 x x x反投影就形成了一个射线 X ( λ ) = P + x + λ C X(\lambda)=P^{+}x + \lambda C X(λ)=P+x+λC
    在这里插入图片描述

    6.2.3 Depth of points

    我们有一个三维的空间点 X = ( X , Y , Z , T ) T X=(X,Y,Z,T)^T X=(X,Y,Z,T)T,finite camera的摄像机矩阵 P = [ M ∣ p 4 ] P=[M|p_4] P=[Mp4],我们假设 P ( X , Y , Z , T ) T = w ( x , y , 1 ) T P(X,Y,Z,T)^T=w(x,y,1)^{T} P(X,Y,Z,T)T=w(x,y,1)T,那么

    d e p t h ( X ; P ) = s i g n ( d e t M ) w T ∣ ∣ m 3 ∣ ∣ depth(X;P)=\frac{ sign(det M)w }{T||m^3||} depth(X;P)=T∣∣m3∣∣sign(detM)w

    是相机主平面前面 X X X点的深度。

    该公式是确定点 X X X是否位于相机前方的有效方法。 可以把点 X X X或相机矩阵 P P P乘以常数因子 k k k来验证深度 ( X ; P ) (X; P) (X;P)的值是不变的。 因此,深度 ( X ; P ) (X; P) (X;P) X X X P P P的特定齐次表示无关。

    6.2.4 Decomposition of the camera matrix

    令P为代表general projective camera的摄像机矩阵,我们希望从P中找到相机中心、相机的方向以及相机的内部参数。

    寻找相机中心 假设中心 C = ( X , Y , Z , T ) T C=(X,Y,Z,T)^T C=(X,Y,Z,T)T,有以下公式可以计算出 C C C

    X = d e t ( [ p 2 , p 3 , p 4 ] ) X=det([p_2,p_3,p_4]) X=det([p2,p3,p4])

    Y = − d e t ( [ p 1 , p 3 , p 4 ] ) Y=-det([p_1,p_3,p_4]) Y=det([p1,p3,p4])

    Z = d e t ( [ p 1 , p 2 , p 4 ] ) Z=det([p_1,p_2,p_4]) Z=det([p1,p2,p4])

    T = − d e t ( [ p 1 , p 2 , p 3 ] ) T=-det([p_1,p_2,p_3]) T=det([p1,p2,p3])

    查找相机方向和内部参数 对于有限相机, P = [ M ∣ − M C ^ ] = K [ R ∣ − R C ^ ] P=[M|-M\hat{C}]=K[R|-R\hat{C}] P=[MMC^]=K[RRC^]。所以直接把 M M M Q R QR QR分解就可以了。
    在这里插入图片描述

    6.2.5 Euclidean vs projective spaces

    到目前为止,各部分的发展其实隐含地假设世界和图像坐标系是欧几里得坐标系。 借鉴了射影几何的思想(例如对应于 π ∞ \pi_{\infin} π 上的点的方向),并且齐次坐标的方便表示法允许中心投影以线性方式表示。

    重要的是要记住,相机是欧几里得设备,仅仅因为我们有相机的投影模型,并不意味着我们应该回避欧几里德几何的概念。

    6.3 Cameras at infinity

    现在我们开始重点讨论摄像机矩阵中左边 3 × 3 3 \times 3 3×3的子矩阵为奇异矩阵的情况。无限远相机可以大致分为两种不同类型:仿射相机和非仿射相机。 我们首先考虑实践中最重要的仿射类相机。

    6.3.1 Affine cameras

    无穷远处摄像机的意思是 P P P左边 3 × 3 3 \times 3 3×3的子矩阵是奇异的。这种摄像机可以分成两类:仿射摄像机和非仿射摄像机。

    仿射摄像机的定义是 P P P最后一行是(0,0,0,1),因为无穷远点被映射到无穷远点。

    一个理解的方式,我们可以想象摄像机主点往无穷远处移动,同时摄像机的焦距逐渐增大,主点到了无穷远,最后一行自然成了 ( 0 , 0 , 0 , 1 ) (0,0,0,1) (0,0,0,1)

    6.3.2 Error in employing an affine camera

    一个点,投影到仿射摄像机和普通摄像机上的坐标是有差别的。点离摄像机越远,点越会偏离主点。

    6.3.3 Decomposition of P ∞ P_{\infin} P

    其矩阵可以写成如下形式:
    P ∞ = [ K 2 × 2 x 0 0 1 ] [ R t 0 1 ] P_{\infin}=\left[ \begin{matrix} K_{2 \times 2} & x_{0} \\ 0& 1 \end{matrix} \right] \left[ \begin{matrix} R & t \\ 0& 1 \end{matrix} \right] P=[K2×20x01][R0t1]

    左边的矩阵就是内参。

    6.3.4 A hierarchy of affine cameras

    6.3.5 More properties of the affine camera

    仿射摄像机就是摄像机的中心在无穷远,主平面也在。或者说 P P P左边 3 × 3 3 \times 3 3×3的子矩阵是奇异矩阵,因为最后一行是0。但是还有一种情况,就是该子矩阵是奇异的,但是最后一行不是0,那就是说相机中心在无穷远,但是主平面不在。

    6.3.6 General cameras at infinity

    在这里插入图片描述

    6.4 Other camera models

    简单介绍了两种其他相机模型。

    6.4.1 Pushbroom cameras

    6.4.2 Line cameras

  • 相关阅读:
    【面经】被虐了之后,我翻烂了equals源码,总结如下
    linux 下安装安装rzsz命令
    利用clone快速复制对象
    MySQL数据库 -- 表的约束
    探索无界知识:用 ChatGPT 的原理学习任何事物!
    【MySQL高级】索引
    分享几个bug发现手段-final chk、default test、stress test、fault injection
    【云原生之Docker实战】使用Docker部署planka项目管理工具
    linux 下如何通过 GDB 调试,查崩溃
    JS算法与树(二)
  • 原文地址:https://blog.csdn.net/YuhsiHu/article/details/133050180