如何从透视矩阵检测旋转角度?
我写了这段代码,但结果角度不超过 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;
如何从透视矩阵检测旋转角度?
我写了这段代码,但结果角度不超过 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]
[ 磷 , 磷 , 1]
R代表旋转矩阵,T代表平移,P代表透视扭曲。
有关旋转矩阵表示的更多信息:
过程如下。考虑一个 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 的过程如下: