透视矩阵的旋转角度

时间:2012-06-10 13:40:37

标签: c++ opencv computer-vision

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

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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等。

Matrix 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
  2. 的“RQ decomposition
  3. 从Q中提取R(只读取最左边的3列)