如何从透视矩阵中检测旋转角度?
我写了这段代码,但结果角度不超过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;
答案 0 :(得分:3)
getPerspectiveTransform返回一个单应矩阵,可以这样分解:
[R11,R12,T1]
[R21,R22,T2]
[P,P,1]
R表示旋转矩阵,T表示平移,P表示透视扭曲。
有关旋转矩阵表示的更多信息:
答案 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的程序如下: