1

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

我写了这段代码,但结果角度不超过 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;
4

2 回答 2

4

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

[R11,R12,T1]

[R21,R22,T2]

[ 磷 , 磷 , 1]

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

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

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

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

于 2012-06-10T15:18:18.277 回答
2

过程如下。考虑一个 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 列)
于 2012-06-11T01:46:45.437 回答