我在一个团队里制作一些图像解译软件。
我制作了一个真实世界的距离测量系统,它对给定的飞机相当精确(与现实生活相差0.3%),但当我问我的高级同事如何才能使现实世界变得准确时,他告诉我,我需要计算仿射参数。我要求更多的细节,但我也不确定他是否知道,不管怎样,他没有跟我说更多的细节。在和几个不同的人谈过这件事之后,我确信这就是我需要做的。
我试着读了很多关于仿射变换是如何工作的文章,但是矩阵数学一直是我的一个大弱点,自从我的微积分3课以来,它已经太久了。有人能帮助我理解如何用面向对象的逻辑计算仿射变换吗?因为所有这些文章,我发现,当他们开始包括纳布拉和矩阵等在他们的方程式(希腊语对我),我的头远远超出我。我可以学习如何使用这些东西(我假设我需要的话),但这一切对我来说似乎非常复杂。帮助理解这一主题将不胜感激。
我不知道这是否有帮助,但我正在用c#编程,从用户在图像上输入的六条边和对角线开始。
发布于 2016-06-19 07:31:26
我只提供一些一般性的信息,因为需要更多关于您的特定问题的信息才能给出更具体的建议。此外,我也不会详细讨论矩阵乘法,或者如何构造一个矩阵表示旋转等等,因为我确信您使用的任何语言(即C#)都会有一个库来处理这些问题。
3x3矩阵与空间旋转
在这种情况下,在选择原点和坐标系后,我们用三维向量表示空间中的点,例如(0,0,0)表示原点,(1,0,0)点1单位在正x方向上。
想象一下,把所有东西绕y轴旋转90度。(1,0,0)将移动到(0,0,-1),而(0,1,0)不会移动。结果是有一个矩阵表示这个旋转,即
0 0 1
0 1 0
-1 0 0
这意味着,如果你把这个矩阵乘以一个向量,你就会得到旋转向量的结果(例如乘以(1,0,0)给出(0,0,-1),乘以(0,1,0)给出(0,1,0))。
您的矩阵库将有一个函数MultiplyMatrixVector (或类似的名称)来完成这个任务,还有一个函数RotationY (或类似的名称)来构造一个矩阵,该矩阵表示以给定角度绕y轴旋转的矩阵。它可能用从矩阵的行( 0, 0, 1, 0, 1, 0, -1, 0, 0 )中读取的9个数字数组来表示矩阵。
用矩阵表示旋转的一个优点是,如果你想按顺序进行几个旋转,你只需乘以相应的矩阵。同样,您的库将有一个类似于MultiplyMatrices的函数来执行此操作。注意,通常情况下,结果取决于旋转的顺序。同样,请检查库文档,以了解在使用MultiplyMatrices(A,B)时首先发生的旋转。
在实践中,要回答这样的问题:“如果我绕y轴旋转30度,然后绕z轴旋转60度,那么(2,3,4)点会发生什么?”,你会这样做:
Ry = RotationY(30);
Rz = RotationZ(60);
R = MultiplyMatrices(Rz, Ry);
result = MultiplyMatrixVector(R, Vector3D(2, 3, 4));
4x4矩阵与仿射变换
下一部分看起来很奇怪,但我们稍后会看到它是如何有用的:我们将用四维向量来表示空间中的点。在三维(2,3,4)中给定一个点,只要在末端加一个1,即(2,3,4,1),就可以得到一个4D向量。相反,4D向量(x,y,z,w)表示3D中的点(x/w,y/w,z/w)。注意,(2,3,4,1)和(4,6,8,2)在3D中都代表着相同的点(2,3,4)。
现在,我们将使用4x4矩阵来表示转换。我们可以使用前面讨论的所有3x3旋转矩阵,方法是将它们按以下模式拟合成一个4x4矩阵:
* * * 0
* * * 0
* * * 0
0 0 0 1
例如,上面的y轴旋转现在由
0 0 1 0
0 1 0 0
-1 0 0 0
0 0 0 1
和前面一样,我们使用MultiplyMatrixVector对点应用转换,MultiplyMatrices按顺序执行转换。为什么四维向量有用?我们可以表示一些新的转换。例如,在x轴(一个转换)的方向上平移所有的所有1单元都由
1 0 0 1
0 1 0 0
0 0 1 0
0 0 0 1
更重要的是,我们可以代表一个投影。假设你的眼睛在原点,你在z=1的平面上通过一个视口看,3D中的每个点都投射到视口平面的某个点。它可以通过应用矩阵来计算。
1 0 0 0
0 1 0 0
0 0 0 1
0 0 1 0
然后去掉z坐标。例如,考虑点p= (2,3,4),由4D向量(2,3,4,1)表示。应用矩阵给出(2,3,1,4),表示三维点(2/4,3/4,1/4)。将z坐标,p投影到平面上的(2/4,3/4)。这模拟了相机如何将3D空间中的点映射到2D图像中的点。
投影可以更简单地描述没有矩阵-它只是发送(x,y,z)到(x/z,y/z)。使用矩阵的优点是它可以很容易地与其他转换相结合。例如,如果相机不在原点或指向z方向,你可以通过乘以一些旋转矩阵和平移矩阵来解释这一点(同样,要小心将它们按正确的顺序得到)。
https://stackoverflow.com/questions/37872243
复制相似问题