本文将介绍张正友于 2000 年提出的一种被广泛使用的相机标定方法。
使用该方法时,标定物可视为一个平面,而世界坐标系到图像坐标系的映射可以简化为单应矩阵(Homography)。
相机投影矩阵 P 的简化
在上一篇中,我们已经知道如何将世界坐标系中的三维点映射为图像中的像素:
X~i∼K[R∣t]X~w=Kr11r21r31r12r22r32r13r23r33txtytzX~w=K[r1r2r3t]XwYwZw1
其中 X~i=(x,y,1)T,X~w=(Xw,Yw,Zw,1)T。符号 ∼ 表示两个齐次坐标只相差一个非零尺度。
在张正友标定法中,标定物可视为平面。我们把世界坐标系建立在标定板上,使标定平面满足 Zw=0。只有在这个坐标系选择下,才能把 X~w 中的 Zw 在计算中省略;相应地,矩阵中的 r3 也可去除。于是有
X~i∼K[r1r2r3t]XwYwZw1=K[r1r2t]XwYw1
用 M 表示 (Xw,Yw)T,M~ 表示 (Xw,Yw,1)T,则
H∼K[r1r2t]
X~i∼HM~
这里的矩阵 H 是一个单应矩阵,求解 (4) 即可得到 H 的估计。
通过调用 cv::findHomography() 之类的函数即可轻松求得单应矩阵 H。
因为 H 有 8 个自由度,而每个点提供 2 个观测(x 和 y),所以至少需要 4 个点,并且其中任意 3 个点不能共线。实际标定通常使用更多角点,并通过归一化 DLT 或带鲁棒估计的方法计算 H。
得到 H 后,我们便可以进一步通过 H 来得到 K。
内参的约束
根据 (3),有
H=[h1h2h3]∼K[r1r2t]
估计得到的 H 只确定到尺度。选定 H=[h1 h2 h3] 的一个代表后,存在非零尺度 λ,使
[r1r2t]=λK−1H.
因为 r1 与 r2 正交且各自都已单位化,即
r1⋅r2=r1Tr2=0
∥r1∥=∥r2∥=1
由上面的尺度关系和正交关系,有
λK−1[h1h2h3]=[r1r2t](λK−1h1)T(λK−1h2)=0
h1TK−TK−1h2=0
由上面的尺度关系和单位范数条件可知,两个向量的范数相等:
∥K−1h1∥2=∥K−1h2∥2=λ21(K−1h1)T(K−1h1)=h1TK−TK−1h1(K−1h2)T(K−1h2)=h2TK−TK−1h2
h1TK−TK−1h1−h2TK−TK−1h2=0
蓝色高亮的两个式子,便是给定一个单应矩阵时,内参所满足的两个基本约束。
定义 B 为
B=K−TK−1
上述约束可简写为
h1TBh2=0
以及
h1TBh1−h2TBh2=0
估计相机标定矩阵 K
B=K−TK−1 本身总是对称正定矩阵,因此,只要从数据中估计出的 B 仍然正定,便可以通过 Cholesky 分解恢复矩阵 K:
B=AAT
其中 A=K−T。换句话说,如果已知 B 的一个正定代表,我们便可通过矩阵分解求出 K,再消除其未知整体尺度。
因此我们先尝试通过 H 得到 B。
由于 B 对称(矩阵与其转置之积总是对称矩阵),
B=b11b12b13b12b22b23b13b23b33
可写为 6 维向量:
b=(b11,b12,b13,b22,b23,b33)T
展开正交约束,有
h1TBh2=[h11h21h31]b11b12b13b12b22b23b13b23b33h12h22h32=[h11h21h31]h12b11+h22b12+h32b13h12b12+h22b22+h32b23h12b13+h22b23+h32b33=h11(h12b11+h22b12+h32b13)+h21(h12b12+h22b22+h32b23)+h31(h12b13+h22b23+h32b33)=h11h12b11+(h11h22+h21h12)b12+(h31h12+h11h32)b13+h21h22b22+(h31h22+h21h32)b23+h31h32b33=0
我们可以将上式改写为更简洁的向量点积的形式:
h11h12h11h22+h21h12h31h12+h11h32h21h22h31h22+h21h32h31h32Tb=0
我们甚至还可以更简洁一点,记
vij=h1ih1jh1ih2j+h2ih1jh3ih1j+h1ih3jh2ih2jh3ih2j+h2ih3jh3ih3j
因此上面的正交约束可写为:
v12Tb=0
类似地,根据等范数约束,有
v11Tb−v22Tb=0
将上述两式合并在一个矩阵中,便得到了
Vi=[v12Tv11T−v22T]
此时我们就得到单张图像的方程:
Vib=0
假设有 n 张图像,将这些矩阵堆叠成一个 2n×6 矩阵:
V=V1V2⋯Vn
现在需要求解如下线性方程组:
Vb=0
显然,该线性方程组有平凡解 b=0,但这样的平凡解并没有意义。因为 B 本来就只能从这些齐次约束中确定到一个非零尺度,我们可施加归一化约束:
∥b∥=1
在有噪声的情况下,实际求解的是
∥b∥=1min∥Vb∥2.
对 V 做 SVD,取最小奇异值对应的右奇异向量即可得到 b。由于 b 有 5 个尺度无关的自由度,而每张图像只提供 2 个约束,所以我们通常至少需要 3 张具有不同且非退化姿态的图像。标定的过程中,如果标定板姿态变化不足,方程可能退化或严重病态,这就是我们应该采集更多不同视角图像的原因。
得到 K 后,可以从每张图像的单应矩阵 H 中恢复该视角所对应的外参。
相机作为测量设备
求出相机标定矩阵 K 和畸变参数后,我们可将图像坐标系中的一个像素映射为相机坐标系中的一条射线。如果输入是原始畸变图像上的像素,必须先用标定得到的畸变模型将其反畸变;以下用 X~i 表示反畸变后的像素齐次坐标。
若在相机坐标系中指定一个测量平面,还可进一步把该像素映射为平面上的一个点。
设测量平面为:
AXc+BYc+CZc+D=0
然后计算射线与平面的交点,即可得到该点在相机坐标系中的三维坐标。
投影射线的方向可以表示为:
d=K−1X~i
因此射线可以参数化为:
Xc(λ)=λd,λ>0
其中 λ 为标量。
将射线方程代入平面方程即可求出 λ。这里要求射线不与平面平行,即 Adx+Bdy+Cdz=0:
A(λdx)+B(λdy)+C(λdz)+D=0
λ∗=−Adx+Bdy+CdzD
只有当 λ∗>0 时,交点才位于相机前方的射线上。此时交点为:
Xc∗=Xc(λ∗)=λ∗d
如果已知把世界坐标变换到相机坐标的同一组外参 R,t,还可将该点从相机坐标系变换回世界坐标系:
Xw∗=RT(Xc∗−t)
因此,在测量平面及相机外参已知的前提下,可以把二维像素映射为该平面上的世界坐标点。单个像素本身只确定一条射线;如果没有已知平面、深度或其他视角,它不能唯一确定任意三维点。
参考文献
- 张正友标定法原文