透视矩阵的旋转角度

rotation angle of the perspective matrix

本文关键字:旋转 透视      更新时间:2023-10-16

如何从透视矩阵检测旋转角度?

我写了这段代码,但结果角度不超过 40 ...

Mat mmat;
mmat.create(3,3,CV_32FC1);
mmat=getPerspectiveTransform(templPoints,imgPoints);
cout<< mmat<<endl<<endl;
float angle=acos(mmat.at<double>(0,0));
angle=(angle*180)/3.14;
cout<<"angle is"<<angle<<endl;

getPerspectiveTransform返回一个单应性矩阵,可以像这样分解:

[R11,R12,T1]

[R21,R22,T2]

[ P , P , 1]

R 表示旋转矩阵,T 表示平移,P 表示透视扭曲。

有关旋转矩阵表示的更多信息:

http://en.wikipedia.org/wiki/Rotation_matrix

http://mathworld.wolfram.com/RotationMatrix.html

过程如下。考虑一个 3D 点 X,以齐次坐标表示,由列向量 [ x1, x2, x3, 1]' 表示(我使用质数符号 "'" 表示换位)。然后考虑一个 2D 点 u = [u1, u2, 1]',它是(透视)相机中 X 的图像。然后相机的投影由 3x4 投影矩阵 P 表示,使得

u = P * X .

其中"*"表示逐列产品:u1 = P11*x1 + P12*x2 + P13*x3 + P14,依此类推。

矩阵 P 可以分解为两个矩阵的乘积:

P = K * Q

其中 K 是 3x3 上对角矩阵

K = [ fx s  cx
      0  fy cy
      0  0  1 ]

代表相机,Q 是一个 3x4 矩阵

Q = [R | t]

其中 R 是相机的 3x3 旋转矩阵,t 是 3x1 平移向量。

如果给定项目矩阵 P,则恢复 K、R 和 t 的过程如下:

  1. 计算P的"RQ分解"
  2. 从 Q 中提取 R(只需阅读其最左侧的 3 列)