理解Matlab立体相机标定工具中外参立体参数(旋转)

3
考虑以下立体相机系统校准参数,使用MatlabstereoCameraCalibrator应用程序进行校准。
R1 = stereoParams.CameraParameters1.RotationMatrices(:,:,N);
R2 = stereoParams.CameraParameters2.RotationMatrices(:,:,N);
R12 = stereoParams.RotationOfCamera2;

需要翻译的内容如下:

给定以下变量:
R1:从世界坐标系(对于图像N)旋转到相机1。
R2:从世界坐标系(对于图像N)旋转到相机2。
R12:从相机1坐标旋转到相机2。 如相关SO问题所述。

如果正确,那么 R12*R1 == R2 吗?

但我得到了不同的值,所以我错过了什么?


编辑

好吧,它们似乎都是转置矩阵。所以:R12'*R1' == R2'
为什么它们是转置的?

1个回答

3

它们被转置的原因是,当在坐标之间进行几何变换时,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校准工具箱(www.vision.caltech.edu/bouguetj/calib_doc)正确输出了矩阵。 - Pedro77
@Pedro77 老实说,我也会转置矩阵。我习惯于按行主序对齐元素。Jean-Yves Bouguet的工具箱非常好用。我以前用过它,参数估计正确执行,因为代码和优化输出的矩阵是按行主序排列的。很高兴能帮到你! - rayryeng
稍微扩展一下。你比较过两者的结果了吗(例如3D误差)?我有一些实习的结果,但我要自己检查一下。我认为Matlab应用程序是基于Bouguetj工具箱完成的,对吧?此外,是否有办法将Y的棋盘格大小设置为与Bouguetj工具箱中的正方形不同而不是一个正方形?你知道,打印机永远不够好。 - Pedro77
嗨,我从未比较过它们两个。实际上,我从未真正使用过MATLAB的CVST的这一部分,所以我不知道棋盘格的大小。我知道它是基于Bouguet工具箱的,但那就是我所知道的全部。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接