对于齐次坐标系,感觉是计算机视觉中还是比较常用的,之前比较不清楚,看了网上大神的博客还有《Robotics,Vision and Control》之后,有了一定的了解,在这里总结下。

“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”
—— F.S. Hill, JR

一. 用于区分向量还是点

首先给个三维空间的坐标 (1,2,3),从这个坐标中很难说明这代表的是向量还是点,但是转换为其次坐标系就比较容易理解了。

对于一个向量 vvv 以及 基 oabco_{abc}oabc, 很容易找到一组坐标 v1,v2,v3v_{1}, v_{2} , v_{3}v1,v2,v3, 使得 v=v1a+v2b+v3cv=v_{1}a+ v_{2}b + v_{3}cv=v1a+v2b+v3c …(1)
对于一个点 ppp 而言,我们同样能找到一组坐标 p1,p2,p3p_{1}, p_{2} , p_{3}p1,p2,p3 , 使得 p−o=p1a+p2b+p3cp - o= p_{1}a+ p_{2}b + p_{3}cpo=p1a+p2b+p3c …(2)

从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点 o 所进行的一个位移,即一个向量: p−op-opo(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点 pppp=o+p1a+p2b+p3cp = o + p_{1}a+ p_{2}b + p_{3}cp=o+p1a+p2b+p3c …(3)

(1) (3) 是坐标系下表达一个 向量 和 点 的不同表达方式。z这里可以看出,虽然都是用代数分量的形式表达 向量 和 点,但表达一个点比一个向量需要额外的信息。

把 (1) 写成矩阵的形式: v=[a,b,c,o][v1,v2,v3,0]Tv= [a,b,c,o] [v_{1}, v_{2}, v_{3}, 0]^{T}v=[a,b,c,o][v1,v2,v3,0]T
把 (2) 写成矩阵的形式: p=[a,b,c,o][p1,p2,p3,1]Tp= [a,b,c,o] [p_{1}, p_{2}, p_{3}, 1]^{T}p=[a,b,c,o][p1,p2,p3,1]T

这里的 [a,b,c,o][a,b,c,o][a,b,c,o] 是坐标基矩阵,右边的列向量分别是向量 vvv 和 点 ppp 在基下的坐标。向量和点在这个基上就有了不同的表达: 3D向量的第4个代数分量是0,而3D 点的第4个代数分量是1。 像这种用 4个代数分量表示 3D 几何概念的方式是一种齐次坐标表示。

若有(1,4,7)如果齐次坐标写成 (1,4,7,0), 那么就是向量,若齐次坐标写为 (1,4,7,1),那么就是 3D 点

在普通坐标 (Ordinary Coordinate) 和 齐次坐标 (Homogeneous Coordinate)之间进行转换:

(1) 从普通坐标转成齐次坐标时:
如果(x,y,z)是向量,那么齐次坐标为(x,y,z,0)
如果(x,y,z)是 3D 点,那么齐次坐标为 (x,y,z,1)

(2) 从齐次坐标转成普通坐标时:
如果 (x,y,z,1)(3D点),在普通坐标系下为(x,y,z)
如果 (x,y,z,0)(向量),在普通坐标系下为(x,y,z)

二. 更易用于进行仿射(线性)几何变换

对于平移 T,旋转缩放 S 这3个最常见的放射变换,平移变换只对点才有意义,因为普通向量没有位置概念,只有大小和方向。而旋转和缩放对于向量和点都有意义。从中可以看出,齐次坐标用于放射变换是很方便的。

首先一个矢量来表示空间中的一个点:r=[rx,ry,rz]r = [r_{x}, r_{y}, r_{z}]r=[rx,ry,rz]
如果我们要将其平移, 平移的矢量为:t=[tx,ty,tz]t=[t_{x}, t_{y}, t_{z}]t=[tx,ty,tz]
那么正常的做法就是:r+t=[rx+tx,ry+ty,rz+tz]r+t = [r_{x}+t_{x}, r_{y}+t_{y}, r_{z}+t{z}]r+t=[rx+tx,ry+ty,rz+tz]

若不引入齐次坐标系的话,单纯采用 3x3 矩阵乘法来实现平移,找到一个矩阵 m,使得

m∗r=r+t=[rx+tx,ry+ty,rz+tz]m*r = r + t = [r_{x}+t_{x}, r_{y}+t_{y}, r_{z}+t{z}]mr=r+t=[rx+tx,ry+ty,rz+tz], 发现永远都找不到 m 这样子的矩阵

转换为齐次坐标之后,点 r=[rx,ry,rz]r = [r_{x}, r_{y}, r_{z}]r=[rx,ry,rz] 变为 r=[rx,ry,rz,1]r = [r_{x}, r_{y}, r_{z}, 1]r=[rx,ry,rz,1]

则可以找到矩阵 m=[100tx010ty001tz0001]m=\begin{bmatrix} 1& 0 & 0 & t_{x}\\ 0& 1 & 0 & t_{y}\\ 0& 0 & 1 & t_{z}\\ 0& 0 & 0 & 1 \end{bmatrix}m=100001000010txtytz1

使得 m∗r=[100tx010ty001tz0001][rx,ry,rz,1]=[rx+tx,ry+ty,rz+tz,1]m*r = \begin{bmatrix} 1& 0 & 0 & t_{x}\\ 0& 1 & 0 & t_{y}\\ 0& 0 & 1 & t_{z}\\ 0& 0 & 0 & 1 \end{bmatrix} [r_{x}, r_{y}, r_{z},1] = [r_{x}+t_{x}, r_{y}+t_{y}, r_{z}+t{z},1]mr=100001000010txtytz1[rx,ry,rz,1]=[rx+tx,ry+ty,rz+tz,1]

在计算机图形学中,坐标转换通常不是单一的,一个几何体在每一帧可能都设计了多个平移,旋转,缩放等变化,这些变化我们通常使用串接各个子变化矩阵的方式得到一个最终变化矩阵,从而减少计算量。所以我们需要将平移也表示为变化矩阵的形式。因此,只能引入齐次坐标系。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐