真正讲清楚了透视矩阵

from:https://www.cnblogs.com/AirGuanZ/p/6365702.html

透视投影矩阵推导

  计算机图形学中,建模自小孔成像原理的透视摄像机是常用的摄像机模型。然而,由于光栅化渲染中的几何变换多基于四阶方阵与齐次坐标表示的向量的乘法,而四阶方阵只能表示仿射变换,无法实现透视摄像机“近大远小”的特性(仿射变换维持平行线相互平行,而“近大远小”不具有该性质),因此透视摄像机模型的实现要多费一番功夫。

1. 基本原理

  小孔成像是大多数人所熟知的最简单的成像原理之一,而常用的透视摄像机就是把小孔和屏幕(成像平面)的顺序交换,维持相似关系不变,因而这一模型达到了拟真的效果而被广泛应用。

真正讲清楚了透视矩阵_第1张图片真正讲清楚了透视矩阵_第2张图片

小孔成像与简单的透视摄像机模型

  透视摄像机模型用在光栅化渲染管线的结果,就是透视投影过程。考虑简图——

真正讲清楚了透视矩阵_第3张图片

  图中从e点(原点)发出的一条射线上所有在view plane之后的点都被投影到view plane与该射线的交点。由相似关系显然有

clip_image008

这就得到了所需的映射关系:

clip_image010

  显然clip_image012并非仿射变换,也就不能直接借助四阶方阵乘法来实现。这时齐次坐标表示的另一个作用就表现出来了,设齐次坐标clip_image014表示点clip_image016,定义全体clip_image018的齐次坐标上的等价关系:clip_image020当且仅当clip_image022,则有clip_image024,该式的右边正是常用的齐次坐标中点的表示方法(clip_image026)。这样一来,这一等价关系为我们提供了“除法”的能力,也扩充了仿射变换的能力。注意到,仿射变换可以将clip_image028clip_image030clip_image032中的任意一个分量设置为clip_image034,而该方法允许这样的变换形式——

真正讲清楚了透视矩阵_第4张图片

注意到透视投影需要的变换是(假设viewing transform后摄像机面向+z方向)

真正讲清楚了透视矩阵_第5张图片

而要将clip_image040映射为clip_image042是很容易的,只需要矩阵乘法——

真正讲清楚了透视矩阵_第6张图片

然后使clip_image042[1]化为clip_image046即可,这一过程称为齐次化。

  这就是齐次坐标投影的基本原理。

2. 完整的投影矩阵推导

  现实中使用的投影矩阵因为考虑了摄像机视截体,形式更加复杂。考虑下图中的透视投影变换——

真正讲清楚了透视矩阵_第7张图片

  显然该变换把近平面(near plane)区域投影到xOy平面上的单位正方形。在这里可以把该变换过程拆分成三个子过程:完成“透视”投影、把near plane上的视窗变换为单位正方形、把near plane的z坐标变换为0。第一个过程可以利用矩阵乘法:

真正讲清楚了透视矩阵_第8张图片

其中n与f分别是视截体近平面与远平面与原点的距离。clip_image054的第三行有些特殊。它的作用是保持被投影到near plane上同一点的各点间的深度关系不变(这样才能在稍后做depth test)。此外,由于clip_image056(齐次化过程),位于near plane上的点的clip_image028[1]clip_image030[1]坐标都不会变化。

   然后把near plane上的有效区域变换为单位正方形。假设near plane上有效区域的宽度为clip_image058,高度为clip_image060,则一个简单的scaling即可解决问题——

真正讲清楚了透视矩阵_第9张图片

  再把near plane挪到xOy平面上,一个平移就能解决问题;另外深度的变化范围应该被固定在0~1之间。注意到

真正讲清楚了透视矩阵_第10张图片

故只需要令

真正讲清楚了透视矩阵_第11张图片

即可得

真正讲清楚了透视矩阵_第12张图片

  最后是一直没有进行的齐次化过程,即

真正讲清楚了透视矩阵_第13张图片

 

 

 

 

 

 

这就求得了所需的透视投影变换矩阵——

真正讲清楚了透视矩阵_第14张图片

验证一下:

真正讲清楚了透视矩阵_第15张图片

满足透视投影的要求。使用时,只需要将clip_image076乘上待投影的坐标,再齐次化即可。

3. 其他

  在一些别的条件/要求下,透视投影矩阵可能具有与此稍微不同的形式。譬如,OpenGL采用右手系,通常其viewing transform把坐标变换到camera space,其中camera是指向-z的(本例使用的是+z);此外,OpenGL中的z值被映射到-1~+1(本例使用的是0~1),但是,总体的推导思路是相同的。可以证明

真正讲清楚了透视矩阵_第16张图片

是一个满足这些要求的投影矩阵(这里,l、r、t、b是视截体近平面的左、右、上、下坐标,本例中没有考虑这种不对称的情况)。

 

你可能感兴趣的:(机器视觉,透视变换)