OpenCV相机标定数学背景

OpenCV Camera Calibration mathematical background

我刚开始使用 OpenCV 并校准了两个相机。 我正在使用棋盘校准 python 中的 camares。我正在使用函数 drawChessboardCornerscalibrateCamera。一切正常。

这些函数的documentation描述了如何使用这些函数。但我一直想知道这些背后的魔力是什么。我想知道 OpenCV 中相机标定的数学背景。

OpenCV的棋盘detecting the corners如何?

这究竟是如何用于校准相机的?

请参阅 Gary Bradski 和 Adrian Kaehler 的 "Learning OpenCV"。 有一个很大的章节是关于相机校准的,具有良好的针孔相机模型数学背景,各种失真和减少它们的方法(通过校准)。

使用 2nd derivative.

检测图像上的角点

为了理解相机校准到底是什么,让我们从图像的形成方式开始。

相机基本上是一种将点从 3D space 转换(称为投影)到 2D space(图像 space)的设备。在图像形成的分析中,我们经常使用所谓的 pinhole camera 模型,其中图像形成如下:

更形象一点,我们可以看到这样的图像形成:

,其中Y1是图像平面,x3是相机到物体的距离(我们将其称为z,深度),x1是3D点P在X1轴上的位移光学相机轴X3。 O是焦距为f的相机,y1是图像中心到点P对应的像素点Q的距离。

最简单的投影模型被称为orhtography。该模型简单地降低了 3D 点的深度坐标(并可能对其进行缩放)。所以,如果我们从 3D 世界中的点 P 开始

,我们可以将投影写为:

,其中s是实数比例因子,矩阵pi是投影矩阵。

此模型近似于远摄镜头(长焦距)和浅物体到相机的距离。它仅适用于远心镜头。我们使用的相机更准确的模型是 透视投影 。凭直觉,如果 3D 对象离相机更近,图像平面中的对象看起来更大。从数学上讲,由于三角形相似性,y1 与 x1 成正比。比例因子为f/x3,或f/z。暂且令f为1,则得到如下投影函数:

如您所见,投影不能表示为矩阵乘法,因为它不再是线性变换。这并不理想——矩阵乘法具有非常好的特性。因此,我们引入了一个技巧,称为齐次坐标。对于每个点,我们添加另一个坐标(因此现在使用 3 个坐标表示 2D 点,使用 4 个坐标表示 3D 点),并且我们将第四个坐标归一化为 1(考虑隐式除以最后一个坐标)。

现在,我们的P点变成:

我们可以将透视投影矩阵写为:

,由于我们使用了齐次坐标,因此最后一个除法发生 "implicitly",波浪号表示齐次坐标中的向量。

给你!即透视投影矩阵。请注意,这是一个 non-invertible 转换。

然而,相机不仅将 3D 点投影到 2D 图像平面上。投影后,他们对离散图像进行变换space。这由称为 内部相机矩阵 K:

的矩阵表示

,其中 fx 和 fy 是 x 轴和 y 轴上的独立焦距(通常假设它们相等是合理的),s 是导致图像轴不垂直于光轴的偏斜(在现代相机中接近于0)和cx,cy表示图像的原点(通常是图像的中心)。

相机通常会给图像增加一些失真,它们有不同的数学模型。

相机标定过程是指确定固有相机矩阵和畸变模型的参数。

这可以通过以下粗略的过程来完成:

  • 从已知布局和尺寸的模型的不同视角的多张图像开始
  • 对于每个图像,确定一些已知对应点。这些通常是角,因为它们可以轻松可靠地相互匹配。
  • 每个点都有一个关联的单应矩阵 H = l * K * (R|T),其中 l 是一个真实的比例因子,K 是固有相机矩阵,(R|T) 是一个矩阵表示 3D 中的相机旋转和平移 space(这称为外部相机矩阵)。
  • 基于点对应并使用单应性,存在确定相机内在参数的封闭形式解决方案。在没有失真的情况下,至少需要 3 张图像。假设 skew 为 0,则至少需要 2 张图像。在实践中,更多的图像会导致更准确的结果。
  • 一旦知道内部参数,就可以计算每个视图的外部参数(旋转和平移)
  • 也可以估计失真。
  • 一些程序使用对所有图像的优化来进一步细化封闭形式解决方案的结果。

要查看实际的封闭式方程,请查看 W. Burger 的 paper(Burger,2016 年)。

该领域的 "bible" 是计算机视觉中的多视图几何,作者 A. Zisserman。