透视矩阵的旋转角度
rotation angle of the perspective matrix
如何从透视矩阵检测旋转角度?
我写了这段代码,但结果角度不超过 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 的过程如下:
- 计算P的"RQ分解"
- 从 Q 中提取 R(只需阅读其最左侧的 3 列)
相关文章:
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 顺时针迭代旋转 3 位数字
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 子轴围绕父轴而不是他自己的轴旋转
- 将使用太多的纹理插值器 - 带旋转的着色器
- SFML 向下移动时如何围绕屏幕中心旋转?
- 如何在OpenGL中正确旋转和缩放对象?
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 按时间自动旋转形状,同时在 OpenGL 中使用C++移动它们
- 如何使用增强::几何计算多边形的旋转固体体积?
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 绕Y轴旋转二维正方形,并使用DirectX或openGL以透视投影方式显示
- 透视矩阵的旋转角度