NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模

在第一篇文章中,我们学习了如何将完整的相机矩阵拆分为内参矩阵和外参矩阵,以及如何正确处理在此过程中出现的歧义。第二篇文章更详细地研究了外部矩阵,研究了其 3D 旋转和平移的几种不同解释。

今天,我们将对内参矩阵进行同样的处理,研究两种等效解释:作为虚拟相机几何形状的描述和作为一系列简单的 2D 变换。之后,你将看到一个交互式演示,说明这两种解释。

如果你对深入研究理论不感兴趣,只想将内在矩阵与 OpenGL 一起使用,请查看文章“OpenGL 中不使用 glFrustum 的校准相机”“校准相机和 gluPerspective”

1、针孔相机

内参矩阵将 3D 相机坐标转换为 2D 同质图像坐标。此透视投影由理想针孔相机建模,如下图所示:

内参矩阵由 Hartley 和 Zisserman 参数化为

每个固有参数都描述了相机的几何属性。让我们详细研究一下这些属性。

2、焦距,fx,fy

焦距是针孔和胶片(又称图像平面)之间的距离。出于我们稍后将讨论的原因,焦距以像素为单位测量。在真正的针孔相机中,fx和fy具有相同的值,如下所示为 f:

实际上,fx和 fy可能会因多种原因而有所不同:

  • 数码相机传感器存在缺陷。
  • 图像在后期处理中缩放不均匀。
  • 相机镜头引入了无意的失真。
  • 相机使用变形格式,镜头将宽屏场景压缩为标准尺寸的传感器。
  • 相机校准错误。

在所有这些情况下,生成的图像都具有非正方形像素。

拥有两个不同的焦距并不是很直观,因此一些文本(例如 Forsyth 和 Ponce)使用单个焦距和“纵横比”来描述与完美正方形像素的偏差量。这种参数化很好地将相机几何形状(即焦距)与失真(纵横比)分开。

3、主点偏移,x0,y0

相机的“主轴”是垂直于穿过针孔的图像平面的线。它与图像平面的交点称为“主点”,如下图所示。

“主点偏移”是主点相对于胶片原点的位置。确切的定义取决于原点位置的约定;下图假设原点位于胶片的左下角。

增加 x0会使针孔向右移动:

这相当于将胶片向左移动,而针孔保持不变。

请注意,相机周围的盒子无关紧要,只有针孔相对于胶片的位置才重要。

4、轴倾斜,s

轴倾斜会导致投影图像发生剪切失真。据我所知,真正的针孔相机没有轴倾斜的类似物,但显然某些数字化过程会导致非零倾斜。我们稍后会进一步研究倾斜。

5、其他几何属性

焦距和主点偏移相当于胶片相对于针孔的简单平移。一定还有其他方法可以变换相机,对吧?旋转或缩放胶片呢?

围绕针孔旋转胶片相当于旋转相机本身,这由外部矩阵处理。围绕任何其他固定点 x
旋转胶片相当于围绕针孔 P旋转,然后平移 (x−P)。

缩放呢?显然,将所有相机尺寸(胶片尺寸和焦距)加倍对拍摄的场景没有影响。相反,如果你将胶片尺寸翻倍而不是焦距翻倍,则相当于将两者翻倍(无操作),然后将焦距减半。因此,明确表示胶片的比例是多余的;它由焦距来捕捉。

6、焦距 - 从像素到世界单位

关于相机缩放的讨论表明,有无数个针孔相机可以产生相同的图像。本征矩阵只关心相机坐标和图像坐标之间的关系,因此绝对相机尺寸无关紧要。使用像素单位表示焦距和主点偏移使我们能够表示相机的相对尺寸,即胶片相对于其像素大小的位置。

另一种说法是,本征相机变换对于相机几何的均匀缩放是不变的。通过以像素单位表示尺寸,我们自然可以捕捉到这种不变性。

如果您知道至少一个相机尺寸(以世界单位表示),则可以使用相似三角形将像素单位转换为世界单位(例如 mm)。例如,如果您知道相机的胶片(或数字传感器)的宽度为 W(以毫米为单位),图像宽度(以像素为单位)为 w,则可以使用以下方法将焦距 fx转换为世界单位:

其他参数 fy、x0和 y0可以使用类似的公式转换为其世界单位对应项 Fy、X0和 Y0:

7、相机视锥体 - 简化针孔相机

正如我们之前所讨论的,只有针孔和胶片的排列才重要,因此相机周围的物理盒子无关紧要。因此,许多关于相机几何的讨论都使用更简单的视觉表示:相机视锥体。

相机的可视区域呈金字塔形,有时被称为“可见性锥体”。让我们在场景中添加一些 3D 球体,并展示它们如何落入可见性锥体并创建图像。

由于相机的“盒子”无关紧要,我们将其移除。另外,请注意,胶片的图像描绘的是现实的镜像版本。为了解决这个问题,我们将使用“虚拟图像”而不是胶片本身。虚拟图像具有与胶片图像相同的属性,但与真实图像不同,虚拟图像出现在相机前面,投影图像未翻转。

请注意,虚拟图像平面的位置和大小是任意的——只要我们将其与针孔的距离加倍,我们就可以将其尺寸加倍。

移除真实图像后,我们只剩下针孔相机的“视锥体”表示。

针孔已被可视锥体的尖端取代,胶片现在由虚拟图像平面表示。稍后我们将在演示中使用此表示。

8、内在参数作为 2D 变换

在前面的部分中,我们将传入的 3 个向量解释为 3D 图像坐标,然后将其转换为齐次 2D 图像坐标。或者,我们可以将这些 3 个向量解释为 2D 齐次坐标,然后将其转换为一组新的 2D 点。这为我们提供了内在矩阵的新视图:一系列 2D 仿射变换。

我们可以将内在矩阵分解为一系列剪切、缩放和平移变换,分别对应于轴倾斜、焦距和主点偏移:

等效分解将剪切置于缩放之后:

这种解释很好地将外部参数和内部参数分别划分为 3D 和 2D 领域。它还强调了内部相机变换发生在投影后。一个值得注意的结果是内部参数不能影响可见性——被遮挡的物体不能通过图像空间中的简单 2D 变换显示出来。

9、演示

下面的演示说明了内部矩阵的两种解释。左侧是“相机几何”解释。请注意,当 x0
和 y0调整时,针孔如何相对于图像平面移动。

右侧是“2D 变换”解释。请注意,改变焦距会导致投影图像缩放,而改变主点会导致纯平移。

10、结束语

在本系列文章中,我们了解了如何将

  • 完整的相机矩阵分解为内在矩阵和外在矩阵,
  • 将外在矩阵分解为 3D 旋转和平移,
  • 将内在矩阵分解为三个基本的 2D 变换。

我们在下面总结了这一完整分解:


原文链接:Dissecting the Camera Matrix, Part 3: The Intrinsic Matrix

BimAnt翻译整理,转载请标明出处