matlab - 了解 Matlab stereoCameraCalibrator 上的外部立体参数(旋转)

标签 matlab computer-vision matlab-cvst camera-calibration

考虑下面的立体相机系统 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 是一种基于列优先 的语言,这意味着数字按列填充在矩阵中。因此,如果您要一次填充矩阵一个元素,这将以列方式完成,因此系数按列填充,而不是像我们通常习惯的那样按行填充,最终导致我们'以上结论。

因此,当您转置了 R12R1 时,这会将表示带回到行主设置,其中这些矩阵最初是列主设置,以便于 MATLAB 使用.因此,行主要设置允许您使用作为列向量的坐标来促进转换。这个列向量设置是我们习惯的。因此,在转置后将 R12R1 相乘,即可得到标准行主要表示形式中的正确变换矩阵 R2

关于matlab - 了解 Matlab stereoCameraCalibrator 上的外部立体参数(旋转),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37687604/

相关文章:

matlab - 如何使用 MATLAB 的 'isosurface' 函数创建三角球体

math - 倍频程/Matlab : How to plot the roots of a polynomial

计算两个 vector 之间的角度(atan2 不连续问题)

image - Matlab 金字塔问题

c++ - Bag of Features 如何运作?

python - 我如何在opencv python中控制轮廓区域

matlab - 对于 MATLAB 中的大型稀疏矩阵,计算非零条目的各列的累积和?

matlab - 如何在Matlab中为边缘检测和角点检测提供感兴趣区域(ROI)?

image - 在matlab中找到两张非常相似的图片之间的角度

image - 导入多个名称未知的图像