我在一个团队制作一些图像解释软件。
我已经制作了一个真实的世界距离测量系统,对于给定的飞机来说相当准确(与现实生活差异大约0.3%),但当我问我的高级同事如何让它真实世界准确时,他告诉我我需要计算仿射参数。 我要求提供更多详细信息,但我不确定他是否也非常了解它,无论哪种方式,他都没有详细了解我。在与几个不同的人谈论之后,我确信这是我需要做的事情。
我曾尝试阅读很多关于仿射变换如何工作的文章,但矩阵数学对我来说一直是一个很大的弱点,而且自从我的微积分3类以来它已经太久了。有人可以帮助我理解如何使用面向对象的逻辑来计算仿射变换吗?因为当他们开始包括nabla和矩阵等等时,我发现所有这些文章都在他的头上(对我来说是希腊语)。我可以学习如何使用这些东西(我假设我需要),但这一切对我来说似乎都很复杂。非常感谢帮助理解这个主题。
我不知道它是否有帮助,但我在c#中进行编程,并开始对用户在图像上输入的四边形的边和对角线进行6次测量。
答案 0 :(得分:2)
我只是提供一些一般信息,因为需要更多有关您的特定问题的信息才能提供更具体的建议。另外,我不会详细介绍矩阵乘法,或者关于如何构造表示旋转等的矩阵,因为我确信会有一个库,无论你使用什么语言(即C# )照顾这些。
在这种情况下,在选择原点和坐标系后,我们用三维向量表示空间中的点;例如(0,0,0)表示原点,(1,0,0)表示从正x方向的原点开始的1点单位。
现在想象一下围绕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)和乘法by(0,1,0)给出(0,1,0))。
您的矩阵库将具有一个函数MultiplyMatrixVector(或类似名称)来执行此操作,并使用函数RotationY(或类似名称)来构造表示围绕y轴旋转给定角度的矩阵。它可能通过从矩阵的行中读取的9个数字的数组来表示矩阵,[0,0,1,0,1,0,-1,0,0](或者可能从列中读取,[0 ,0,-1,0,1,0,1,0,0];您将从文档或反复试验中找出哪些内容。
通过矩阵表示旋转的一个优点是,如果要按顺序进行多次旋转,则可以将相应的矩阵相乘。同样,您的库将具有像MultiplyMatrices这样的函数来执行此操作。请注意,结果通常取决于旋转的顺序。再次检查库文档,了解使用MultiplyMatrices(A,B)时首先发生的旋转。
在练习中,要回答类似&#34的问题;如果围绕y轴旋转30度,然后围绕z轴旋转60度,那么点(2,3,4)会发生什么?&# 34;,你会做这样的事情:
Ry = RotationY(30);
Rz = RotationZ(60);
R = MultiplyMatrices(Rz, Ry);
result = MultiplyMatrixVector(R, Vector3D(2, 3, 4));
下一部分看起来很奇怪,但我们稍后会看到它有用之处:我们将通过四维向量来表示空间中的点。给出像(2,3,4)这样的3D点,我们可以通过在末端添加1来获得4D向量,即(2,3,4,1)。相反,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按顺序进行变换。为什么4D载体有用?我们可以代表一些新的转变。例如,在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坐标。例如,考虑点4 =(2,3,4),由4D向量(2,3,4,1)表示。应用矩阵给出(2,3,1,4),表示3D点(2 / 4,3 / 4,1 / 4)。删除z坐标,p投影到平面中的(2 / 4,3 / 4)。这模拟了相机如何将3D空间中的点映射到2D图像中的点。
可以在没有矩阵的情况下更简单地描述投影 - 它只是将(x,y,z)发送到(x / z,y / z)。使用矩阵的优点是它可以很容易地与其他变换结合使用。例如,如果相机不在原点或指向z方向,您可以通过乘以一些旋转和平移矩阵来解释这一点(再次,小心地按照正确的顺序得到它们)。