Single-View Geometry


CV_SingleView

1. Homography 单应变换

homo

Homography converts one Convex Quadrilateral to another,也称 Projective Transform 投影变换

Convex Quadrilateral 凸四边形

四边形的所有内角 <180°,所有对角线都在形状内

Assume the transform from Image B (x,y) Image A (u,v) with homography is HABPGL(3)

w[uv1]pA=[h11h12h13h21h22h23h31h32h33]HAB[xy1]pB
  • 不变量:4个共线点的 cross-ratio

  • 自由度:8 DOF

    对 Homography 进行 scaling 是不会影响其效果的,因此可以 scale with h33

    HABh33=[n11n12n13n21n22n23n31n321]

    这样得到的新矩阵就只有 8个参数了

 

 

 

1.1 投影 v.s. 透视

pers

补充材料里的 Perspectivity (see 3.2.2) 看起来和 Projectivity (Homography) 非常相似,但是二者并不相同,透视只是投影的一种

Perspective TransformHomography
  • Projectivity 是纯数学的二维平面变换

  • Perspectivity 有物理限制,是专门描述三维场景映射到二维平面的变换

 

 

1.1.1 Example 1

现实中,多个 Perspectivity 可以组成一个 Projectivity,但不一定仍然是 一个Perspectivity

proj pers

上图中,Image 1 和 Image 2 是在不同角度拍下的 ABC 的照片

  • Perspectivity

    • ABCabc

    • ABCabc

    这两个变换都遵循了三维到二维的透视投影

  • Projectivity

    • abcabc

    这个变换几乎完全无视物理法则,所以不能直接用 单一的perspectivity 描述了

 

 

1.1.2 Example 2

pers homo ex

  • 左图 Image 1 & Image 2

    相机在不同位置拍摄同一物体得到的图片

    可以通过多个 perspectivity 组合成 perspective homography 用于变换

  • 右图 Image 1 & Image 2

    相机在相同位置旋转后拍摄同一物体得到的图片,有 common center of projection

    但是没有 common plane!两张图片只共同包含了物体的一部分(x 与 x‘),不存在能用 perspectivity 的结构

    只能用 non-perspective homography 变换这两张图的一部分

 

 

 

1.2 矩阵求解 & 图像拼接

1.2.1 Image Stitching

img _stitch

如上图所示,相机绕一个 common center of projection 旋转拍摄三张图片 Π1,Π2,Π3

若想它们投影到一个新的平面 ΠP 上拼接成一张完整的广角图,那就需要如下 Homography

  • HP1Π1ΠP

  • H12Π2Π1

  • H13Π3Π1

Homography 按照需要的变换顺序相乘即可合并

 

 

1.2.2 求解 Homography

常用的方法是 Direct Linear Transformation (DLT)

  • Requirement

    a set of AT LEAST 4 pairs of matching points between Image 1 and Image 2

    match pt

  • Computation

    虽然看起来有 9 个未知参数,但是如 1. 开头所言,homography 可以转化为只有 8 个未知量的矩阵

    w[uv1]=[h11h12h13h21h22h23h31h32h33][xy1]

    展开处理后得到

    {uw=h11x+h12y+h13vw=h21x+h22y+h23w=h31x+h32y+h33{u(h31x+h32y+h33)=h11x+h12y+h13v(h31x+h32y+h33)=h21x+h22y+h23

    整理

    {0=h11x+h12y+h13(h31ux+h32uy+h33u)0=h21x+h22y+h23(h31vx+h32vy+h33v)

    然后变回矩阵

    [xy1000uxuyu000xy1vxvyv]Matching Points (x,y)(u,v)[h11h12h13h21h22h23h31h32h33]=0

    只需要把已有的 Matching Point Pairs 代入上式,然后就可以 Stacking Matrix,最后得到

    • 齐次线性方程组

      求 9 个参数

    [x1y11000u1x1u1y1u1000x1y11v1x1v1y1v1x2y21000u1x2u2y2u2000x2y21v1x2v2y2v210000001]A (Known)[h11h12h13h21h22h23h31h32h33]h (Unknown)=0Ah=0
    • 一般线性方程组

      求 8 个参数

      [x1y11000u1x1u1y1000x1y11v1x1v1y1x2y21000u1x2u2y2000x2y21v1x2v2y210000001]A (Known)[h11h12h13h21h22h23h31h32]h (Unknown)=[u1v1u2v2]B (Known)Ah=B

    这是一个 Overdetermined System of Equations,照着补充材料里介绍的解法求就好了 (see 3.1)

 

 

 

 

 

2. Single-View Geometry 单视几何

2.1 无穷

2.1.0 基础定义
  • 定义:直线

    line

    一条直线 l 可以如此表示

    l:ax1+bx2+c=0lT=[abc]

    变成矩阵形式

    lTx=[abc]l[x1x21]x=0xl

    这种 l 的表达式其实就是 l 在齐次形式下的直线法向量,你从它和直线上点的点乘结果为 0 就可以看出来

  • 定义:交点

    crossing pt

    两条直线 ll 的交点 x

    x=l×l

    证明如下,众所周知 (see 3.3)

    1. Cross Product of two vectors is a vector orthogonal to both

    2. 两个垂直的向量之点乘一定是 0

    因此有

    (l×l)Tl=0xTl=0(l×l)Tl=0xTl=0

    所以 x 一定在 ll 上,即两线之交点

  • 定义:平行线

    设定两条直线

    l:ax1+bx2+c=0l:ax1+bx2+c=0

    变成比较熟悉的形式

    l:x2=abx1cbl:x2=abx1cb

    ll 平行,则一定满足

    ab=ab

 

 

2.1.1 无穷远点 (2D)

设定两条平行线 ll

l:ax1+bx2+c=0l:ax1+bx2+c=0

parallel

则其交点

x=l×l=|ijkabcabc|=[bcbcacacabab]

由于两条线平行,所以有

ab=abab=ababab=0

代入两线交点矩阵可知其第三维一定是 0

x=[bcbcacac0]=[x1x20]

由于 xll 上,因此它一定满足

xTl=0xTl=0

而满足这一条件的只有

x=[ba0] or x=[ba0]

不信你可以代入点在线上的点乘条件看看,方便起见,我们用前者

x=[ba0]

 

 

2.1.2 无穷远线 (2D)

infin line

无穷远线定义式

l=[001]

证明如下,所有无穷远点都可以写成

x=[x1x20]

二者点乘可得

xTl=[x1x20][001]=0

满足点在线上的条件,l 的确是无穷远线

 

 

2.1.3 结论扩张到 3D

无穷远的结论扩张到 3D 空间非常方便

  • 3D 空间的面

    plane

    Π:ax1+bx2+cx3+d=0ΠT=[abcd]

    变成矩阵形式

    ΠTx=[abcd]Π[x1x2x31]x=0xΠ

    这种 Π 的表达式其实就是 Π 在齐次形式下的平面法向量,你从它和平面上点的点乘结果为 0 就可以看出来

  • 无穷远点

    x=[x1x2x30]
  • 无穷远面

    infin plane

    Π=[0001]

 

 

 

2.2 消失

2.2.0 “无穷” 变换

无穷远点 / 线 分别进行 Perspective / Affine Transform

  • 无穷远点

    点到点的变换,pp 通过 H 相互转换

    p=Hp

    使用一个非常简单的无穷远点

    p=[110]
    • Perspective Transform

      H=[Rtv1]Hp=[Rtv1][110]=[pxpypz]

      此时变换后的点的 pz0

      因此:透视变换后无穷远点不再是无穷远点!

    • Affine Transform

      H=[Rt01]Hp=[Rt01][110]=[pxpy0]

      此时变换后的点的 pz=0

      因此:仿射变换后无穷远点仍然是无穷远点!

  • 无穷远线

    线到线的变换

    已知 x 在直线 l 上,x 在直线 l 上,xx 通过 H 相互转换

    xTl=0xTl=0x=Hx

    众所周知,HH1=I,非常好用

    xTl=0xTHTHTl=0(Hx)THTl=0xTHTl=0

    由于 xTl=0,所以

    l=HTl
  • Perspective Transform

    H=[Rtv1]HTl=[Rtv1]T[001]=[lxlylz]

    透视变换后无穷远线不再是无穷远线!

  • Affine Transform

    H=[Rt01]HTl=[Rt01]T[001]=[AT0tTAT1][001]=[001]

    仿射变换后无穷远线仍然是无穷远线!

以上结果其实很好理解:仿射变换会保留平行线的平行性,但是透视变换则不会

 

 

2.2.1 Vanishing Point 影消点

即世界坐标系中的无穷远点 x 通过透视变换映射到 Image Plane 的投影点 p

本部分我们主要关注的透视变换为 Camera Matrix M

影消点对应的是现实世界里的无穷远点,但它本身不是无穷远点

vanishing pt

设定 d=[a,b,c]T 为相机坐标系下平行线的方向

设定 世界坐标系 = 相机坐标系,因此投影所用的 Camera Matrix 为

M=K[I0]

方便起见,设定 v=p

那么影消点 v平行线方向 d 的关系为

v=Mx=K[I0][abc0]=K[abc]=Kd

两种写法都可以

v=Kdd=K1vK1v

 

 

2.2.2 Vanishing Line 影消线

即世界坐标系中的无穷远线 l 通过透视变换 HP 映射到 Image Plane 的投影线 lh

本部分我们主要关注的透视变换为 Camera Matrix M

影消线对应的是现实世界里的无穷远线,但它本身不是无穷远线

vanishing ln

下图中黄色的线为影消线

vanishing ln real

除了Image Plane 上的影消线 lh,上图中还有一个以橙色标记出的平面 Π,这个平面穿过影消线以及相机光心 C

Π=[abcd]

vanishing ln pl

那么影消线 lh穿过影消线的平面 Π 的关系如下

三维世界中 Π 上的点记为 P, 设定 世界坐标系 = 相机坐标系,Camera Matrix 记为 M

M=K[I0]P=[P1P2P3P4]ΠTP=0

二维 Image Plane 中 lh 上的点记为 p

lhTp=0lhT(MP)=0lhT(K[I0]P)=0

与之前的 “点在面上” 公式对比可得

Π=lhTK[I0]=[abc0]

Π 的定义式对比可知此时 d=0

d 在平面法向量里代表 offset,此平面过相机光心,那么 offset = 0 就非常合理了

定义平面法向量 Π方向n(如上图),则有

Π=[abc0]=[n0]n=lhTK

 

2.2.3 Summary
  • Image Plane 上影消点 v 与对应三维世界里平行线方向 d 的关系为

    v=Kdd=K1vK1v
  • Image Plane 上影消线 lh 与对应三维世界里穿过相机光心的平面法向量方向 n 的关系为

    n=lhTK

Remainder: K 为相机内参

 

 

 

2.3 单视重构

2.3.1 两组平行线的夹角

下图中 v 为影消点,x 为影消点对应的无穷远点,d 为无穷远点对应的平行线方向,C 为相机光心

求这两组平行线的夹角 θ

parallel angle

  • 已知

    平行线方向可表示为 (see 2.2.3)

    d=K1vK1v

    两个矩阵点乘可表示为 (see 3.3.1)

    ab=|a||b|cos(θ)
  • 求解

    由于 d 本身就是单位向量,所以不再需要分母上的模了

    cos(θ)=d1d2|d1||d2|=d1d2=K1v1K1v1K1v2K1v2=(K1v1)T(K1v2)(K1v1)T(K1v1)(K1v2)T(K1v2)

    设定 ω=KTK1=(KKT)1,展开整理可得

    cos(θ)=(K1v1)T(K1v2)(K1v1)T(K1v1)(K1v2)T(K1v2)=v1Tωv2v1Tωv1v2Tωv2

以下是一些重要的,能利用的特性

  • 夹角 θ 的性质

    θ=90°

    cos(θ)=0v1Tωv2=0
  • 公式 ω 的性质

    ω=(KKT)1K=[fxfxcot(θ)cx0fy/sin(θ)cy001]

    以下性质与相机 Intrinsic Matrix K 相关

    1. ω对称矩阵

      ω=[ω1ω2ω4ω2ω3ω5ω4ω5ω6]
    2. 若 Image Plane 是零倾斜,则 ω2=0

      θ=90°

    3. 若 Image Plane 是正方形像素,则 ω2=0ω1=ω3

      θ=90°fx=fy

    4. ω 有 5 个自由度

      因为构成 ωK 一共只有 5 DOF

 

 

2.3.2 单视图场景恢复

scene

  • Step 1: 求 Intrinsic Matrix

    从上图可以找出三组相互垂直 (即夹角 θ=90°) 的平行线 v1,v2,v3

    scene with parallels

    依据夹角 θ 的性质一共可以得到三组公式

    {v1Tωv2=0v2Tωv3=0v1Tωv3=0

    但是 Intrinsic Matrix 一共有 5 DOF,光给 3 个公式作为约束是不够的!

    所以额外增加两个假设

    1. Image Plane 零倾斜

    2. Image Plane 为正方形像素

    追加两个新的约束条件

    ω2=0ω1=ω3

    这样一来 ω 就变成只有 3 DOF 了!

    ω=[ω30ω40ω3ω5ω4ω5ω6]

    可以考虑整体除一下 ω6,然后就只有 3 个未知量了,反正对 ω 做 scaling 不会影响其效果

    得到 ω 之后就可以分解,然后得到 Intrinsic Matrix K

    ω=(KKT)1
  • Step 2: 恢复场景平面

    现在有 Intrinisc Matrix K,有 Vanishing Line lh

    取两组同一平面上的平行线的影消点 Vanishing Point,就能找到影消线

    scene vanishing ln

    那么找到相机参考系中的三个场景平面法向量方向 n 就很好求了

    n=KTlh
  • Result

    最后恢复出来一个 可以拖动查看的 3D 平面场景,下图是其中一个视角

    res

 

 

2.3.3 单视重构的弊端

需要很多先验信息:

  • 手动选择 Vanishing Lines / Points

  • 手动判断 点/线/面 对应关系

  • 难以找出以上信息的实体恢复不了

下图中,红框和绿框内的平面可以恢复,但是黄框内的人是恢复不出来的!

scene partial recover

 

 

 

 

 

3. 补充材料

3.1 最小二乘法 Least Squares

The method to solve problems in the form

Ax=b
3.1.1 线性方程组

已知线性方程组

a11x1+a12x2++a1qxq=y1a21x1+a22x2++a2qxq=y2ap1x1+ap2x2++apqxq=yp

转化成 matrix form

Ax=yA=[a11a1qap1apq]p×qx=[x1xq]qy=[y1yp]p

若此时矩阵 A 列满秩,且 p>q 为超定方程组,则此时方程数 > 未知量数,无解

此时可求满足方程组条件的最小二乘解

Axy2=i=1p(ai1x1+ai2x2++aiqxqyp)2x=argminxAxy2

[解法]:

  1. SVD 奇异值分解 A=UDVT

  2. 定义并计算如下内容

    • y~=UTy

    • bbi=y~i/di

      di 为 Diagonal Matrix D 上的第 i 个元素

  3. x=Vb

 

 

3.1.2 齐次线性方程组

已知齐次线性方程组

a11x1+a12x2++a1qxq=0a21x1+a22x2++a2qxq=0ap1x1+ap2x2++apqxq=0

转化成 matrix form

Ax=0A=[a11a1qap1apq]p×qx=[x1xq]q

若此时矩阵 A 列满秩,且 p>q 为超定方程组,则此时方程数 > 未知量数,除 ”0解“ 以外无解

此时可求满足方程组条件的最小二乘解

Axy2=i=1p(ai1x1+ai2x2++aiqxqyp)2x=argminxAxy2s.t. x=1

为何设定 x 的 magnitude = 1?

well,反正 x 的scale 多大多小都不会影响结果为 0,而设定 magnitude = 1 会非常方便

那就这么设定叭 ()

[解法]:

  1. SVD 奇异值分解 A=UDVT

  2. xV 的最后一列

 

 

 

3.2 Projection Geometry 投影变换

3.2.1 仿射变换 Affine Transform

Transformation Matrix 的最后一行保持 [0,1]

2d affine

T=[axbxpxaybypy001]=[Rp01]

不变量:平行线之平行性,平行线之长度比,各区域面积比

自由度:6 DOF

 

 

3.2.2 透视变换 Perspective Transform

Transformation Matrix 的 0 部分变成一个全新的参数组 v

2d perspective

T=[axbxpxaybypyvavb1]=[RpvT1]

不变量:4个共线点的 cross-ratio

自由度:8 DOF

 

 

 

3.3 矩阵点乘 & 叉乘

很难绷,但是我还是写在这里吧

 

3.3.1 矩阵点乘

Given

a=[axayaz]b=[bxbybz]

二者点乘为

ab=[axayaz][bxbybz]=axbx+ayby+azbz

或者用几何上的定义

ab=|a||b|cos(θ)

其值相当于:

向量 a 于向量 b 上之投影的长度 × 向量 b 的长度

 

 

3.3.2 矩阵叉乘

cross product

Given

a=[axayaz]Tb=[bxbybz]T

二者叉乘为

a×b=|ijkaxayazbxbybz|=[aybzazby(axbzazbx)axbyaybx]

或者也可以表示为

a×b=[0azayaz0axayax0][bxbybz]=[aybzazby(axbzazbx)axbyaybx]