本文主要是介绍14.图像透视——距离的测验,齐次坐标(Homogeneous Coordinate),透视投影(Perspective Projection),投影实战_2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
距离的测验
齐次坐标(Homogeneous Coordinate)
透视投影(Perspective Projection)
投影实战
学前概念
透视投影法(perspective projection method)一种投影法。所谓透视,即穿过透明体观察物体。在人与物体之间,设立一个透明的平面,称作画面(即投影面),人眼的位置称视点(即投影中心COP),由视点至物体上各个点连线,称视线(即投影线),各视线与画面(即投影面)的交点,即为物体上各点的透视投影,连结各点的投影,即得物体的透视。
距离的测验
是时候来个小测验了。当物体非常非常远的时候,真正的X,也就是离中心有多远,可能很大,因为真正的Z,可能是英里。如果我移动相机,移动原点,这些数字几乎不变。世界上真正的 x 布局的位置,世界上关于这一点的真实布局,距离它还有几英里远。如果我移动几英寸,实际上没有什么变化。这就解释了下面哪一个?
a.为什么月亮跟着你? 我希望月亮真的跟着你,也跟着我,也许我很特别;
b.为什么北极星总是偏北;
c.为什么无论你在哪里,你都能从太阳上知道时间。
d.所有这些。
答案显然是d,原因是,基本上当我移动相机的时候,因为本质上是X,大写X,大写Z不变,all right? 在图像上,月球的点落在我的图像平面上,它也不会改变。当然,如果我转身,它就会改变,当然,我们只是在讨论转身。现在,很快我就会从视频中转出去,梅根会不开心,因为我要回到这里继续录制视频。但如果你一直在开车,你看到了月亮,就像在跟踪你一样,okay? 这是因为 X 和 Z,如果我这样走,Z就不会改变,但 X 变化的速度可能已经是数英里,okay? 但月亮在什么呢,就像200英里远?我不知道,它距离我们很远很远。
有人查一下,我想是25万英里(事实是38万英里),大概是这样。总之,比这里和罗斯威尔(外星人)之间的距离要短得多。所以,当我从这里到罗斯威尔,X几乎不变,Z也几乎不变,所以它出现在图像上的地方没有改变。基本上,这就是为什么非常遥远的事情不会随着我移动而移动。唯一重要的是角度,太阳或北极星或这些东西都是如此,这是因为这个透视投影(Perspective Projection)。
齐次坐标(Homogeneous Coordinate)
现在,我们来看看丑陋的东西。齐次坐标(Homogeneous Coordinate)。它不是丑陋的,它是美丽的,对于一些扭曲的美学概念来说。
这个运算是 x / z 和 y / z,这是一个线性变换吗? 答案是否定的。之前我们说过除法是一个线性运算,是的,除以某个常数,除以a, 1 / a,乘以1 / a,这些是线性运算,但是这里我取x ,y 和 z ,okay? 实际上我需要把 z 提出来然后把 x 和 y 除以它。如果有另一个点(x1, y1, z1)除以z,所以这不是一个线性运算。我必须彻底改变正在发生的事情。
我们要做一个技巧。关键是,我们要再加一个坐标,all right? 我们可以在二维或三维中做这个。在二维空间中,xy变成了xy1。在三维空间中,x,y,z变成了xyz1。下面这个坐标(如图),现在w写成1,之后我们会取w为其他的值,这是齐次版本,齐次坐标(Homogeneous Coordinate)。
有时它被称为比例因子(Scale Factor)但我认为这是不恰当,它应该被看作是齐次坐标,或者是向量的齐次分量。从常规坐标转换为齐次坐标并再次返回常规坐标是非常简单的,right?
如果我有齐次坐标(x,y,w),我得到的是非齐次(nonhomogeneous)坐标就是除以w,所以2维空间的x,y 和 3维空间的 x,y,z,每一个除以w(如图),现在你们明白了为什么把xy1变成非齐次的了,就像之前一样我,还是得到了x和y。但如果最后一个齐次坐标不是1的话,我就会得到一个不同的值。顺便说一下,这使得齐次坐标在尺度下不变性。如果我把整个齐次坐标乘以某个常数,比如说a,我有ax ay aw。当我再做一次换算除法时,a约掉了。
透视投影(Perspective Projection)
这样做的真正酷之处在于,现在我们可以采用透视投影(Perspective Projection),在齐次坐标系下进行线性矩阵运算,我们不用担心非齐次部分直到最后。所以看起来像这样,这里有一个3×4矩阵,你会注意到它是 1 1 1 / f,我把它乘以齐次三维坐标 xyz1,就得到了这个三行齐次坐标,这是二维齐次坐标(如图),okay?
我可以把它作为齐次坐标一直保持下去直到我需要在图像中使用它。当我把它用作图像时,我把上面的元素除以齐次元素,得到f (x / z)和f (y / z)。顺便提一下,有时也称为u,v(如图)。 这些是通过焦距为 f 的投影,投影到的世界中某些点x,y,z的图像中的坐标。
所以我们的投影运算就是这种线性矩阵乘法,正如我们所知,我们都喜欢线性矩阵乘法,因为我们知道如何做很多。 并颠倒它们和所有其他类型的东西。 它确实是投影几何的基础,以及投影数学,我们将会在这门课的一部分中使用。 顺便说一句,从现在开始,f 是焦距(focal length)。 在我们谈论距离 D 之前,这里我们的焦距 f 是从投影中心到图像平面的距离,并且它不是我们上次谈论的光圈的 f 。 我可能不应该提醒你,因为可能是几个月前你看过那个讲座。但是这里的 f 总是焦距,也就是从中心投影到像平面的距离。
那么缩放投影矩阵是如何改变变换的呢? 这里我做的是把投影矩阵乘以 f (如图1)。我可以通过别的东西来缩放它,但我会用 f 来缩放它。现在,不是沿着对角线1 1 1/f,而是乘以 f 然后得到f f 1(如图2),乘以三维齐次坐标向量它有四个维度(如图3),现在我得到fx, fy, z(如图4)。然后当我做除法的时候,我得到了什么,和之前一样的东西,okay? 所以它是不变(invariant)的。
1 2
3 4
投影实战
试着写一些代码来将一个点从3D投影到2D。 确保使用刚刚描述的矩阵运算。 假设您给出了点 p 和焦距 f 的坐标。 编写一个函数,返回2D图像平面上投影点的位置。 这是你的函数应该是什么样子(如图)。
您可以通过传入 p 和 f 的值来测试代码(如图1)。 假设单位是毫米,您可以使用disp显示结果(如图2),尝试不同的坐标和焦距。 请注意,当您点击提交时,我们将根据已知的输入集测试您的函数。
1
2
首先要做的是定义投影矩阵。注意它的大小是3×4,这是三行四列(如图1)。接下来,我们把p变换成齐次坐标,然后转置,结果大小应该是4×1,这是一个有四行1列的向量。将元素附加到任何向量都很容易,向量转置后的一个单引号(如图2)。
1 2
最后,我们可以应用投影变换,最后得到一个简单的矩阵乘法。注意,我们使用的是星号(*),而不是点星号(.*),因为我们没有做元素乘法(如图1)。当返回值时,记住要转换回非齐次坐标。u = x/z, v = y/z,就是这样(如图2)。
1
2
这里有一个快速检查(如图1),看看函数的返回值是否有意义。假设我们保持焦距为50毫米。然后我们知道在50毫米处的任何一点都应该在x y坐标上投影。我们来运行一下(如图2)。无论坐标是什么,这都是正确的。
1
2
我们试试别的吧(如图1,如图2),
1 2
同样地,应该把焦距的两倍缩小到一半。看,透视投影还不错。
1 2
——学会编写自己的代码,才能练出真功夫。
这篇关于14.图像透视——距离的测验,齐次坐标(Homogeneous Coordinate),透视投影(Perspective Projection),投影实战_2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!