相机标定是准确确定相机和镜头模型参数的过程。对于针孔模型,这相当于确定合适的相机模型的参数。至少是焦距 f f f,可能还有中心点坐标 ( c x , c y c_x, c_y cx,cy) 和镜头畸变参数 k \boldsymbol{k} k。
在最常见的离线标定过程中,图像是在特定约束下拍摄的。标定对象定义了一个世界坐标系,使得视觉特征的 3D 坐标是已知的。大多数这些方法通过观察具有已知视觉特征的标定对象来工作。当需要完全控制标定程序并要求高精度时,这是首选。
在任何相机标定工作中,选择合适的相机模型至关重要,该模型既不会对相机参数化不足,也不会过度参数化。
文献中已经提出了许多用于相机标定的程序。参见例如 Tsai 的方法和 Heikkilä 和 Silvén 的 。这些程序在所需的标定对象类型、相机参数初始猜测的推导和随后的非线性优化步骤方面有所不同。可能所有程序中最受欢迎的是 Zhang 的 相机标定的程序。
所有这些方法都应 始终遵循非线性优化(束调整),因为它们只返回代数解,不考虑镜头效应。然而,它们确实提供了非线性优化收敛所需的初始猜测。
计算机视觉社区中一种现代流行的方法是 Zhang 的方法,它也在流行的软件库中实现,例如libCalib, OpenCV, Jean-Yves Bouguet’s Camera Calibration Toolbox for Matlab 和 Matlab’s Computer Vision Toolbox。张的标定程序依赖于对具有易于识别特征的平面标定板的观察。它通过上述模型将这些的 3-D 坐标与观察到的图像坐标投影相关联,并通过一个闭合形式的解求得外参(相机相对于标定板坐标系的位置和方向)和相机内参。然后使用 Levenberg-Marquardt 算法对所有参数进行非线性优化,包括 k \boldsymbol{k} k。要最小化的目标函数是在图像平面中定义的平方重投影误差的总和:
∑ i ∑ j ∣ ∣ p ⃗ i j − p ⃗ ˘ ( P ⃗ j , A , k ⃗ , R i , T ⃗ i ) ∣ ∣ 2 , \sum_i{\sum_j{||\vec{p}_{ij} - \breve{\vec{p}}(\vec{P}_j, \boldsymbol{A}, \vec{k}, \boldsymbol{R}_i, \vec{T}_i)||^2}} \quad , i∑j∑∣∣pij−p˘(Pj,A,k,Ri,Ti)∣∣2,
其中 p ⃗ ˘ \breve{\vec{p}} p˘ 是在给定 3-D 坐标和相机参数的情况下确定 2-D 点坐标的投影算子。 i i i 是标定板位置的总和, j j j 是单个位置的点的总和。 P ⃗ j \vec{P}_j Pj 是局部标定对象坐标系中的 3-D 点坐标, P ⃗ j = [ x , y , 0 ] ⊤ \vec{P}_j = [x, y, 0]^\top Pj=[x,y,0]⊤, p ⃗ i j \vec{p}_ {ij} pij 在相机中观察到的二维坐标。每个位置的外参 R i , T ⃗ i \boldsymbol{R}_i, \vec{T}_i Ri,Ti 可以理解为相机相对于标定对象定义的坐标系的位置。使用优质镜头和标定目标,最终平均重投影误差通常达到像素的十分之几。
与张的方法相反,蔡的方法没有将对象和图像点之间的关系表述为一系列单应性。相反,代数约束被导出,这导致逐步消除未知数的步骤。相机建模为标准针孔+单个径向畸变系数。
Tsai 的方法相对于 Zhang 的方法的一个优点是它可以为非平面标定对象(例如阶梯目标或 V 形校准台)找到模型参数的解。为此,libCalib实现了 Tsai 的方法。
遵循上述任何一种初始化方法,非线性优化被用来细化参数估计并包括无法用这些技术求解的附加相机参数(例如径向镜头畸变参数)。这个估计问题可以看作是束块调整(有时只是束调整)的一个特例,它的目的是在特征检测中的高斯噪声假设下找到最大似然解决方案以最小化平均重投影误差。
Levenberg-Marquardt 算法已经成为解决这个具有许多参数和未知数的最小二乘问题的事实上的标准。它可以看作是一种混合方法,在高斯-牛顿迭代优化方案和梯度下降之间进行插值。出于计算原因,应使用稀疏求解器,因为重投影误差的雅可比行列式往往非常稀疏(大多数参数仅取决于少量方程)。
Calib Camera Calibrator 和 libCalib 实现了稳健的优化,可以使用 Huber 损失函数。该损失函数对大误差进行线性加权,即使在存在一些异常值的情况下也能确保良好的收敛性。
上述标准离线标定程序的替代方法是自动标定。在 自动标定中,参数是根据查看一般场景的普通相机图像确定的 [1,2]。根据特定的方法,很少或没有对所观察的场景或图像之间的相机运动做出假设。对于某些应用程序,这确实有效,但通常需要对相机进行一些假设或需要选择简化的相机模型。然而,即便如此,自动标定过程往往是不可靠的,其成功非常依赖于特定的场景构成。
https://calib.io/blogs/knowledge-base/camera-calibration