本系列文章由 莫问 出品,转载请注明出处。
文章链接:http://blog.csdn.net/mni2005/article/details/27228111
作者:莫问(mni2005) 邮箱:mni2005@163.com
我个人一直感觉只要有点向量几何知识,相机变换是3D技术中最简单的一部分。但是我不知道为什么,好多网上、书上讲解的相机变换,令很多初学者看的云里雾里的。
1. 什么是相机变换
所谓相机变换,就是将世界坐标系中的点,变换到相机坐标系中。也就是说,一个坐标点在世界坐标系和相机坐标系中有两种不同的表示,我们需要根据相机坐标系的信息以及坐标点在世界坐标系中的表示,换算出它在相机坐标系中的表示。
2. 如何描述相机坐标系
通过以前的博文我们了解到要描述相机坐标系,需要一个参考坐标系,这个参考坐标系我们一般都选择世界坐标系,当然你也可以选择其它坐标系。相机坐标系的类型可以为直角坐标系,也可以圆柱坐标系 、球面坐标系等,只是不同的坐标系将产生不同的相机模型。
这里我们选择世界坐标系作为相机坐标系的参考,相机坐标系的类型我们选择最常见的直角坐标系,也叫笛卡尔坐标系。既然参考坐标系,坐标系类型我们都确定了,那么下面我看看该如何用数学来描述该相机坐标系,以方便我们后面的相机变换推导。
我们假设相机在世界坐标系的P(x, y, z) 点,用向量表示为P;相机坐标系三个相互垂直的轴,我们用向量U(Ux, Uy, Uz),N(Nx, Ny, Nz),V(Vx, Vy, Vz)表示,当然这三个向量也是以世界坐标系作为参考的;这里我们规定UNV全部为单位向量。如下图所示:
3. 相机变换推导
1.预备知识
在进行相机变换推导之前,我们先来看看向量的点乘的公式:
u * v = |u|*|v|*cos(u,v)
当向量v为单位向量时,v的模为1,这时上面的公式变成了u * v = |u|cos(u,v),此时我们看到u*v的几何意义变成了向量u在向量v方向上的投影长度,如下图所示:
由于向量点乘满足交换律,因此上面的分析可以用一句话概括:向量与单位向量点乘的的几何有意义为向量在单位向量方向上的投影长度。如果我们要计算向量u在v方向的投影向量更简单,投影长度乘以单位向量v,就是向量u在v方向的投影,于是有下面公式:
prj(u, v) = u * v *v = |u|cos(u,v)*v (v为单位向量)
2.旋转变换
前面我们规定:相机在世界坐标系的位置为P,坐标轴的方向向量为UVN,且UVN为单位向量。此时为了方便理解,我再次规定P为零向量,即相机坐标系的原点和世界坐标系的原点重合,如下图所示:
根据前面推导的向量与单位向量点乘的几何意义,我们知道,点X在UVN上的投影长度为分别为X*U,X*V,X*N;即为X’在相机坐标系中,UVN坐标轴上的分量,因此有:
a‘=X*U b‘=X*V c’=X*N
在三维坐标变换中,为了便于进行矩阵运算,我们一般给三维坐标点增加一个额外的分量,这个额外分量一般都固定为1,那么X可写成X(a, b, c, 1),X'可写成X’(X*U, X*V, X*N, 1),此时坐标变换写成矩阵运算的形式如下:由此得到了矩阵M,我们通过矩阵M,可以将世界坐标系下的任意坐标点与矩阵相乘,变换至相机作坐标系下。即X‘=XM,M矩阵如下所示:
3.平移变换
前面我们规定相机的位置向量P为零向量,现在我们假设P为任意向量,再来分析一下世界坐标系中的点是如何变换到到相机坐标系下的。无论任何相机变换都可以分解成旋转和平移两大步骤。我们先假设相机坐标系和世界坐标系原点重合,先将世界坐标系中的点,通过旋转变换变换到相机坐标系,然后将相机沿着向量P(x, y, z)移动,相机坐标系中的点相对于相机沿着P’(-x, -y, -z)移动。我们发现移动之后的效果,便是我们最终所需的效果。如下图所示:
H=XM
接下来进行第二步的平移变换,根据数学知识,很明显有:[h1, h2, h3]=[a-x, b-y, c-z]=X-P
虽然这样的写法很简洁,但是它无法和我们的矩阵变换统一起来,因此我们把上面的写法改成下面的矩阵形式:
4. UVN相机模型
前面假设相机的位置向量为P(x, y, z) ,轴的方向向量为:U(Ux, Uy, Uz),N(Nx, Ny, Nz),V(Vx, Vy, Vz),其实这个就是经典的UVN相机模型,UVN相机的变换矩阵如下:
最后,上面这个矩阵大家要牢记。本篇博文希望以最简单,最通俗的语言让大家能够彻底明白相机变换是怎么回事,但是莫问能力有限,尤其是文笔。大家有什么问题可以在下面留言提问,我看到后必定一一回复。