这章讲的是摄像机参数估计。摄像机标定,本质上就是求摄像机矩阵 P P P,当我们知道足够多的 X ↔ x X \leftrightarrow x X↔x,我们该如何计算 P P P?如果知道3D和2D点的对应,那么内参和外参可以由基本的线性方程求解问题算出。遇到超定解时的解决办法也跟前面讲的第4章射影变换的情况非常类似。值得注意的是,第4章求的是 3 × 3 3 \times 3 3×3射影变换矩阵,而本章求的是 3 × 4 3 \times 4 3×4相机矩阵。
问题描述:我们假设有一些3D空间上的点 X i X_{i} Xi和2D图像上的点 x i x_{i} xi的对应关系已经给出。我们的目标是找到一个 3 × 4 3 \times 4 3×4的摄像机矩阵 P P P,满足对于所有 i i i都满足 x i = P X i x_{i}=PX_{i} xi=PXi。
我们可以发现,这个问题和在第4章里面说的求解2D射影变换矩阵 H H H非常像,唯一的区别是需要求解的矩阵维度变了而已。
最基本的方法就是方程 P X = x PX=x PX=x,然后变成 x × P X = 0 x \times PX = 0 x×PX=0 取该矩阵前两行,因为第三行是线性相关的。这样,我们可以写成 A p = 0 Ap=0 Ap=0,这 A A A就是一个 2 n × 12 2n \times 12 2n×12的矩阵。我们要求解摄像机矩阵,其实也就是要求解这个等式里面的 p p p。
最小解 因为 P P P是 3 × 4 = 12 3 \times 4 = 12 3×4=12个元素,那么就有11个自由度,理论上我们需要5.5对对应点就行,0.5对对应点就是知道x或者y坐标就可以了。
超定的情况 如果我们有多于6对点,那我们就求 m i n ∣ ∣ A p ∣ ∣ = 0 min||Ap||=0 min∣∣Ap∣∣=0,并且让他满足约束 ∣ ∣ p ∣ ∣ = 1 ||p||=1 ∣∣p∣∣=1, ∣ ∣ p ^ 3 ∣ ∣ ||\hat{p}^3|| ∣∣p^3∣∣=1, p ^ 3 \hat{p}^3 p^3就是p最后一行的前三个元素。
退化的情况 有两种情况可以使我们不能唯一确定 p p p:
对于这样的配置,不能从点的图像中唯一地获得相机。 相反,它可以分别沿着扭曲的立方体或直线任意移动。 如果数据接近退化的情况,则获得的 P P P估计值很差。 例如,如果相机距离场景较远,例如鸟瞰图,则这种情况接近平面退化。
点的归一化 我们需要把所有点到直线的平均距离归一化到 3 \sqrt{3} 3。
从线对应来计算 P P P 如果我们能找到一对对应线,那么我们就有方程 l T P X j = 0 l^TPX_j=0 lTPXj=0其中 j = 0 , 1 j=0,1 j=0,1, X X X在 l l l上。
回忆我们在第4章提到的几何损失函数,我们可以把它用在这里:
min P ∑ i d ( x , P X ) 2 \min_P \sum_{i} d(x,PX)^2 Pmini∑d(x,PX)2
世界坐标系里的误差 我们考虑世界坐标系,也就是标定板上的误差。因为 P X PX PX不可能完全等于 x x x。反过来, x x x对应的世界坐标系里的点,也不会完全是 X X X,那么我们就假设 x x x对应的世界坐标系里的点是 X ^ \hat{X} X^,然后我们同时考虑世界坐标系的误差,和图像上的误差
∑ i = 1 n d M a h ( x i , P X i ^ ) 2 + d M a h ( X i , X i ^ ) 2 \sum_{i=1}^{n} d_{Mah}(x_{i}, P \hat{X_{i}})^2 + d_{Mah}(X_{i}, \hat{X_{i}})^2 i=1∑ndMah(xi,PXi^)2+dMah(Xi,Xi^)2
也就是说在图像上 x i x_{i} xi要靠近 P X i ^ P \hat{X_{i}} PXi^,在世界坐标系里 X i X_{i} Xi也要靠近 P X i ^ P \hat{X_{i}} PXi^。
代数误差的几何解释:代数误差找一个点 X ′ X' X′尽可能的接近 X X X。
上述所有方法都可以直接用在仿射摄像机上。
通常我们会对 P P P矩阵做出一些限制:
这几点假设不是同时成立的。比如我们可以只用1和2,那么 P P P矩阵就只剩下3+6=9个系数了。
迭代方法的初始化 如果我们求几何损失函数,要用迭代的方法。那么迭代的初值从哪里来? 可以用DLT先解出一个值作为初始值。
相机畸变主要是径向畸变,所谓径向就是圆的直径的方向。该畸变会使正方形变得接近于一个圆,所以叫径向畸变。
校正的思想很简单。所谓畸变,就是给像素坐标 ( x , y ) (x,y) (x,y)乘上一个函数 L ( r ) L(r) L(r),我们只需要用泰勒展开去近似这个函数就好了,剩下的工作就是确定泰勒展开的系数。这个展开的系数作为内参,把它们一起标定出来就可以了。