首页 > 编程知识 正文

齐次坐标系不能表达形中的无穷远点,齐次坐标变换能解决机器人什么与什么的描述问题

时间:2023-05-04 12:38:13 阅读:245070 作者:2651

齐次坐标

    在看图像学相关坐标系建立的时候,总是会碰到齐次坐标这个概念。虽然之前上过《机器人基础》这门课,其中也涉及到齐次坐标的概念,但对于它的含义的理解一直比较模糊。后来在一篇博客《齐次坐标的理解》中,其中对齐次坐标进行了非常精辟的讲解。由于原文作者真的很用心,我就稍作休整如下:

参考博文:http://blog.csdn.net/wqvbjhc/article/details/6003112?locationNum=1&fps=1

    对于一个向量v以及基o、a、b、c,可以找到一组坐标(v1,v2,v3),使得
v=v1a+v2b+v3c (1)
    而对于一个点p,则可以找到一组坐标(p1,p2,p3),使得
    p-o=p1.a+p2.b+p3.c (2)
    从上面对向量和点的表达,我们可以看出为了在坐标系中表示一个点(如p),我们把点的位置看作是对这个基的原点o所进行的一个位移,即一个向量——p-o(有的书中把这样的向量叫做位置向量——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点:
    P:p=o+p1.a+p2.b+p3.c (3)

    (1)(3)是坐标系下表达一个向量和点的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达(1,4,7),谁知道它是个向量还是个点。

    我们现在把(1)(3)写成矩阵的形式:(1)式——>v=(v1 v2 v3 0)X (a b c o);(2)式——>p=(p1 p2 p3 1)X(a b c o),这里(a,b,c,o)是坐标基矩阵,右边的列向量分别是向量v和点p在基下的坐标。这样,向量和点在同一个基下就有了不同的表达:3D向量的第四个代数分量是0,而3D点的第四个代数分量是1。像这种用4个代数分量表示3D几何概念的方式是一种齐次坐标表示。

    这样,上面的(1,4,7)如果写成(1,4,7,0),它就是个向量;如果是(1,4,7,1),它就是个点。下面是如何在普通坐标和齐次坐标之间进行转换:
    (1) 从普通坐标转换成齐次坐标时
    如果(x,y,z)是个点,则变为(x,y,z,1);
    如果(x,y,z)是个向量,则变为(x,y,z,0);
    (2) 从齐次坐标转换成普通坐标时
    如果是(x,y,z,1),则知道它是个点,变成(x,y,z);
    如果是(x,y,z,0),则知道它是个向量,仍然变成(x,y,z)

    以上是通过齐次坐标来区分向量和点的方式。从中可以思考得知,对于平移T、旋转缩放 S 这 3 个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向。而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中可以看出,齐次坐标用于仿射变换非常方便。

    此外,对于一个普通坐标的 点 P=(Px, Py, Pz) ,有对应的一族齐次坐标 (wPx, wPy, wPz, w) ,其中 w 不等于零 。比如, P(1, 4, 7) 的齐次坐 标有 (1, 4, 7, 1) 、( 2, 8, 14, 2 )、( -0.1, -0.4, -0.7, -0.1 )等等 。 因此,如果把一个点从普通坐标变成齐次坐标,给 x,y,z 乘上同一个非零数 w ,然后增加第 4 个分量 w ;如果把一个齐 次坐标转换成普通坐标,把 前三个坐标同时除以第 4 个坐标,然后去掉第 4 个分量。

    由于齐次坐标使用了 4 个分量来表达 3D 概念,使得平移变换可以使用矩阵进行,从而如 F.S. Hill, JR 所说,仿射(线性)变换的进行 更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。

    以上很好的阐释了齐次坐标的作用及运用齐次坐标的好处。其实在图形学的理论中,很多已经被封装的好的API也是很有研究的,要想成为一名专业的计算机 图形学 的 学习者,除了知其然必须还得知其所以然。 这样在遇到问题的时候才能迅速定位问题的根源,从而解决问题。

另一个帖子:http://www.cnblogs.com/kesalin/archive/2009/09/09/homogeneous.html

问题: 两条平行线会相交

![这里写图片描述](https://img-blog.csdn.net/20161129162249244) 铁轨在无限远处相交于一点

    在dldcb几何空间里,两条平行线永远都不会相交。但是在投影空间中,如右图中的两条铁轨在地平线处却是会相交的,因为在无限远处它们看起来相交于一点。

    在dldcb(或称笛卡尔)空间里描述2D/3D 几何物体是很理想的,但在投影空间里面却并不见得。 我们用 (x, y ) 表 示笛卡尔空间中的一个 2D 点,而处于无限远处的点 (∞,∞) 在笛卡尔空间里是没有意义的。投影空间里的两条平行线会在无限远处相交于一点,但笛卡尔空间里面无法搞定这个问题(因为无限远处的点在笛卡尔空间里是没有 意义的),因此数学家想出齐次坐标这个点子来了。
    解决办法: 其次坐标
    由 August Ferdinand Möbius 提出的齐次坐标(Homogeneous coordinates)让我们能够在投影空间里进行图像和几何处理,齐次坐标用 N + 1个分量来描述 N 维坐标。比如,2D 齐次坐标是在笛卡尔坐标(X, Y)的基础上增加一个新分量 w,变成(x, y, w),其中笛卡尔坐标系中的大X,Y 与齐次坐标中的小x,y有如下对应关系:

X = x/w
Y = y/w

    笛卡尔坐标中的点 (1, 2) 在齐次坐标中就是 (1, 2, 1) 。如果这点移动到无限远(∞,∞)处,在齐次坐标中就是 (1, 2, 0) ,这样我们就避免了用没意义的"∞" 来描述无限远处的点。
    为什么叫齐次坐标?
    前面提到,我们分别用齐次坐标中的 x 和 y 除以 w 就得到笛卡尔坐标中的 x 和 x,如图所示:

![这里写图片描述](https://img-blog.csdn.net/20161129162341713)

    仔细观察下面的转换例子,可以发现些有趣的东西:

![这里写图片描述](https://img-blog.csdn.net/20161129162357321)

    上 图中,点 (1, 2, 3), (2, 4, 6) 和 (4, 8, 12) 对应笛卡尔坐标中的同一点 (1/3, 2/3)。 任意数量积的(1a, 2a, 3a) 始终对应于笛卡尔坐标中的同一点 (1/3, 2/3)。因此这些点是“齐次”的,因为他们始终对应于笛卡尔坐标中的同一点。换句话说,齐次坐标描述缩放不变性(scale invariant)。
证明: 两平行线可以相交

    笛卡尔坐标系中,对于如下两个直线方程:

![这里写图片描述](https://img-blog.csdn.net/20161129162415494)

    如果 C ≠ D,以上方程组无解;如果 C = D,那这两条线就是同一条线了。
    下面我们用 x/w, y/w 代替 x, y 放到投影空间里来求解:

![这里写图片描述](https://img-blog.csdn.net/20161129162432854)

    现在我们就可以在 C ≠ D 的情况得到一组解 (x, y, 0),代入得 (C - D)w = 0,因为 C ≠ D,所以 w = 0。因而,两条平行线相交于投影空间中无限远处的一点 (x, y, 0)。
齐次坐标在计算机图形学中是有用的,将 3D 场景投影到 2D 平面的过程中就用到它了。
    此外,讨论齐次坐标的时候,OpenCV库中有一个
    函数:cvConvertPointsHomogenious(),使用该函数可以很方便地对齐次坐标进行转换。该函数在很多其他场合也非常有用。

void cvConvertPointsHomogenious( const CvMat* src, CvMat* dst )

  个人公众号:

![这里写图片描述](https://img-blog.csdn.net/2018040419144116?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lvbmdfUWkyMDE1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。