考虑下面的立体相机系统 calibration parameters使用 matlab stereoCameraCalibrator应用程序。
R1 = stereoParams.CameraParameters1.RotationMatrices(:,:,N);
R2 = stereoParams.CameraParameters2.RotationMatrices(:,:,N);
R12 = stereoParams.RotationOfCamera2;
是:
R1:从世界坐标(对于图像 N)到相机 1 的旋转。
R2:从世界坐标(对于图像 N)到相机 2 的旋转。
R12:从相机 1 坐标到相机 2 的旋转。如 related SO question 中所述
如果那是正确的,那么 R12*R1 == R2
不应该吗?
但我得到了不同的值,所以,我在这里缺少什么?
编辑
好吧,它接缝所有矩阵转置。所以:R12'*R1' == R2'
!
为什么要转置?
最佳答案
它们被转置的原因是因为在坐标之间进行几何变换时,MATLAB 使用行向量 进行变换,而传统上使用列向量在实践中。
换句话说,要将坐标从一个点转换到另一个点,您通常会执行:
x' = A*x
A
是变换矩阵,x
是坐标的列 向量。输出 x'
将是另一个坐标列向量。 MATLAB 实际上使用了一个行向量,因此如果您想在乘法中实现相同的效果,您必须转置矩阵A
(即A^{T}
) 并预乘 A
而不是后乘:
x' = x*A^{T}
此处 x
将是一个行向量,为确保正确累加行和列的加权组合,您必须转置 A
以保持相同的计算。但是,输出 x'
的形状将改为行向量。
这也可以通过转置两个矩阵的乘积来验证。具体来说,如果 x' = A*x
,那么为了将输出转换为行向量 x'^{T}
,我们必须转置矩阵向量积:
x'^{T} = (A*x)^{T} = x^{T}*A^{T}
最后的陈述是转置两个矩阵的乘积的自然属性。有关更多详细信息,请参阅 Transpose Wikipedia 文章中的第 3 点:https://en.wikipedia.org/wiki/Transpose#Properties
执行转置的原因最终可追溯到 MATLAB 处理数字在内存中对齐方式的方式。 MATLAB 是一种基于列优先 的语言,这意味着数字按列填充在矩阵中。因此,如果您要一次填充矩阵一个元素,这将以列方式完成,因此系数按列填充,而不是像我们通常习惯的那样按行填充,最终导致我们'以上结论。
因此,当您转置了 R12
和 R1
时,这会将表示带回到行主设置,其中这些矩阵最初是列主设置,以便于 MATLAB 使用.因此,行主要设置允许您使用作为列向量的坐标来促进转换。这个列向量设置是我们习惯的。因此,在转置后将 R12
和 R1
相乘,即可得到标准行主要表示形式中的正确变换矩阵 R2
。
关于matlab - 了解 Matlab stereoCameraCalibrator 上的外部立体参数(旋转),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687604/