了解 Matlab stereoCameraCalibrator 上的外部立体参数(旋转)
Understanding extrinsic stereoParameters (rotation) on Matlab stereoCameraCalibrator
考虑休闲立体相机系统 calibration parameters using matlab stereoCameraCalibrator 应用程序。
R1 = stereoParams.CameraParameters1.RotationMatrices(:,:,N);
R2 = stereoParams.CameraParameters2.RotationMatrices(:,:,N);
R12 = stereoParams.RotationOfCamera2;
是:
R1:从世界坐标(对于图像 N)到相机 1 的旋转。
R2:从世界坐标(对于图像 N)到相机 2 的旋转。
R12:从相机 1 坐标到相机 2 的旋转。如
中所述
如果那是正确的,不应该 R12*R1 == R2
吗?
但是我得到了不同的值,所以,我在这里缺少什么?
编辑
好吧,它接缝所有矩阵转置。所以:R12'*R1' == R2'
!
为什么要转置?
之所以转置是因为在坐标之间进行几何变换时,MATLAB使用行向量进行变换,而列向量 传统上在实践中使用。
换句话说,要将坐标从一个点转换到另一个点,您通常会执行:
x' = A*x
A
是变换矩阵,x
是 列 坐标向量。输出 x'
将是另一个坐标列向量。 MATLAB 实际上使用了一个 行向量 所以如果你想在乘法中达到同样的效果,你必须 转置 矩阵 A
(即 A^{T}
)并预乘 A
而不是 post - 乘法:
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 是一种基于 column-major 的语言,这意味着数字按列填充在矩阵中。因此,如果您要一次填充矩阵一个元素,这将以列方式完成,因此系数按列填充,而不是像我们通常习惯的那样按行填充,最终导致我们'以上总结。
因此,当您同时转置 R12
和 R1
时,这会将表示带回行主设置,其中这些矩阵最初是列主设置,以便于 MATLAB 使用。因此,行主要设置允许您使用作为列向量的坐标来促进转换。这个列向量设置是我们习惯的。因此,在转置后将 R12
和 R1
相乘,即可得到标准行主要表示形式中的正确变换矩阵 R2
。
考虑休闲立体相机系统 calibration parameters using matlab stereoCameraCalibrator 应用程序。
R1 = stereoParams.CameraParameters1.RotationMatrices(:,:,N);
R2 = stereoParams.CameraParameters2.RotationMatrices(:,:,N);
R12 = stereoParams.RotationOfCamera2;
是:
R1:从世界坐标(对于图像 N)到相机 1 的旋转。
R2:从世界坐标(对于图像 N)到相机 2 的旋转。
R12:从相机 1 坐标到相机 2 的旋转。如
如果那是正确的,不应该 R12*R1 == R2
吗?
但是我得到了不同的值,所以,我在这里缺少什么?
编辑
好吧,它接缝所有矩阵转置。所以:R12'*R1' == R2'
!
为什么要转置?
之所以转置是因为在坐标之间进行几何变换时,MATLAB使用行向量进行变换,而列向量 传统上在实践中使用。
换句话说,要将坐标从一个点转换到另一个点,您通常会执行:
x' = A*x
A
是变换矩阵,x
是 列 坐标向量。输出 x'
将是另一个坐标列向量。 MATLAB 实际上使用了一个 行向量 所以如果你想在乘法中达到同样的效果,你必须 转置 矩阵 A
(即 A^{T}
)并预乘 A
而不是 post - 乘法:
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 是一种基于 column-major 的语言,这意味着数字按列填充在矩阵中。因此,如果您要一次填充矩阵一个元素,这将以列方式完成,因此系数按列填充,而不是像我们通常习惯的那样按行填充,最终导致我们'以上总结。
因此,当您同时转置 R12
和 R1
时,这会将表示带回行主设置,其中这些矩阵最初是列主设置,以便于 MATLAB 使用。因此,行主要设置允许您使用作为列向量的坐标来促进转换。这个列向量设置是我们习惯的。因此,在转置后将 R12
和 R1
相乘,即可得到标准行主要表示形式中的正确变换矩阵 R2
。