谈谈MATLAB中的相机Extrinsics

通过estimateCameraParameters函数求出的RotationMatrices和TranslationVectors表示了世界坐标系相对于相机的位姿,而求取相机相对于世界坐标系的位姿还需要通过extrinsicsToCameraPose函数。

通常,齐次变换矩阵可以写为 [ R t 0 1 ] \left[\begin{matrix}R & t \\ 0 & 1\end{matrix}\right] [R0t1]的形式。但是如果将之前求出的RotationMatrices和TranslationVectors如此组合,对齐次变换矩阵求逆之后,发现与extrinsicsToCameraPose所得的,姑且称为Orientation和Location所组成的齐次变换矩阵并不是互逆的关系。

原因为何?

先回到MATLAB对于extrinsics的说明中,相机坐标系和世界坐标系的转换关系是这样描述的:
coord
extrinsicsToCameraPose的code是这样的:

function [orientation, location] = extrinsicsToCameraPose(R, tIn)
validateInputs(R, tIn, 'rotationMatrix', 'translationVector');
t = tIn(:)';
orientation = R';
location = -t*orientation;

二者是能够对应上的。

注意到公式中的描述,R是一个3x3矩阵,而 [ X Y Z ] R [X Y Z]R [XYZ]R,显然这里的[X Y Z]是1x3的行向量,这就与通常所用的坐标列向量不同了。因此,相应的齐次变换矩阵的写法应该是 [ R 0 t 1 ] \left[\begin{matrix}R & 0 \\ t & 1\end{matrix}\right] [Rt01],逆矩阵则为 [ R − 1 0 − t R − 1 1 ] \left[\begin{matrix}R^{-1} & 0\\ -tR^{-1} & 1\end{matrix}\right] [R1tR101],perfect!

所以,对于坐标用列向量表示的情况,变换矩阵 H = R T H=RT H=RT。相同的变换,如果坐标用行向量表示,相当于进行了转置,变换矩阵则为 T T R T T^{T} R^{T} TTRT。用OpenCV求得的外参跟MATLAB对比来看就区别立现了。

原来只是坐标表示习惯的问题?
一开始看到 [ X Y Z ] R [X Y Z]R [XYZ]R,还考虑过是否跟线性空间基变换与坐标变换之间过渡矩阵有关系,但是加上平移后,这是个在仿射空间进行的变换,虽然可以理解对仿射标架进行旋转以及对坐标原点进行平移,但是将二者组合在一起,用一个齐次变换矩阵来表示,在理论上又没有找到相关的支持?(这里说的是仿射坐标系的变换,如果是对用齐次坐标表示的点或者向量进行变换是没问题的)。
以上只是一点看法,欢迎探讨指正!

BTW,坐标用行向量表示的,类似的还有DirectX。

Guess you like

Origin blog.csdn.net/u013213111/article/details/109212113