三维重建学习(3):张正友相机标定推导

前言

前面的几篇博客中介绍了有关相机标定的基础知识(三维重建学习(1):基础知识:旋转矩阵与旋转向量、三维重建学习(2):相机标定基础)。这次介绍一个十分经典的单目相机标定方法——张正友标定,并给出数学理论推导。

基本方程

模型

我们首先约定如下表示:
二维点坐标: m=[uv] ,三维点坐标: M=XYZ
将上面的二维点和三维点的坐标表示成齐次形式:
二维点坐标: m~=uv1 ,,三维点坐标: M~=XYZ1

参考前面的博客:三维重建学习(2):相机标定基础,我们可以建立一个常见的相机小孔成像模型:

sm~=A[Rt]M~

其中:
A=α00cβ0u0v01

s 为任意比例因子,R t 都是相机外参,R 为旋转矩阵, t 对应三个轴的平移。A 是相机内参, (u0,v0) 是坐标的主点, α β 是图像在 u 轴和v 轴的比例因子, c 是描述两个坐标轴亲倾斜角的参数(注:如果两个坐标轴相互垂直,则c=0 ,即默认情况下这个 c 都是为0的)。

模型平面与图像之间的单应性关系

R的第 i 列旋转矩阵为ri,那么 R 可以表示为:

R=[r1r2r3]

代入原方程中:
suv1=A[r1r2r3t]XYZ1

假设模型平面在世界坐标系中 Z 坐标为0,那么Z 坐标的值都为0:
suv1=A[r1r2r3t]XY01

乘出来都还是0,省略掉这一部分:
s[uv]=A[r1r2t]XY1

此时坐标表示也要变换一下:
二维点坐标: m~=[uv] ,,三维点坐标: M~=XY1

因此点 M 和它在图像上的映射点m之间的关系可以使用单应矩阵 H 来表示:

sm~=HM~

其中:

H=A[r1r2t]

很显然, H 是一个3×3 的矩阵。 A 对应着内参,[r1r2t] 对应着外参。

内参的约束条件

H=[h1h2h3] h1 h2 h3 都是 3×1 的矩阵,各自对应一列。
则有 [h1h2h3]=λA[r1r2t] ,式中 λ 是任意的标量。

我们知道旋转矩阵的每一列两两正交,即 r1 r2 正交。这里不对基础知识赘述,如果有疑问,请查看:旋转矩阵(Rotate Matrix)的性质分析。(吐槽一下:旋转矩阵真的是一个完美的矩阵)
根据 r1 r2 正交,我们能得到条件:

rT1r2=0,r1=r2=1

上面这个条件先放在这里,后面再用。
由前面公式: [h1h2h3]=λA[r1r2t] 一一对应得到方程组:
h1=λAr1h2=λAr2h3=λAt

推出:
{r1=λ1A1h1r2=λ1A1h2

代入前面的条件:
rT1r2=0,r1=r2=1

得到:( λ 是常数)
rT1r2=λThT1ATA1h2λ1=λ2hT1ATA1h2=0

{r12=λ2hT1ATA1h1=1r22=λ2hT2ATA1h2=1λ2hT1ATA1h1=λ2hT2ATA1h2

由上面的式子我们可以发现,对于一个给定的单应性矩阵 H ,对于内参有2个基本的约束条件:λ2hT1ATA1h2=0 λ2hT1ATA1h1=λ2hT2ATA1h2
对于 H 矩阵来说,它是一个3×3的矩阵,有9个参数,那么就有8个自由度。对应的外参有6个(注:旋转矩阵 R 有3个,平移向量t有3个)。到这一步,我们只能得到内参的约束条件,却没法解出来。

解决相机标定

利用约束条件求出内参矩阵 A

好的,还是看一下前面给出的约束条件,注意到中间都有这么一个东西:ATA1
我们试着将它表示出来:令 B=ATA1
我们在最前面给出了 A 的定义:

A=α00cβ0u0v01

计算A的逆矩阵,步骤就省略了,很简单。得到:
A=1α00cαβ1β0v0cu0βαβv0β1

计算出 B 来:
B=1αcαβv0cu0βαβ01βv0β0011α00cαβ1β0v0cu0βαβv0β1=1α2cα2βv0cu0βα2βcα2βc2α2β+1β2c(v0cu0β)α2β2v0β2v0cu0βα2βc(v0cu0β)α2β2v0β2(v0cu0β)2α2β2+v20β2+1

不难发现 B 是对称的,我们可以使用6个变量来表示出B 。定义一个6维向量:
b=B11B12B22B13B23B33

B 可以表示为:
B=B11B12B13B12B22B23B13B23B33

与前面表示旋转矩阵时类似,我们假设 H 的第i 列为: hi=hi1hi2hi3 ,那么 H=[h1h2h3]
对于 hTiBhj ,我们把前面的公式代入看看:
hTiBhj=[hi1hi2hi3]B11B12B13B12B22B23B13B23B33hj1hj2hj3=(hi1B11+hi2B12+hi3B13)hj1+(hi1B12+hi2B22+hi3B23)hj2+(hi3B13+hi2B23+hi3B33)hj3=hi1hj1B11+(hi2hj1+hi1hj2)B12+hi2hj2B22+(hi3hj1+hi1hj3)B13+(hi3hj2+hi2hj3)B23+hi3hj3B33

我们前面已经给出了一个6维向量 b
b=B11B12B22B13B23B33

那么上面那一堆东西可以表示为:
hTiBhj=vTijb

其中:
vij=hi1hj1(hi2hj1+hi1hj2)hi2hj2(hi3hj1+hi1hj3)(hi3hj2+hi2hj3)hi3hj3

回到我们前面推导出的约束条件:
{λ2hT1ATA1h2=0λ2hT1ATA1h1=λ2hT2ATA1h2

这两个约束条件可以改写为齐次形式:
{vT12b=0(v11v22)Tb=0

我们用一个新的矩阵 V 来表示这两个式子:
V=[vT12(v11v22)T]

这里的 V 是一个2×6 的矩阵。约束条件变为: Vb=0
如果观察了n张图片,那么可以得到 n 个方程Vb=0 。我们想要解出 b b 是一个6维向量,要求出唯一解,则至少需要6个方程。一个 Vb=0 有2个约束条件,那么要求出唯一解,至少需要3个 Vb=0 ,即至少需要3张图片( n3 )。
如果我们求出了唯一解 b ,那么就可以得到B ,那就也可以求出相机内参 A (注:使用cholesky分解)。
下面直接给出结果:(已知B ,求解出 A 中的各个参数)
v0=(B12B13B11B23)/(B11B22B212)λ=B33[B213+v0(B12B13B11B23)]/B11α=λ/B11β=λB11/(B11B22B212)c=B12α2β/λu0=cv0/αB13α2/λ

利用内参矩阵 A 求解外参矩阵

通过前面的方法,假设我们已经求到了内参矩阵A
我们使用下面的式子表示点 M 和它在图像上的映射点m之间的关系:

sm~=HM~

如果我们已知图片中的点 m 的坐标,以及点M 在三维空间中的坐标,s又只是个常数,那么我们可以求出单应性矩阵 H
对于已知的单应性矩阵H=[h1h2h3] ,我们有:
[h1h2h3]=λA[r1r2t]

解出外参:
r1=λ1A1h1r2=λ1A1h2t=λ1A1h3

由旋转矩阵的性质得到:
{r3=r1×r2r1=r2=1

这些东西整合一下:
r1=λ1A1h1r2=λ1A1h2r3=r1×r2t=λ1A1h3λ1A1h1=λ1A1h2=1λ=A1h1=A1h2

这样就求出了外参的各项参数。

极大似然估计

普通形式

张正友在论文中提到,前面的这些数学原理和推导并没有太多的物理意义,仅仅是为后面的极大似然优化提供了一个初值。
假设我们得到了模型平面的n幅图片,模型平面上有m个点,假设图像上像素点的噪声服从独立的同一分布,下面给出极大似然优化问题:

i=1nj=1mmijm^(A,Ri,ti,Mj)

其中: m^(A,Ri,ti,Mj) 表示的是点 Mj 在第 i 幅图像上的投影,旋转矩阵R 使用有三个参数的向量 r 表示,r 平行于旋转轴,模长为旋转角度。这里的 R r 关系符合Rodrigue公式(参考前面的博客: 三维重建学习(1):基础知识:旋转矩阵与旋转向量)。
好了,这是一个非线性优化问题,他衡量的是点的实际坐标与估计值的误差,我们期望它尽可能地小。解决这个优化问题有很多种工具,但不是这里的重点,所以不做赘述。只是有一点需要注意,它需要一个 A 的初值,我们使用前面那一大堆公式导出一个猜测值赋给它。为什么这么大费周章?很简单,因为这比随机初始化初值收敛的快得多,有助于加快算法。

径向畸变的处理

如前面的博客:三维重建学习(2):相机标定基础中所说,通常畸变有两种:径向畸变、切向畸变。通常切向畸变可以忽略不计,我们只考虑径向畸变。
(u,v)为点在理想的(无畸变的)像素坐标系中的坐标,令 (u~,v~) 为实际观察到的坐标(有畸变)。同样地,令 (x,y) 表示理想的(无畸变)点在图像坐标系中的坐标, x~,y~ 为实际观察到的坐标(有畸变)。
下面给出张正友在论文中给出的公式:

x~=x[1+k1(x2+y2)+k2(x2+y2)2]y~=y[1+k1(x2+y2)+k2(x2+y2)2]

k1 k2 是径向畸变参数。
从公式: u~=u0+αx~+cy~ v~=v0+βy~ (注:由内参矩阵的参数导出),得到:
u~=u+(uu0)[k1(x2+y2)+k2(x2+y2)2]v~=v+(vv0)[k1(x2+y2)+k2(x2+y2)2]

从上面的式子我们可以得到两个方程:
u~u=(uu0)[k1(x2+y2)+k2(x2+y2)2]v~v=(vv0)[k1(x2+y2)+k2(x2+y2)2]

表示成矩阵形式:
[(uu0)(x2+y2)(vv0)(x2+y2)(uu0)(x2+y2)2(vv0)(x2+y2)2][k1k2]=[u~uv~v]

n 幅图像中各有m 个点,迭代所有的方程会得到一个有 2mn 个方程的方程组。
用矩阵表示来表示这个方程组: Dk=d ,其中 k=[k1k2]
使用最小二乘法求解出 k ,直接套公式:
k=(DTD)1DTd

如此求出了畸变参数后,我们可以回到前面的优化问题中再求解其他参数。

完整形式

下面给出完整的极大似然估计优化问题:

i=1nj=1mmijm^(A,k1,k2,Ri,ti,Mj)

其中: m^(A,ki,kj,Ri,ti,Mj) 表示的是点 Mj 在第 i 幅图像上的投影。
与前面类似,这里依然回一个非线性优化问题。其中内参矩阵A [Rt] 的初始值选取采用前面的方法求出, k1 k2 的选取可以采用上一段的方法。
到这里,整个算法的数学原理已经推导完毕了。
在论文中,张正友还给出了相机标定的程序流程:
三维重建学习(3):张正友相机标定推导_第1张图片
个人感觉用中文翻译意思上总是会有点偏差,姑且还是给出翻译后的流程:

建议采用如下校准步骤:
1. 打印一个图案,并把它贴到一个平面上;
2. 通过移动平面或者相机,从不同的方向拍摄一些图片;
3. 检测图片中的特征点;
4. 采用3.1节所述的方法,估计5个内参和全部的外参;
5. 使用最小二乘法(13)估计径向畸变系数;
6. 最小化优化问题(14),改进所有的参数

这里用到的数学公式全部都在前面介绍了,理应很清楚了,不做赘述。下一篇博客再进行程序实现。

参考资料:

  1. [图像]摄像机标定(2) 张正友标定推导详解
  2. 张正友标定法的真实理解
  3. Flexible Camera Calibration By Viewing a Plane From Unknown Orientations(Zhengyou Zhang)

你可能感兴趣的:(三维重建,三维重建,张正友相机标定)