将四元数转化为相机旋转矩阵 - OpenCV

4

我已经尝试了几周,试图使用精确的四元数来变形一些照片,但是没有成功。下面的方程似乎不能像我从准确位置期望的那样旋转相机位置。我做对了吗?还有什么我忽略的吗?

我知道仅仅传递一个四元数不足以拼接照片,但它应该足以对齐照片吧?

这是公式:

double divmult = 2.0 / lsq;
double xx = divmult * x * x;
double yy = divmult * y * y;
double zz = divmult * z * z;

double wx = divmult * w * x;
double wy = divmult * w * y;
double wz = divmult * w * z;
double xy = divmult * x * y;
double xz = divmult * x * z;
double yz = divmult * y * z;

cameras_global[imageCounter].R = (Mat_<float>(3, 3) << ( 1 - yy - zz ),    -( xy - wz ),   -( xz + wy ),
                                  ( xy + wz ),        -( 1 -xx -zz ), -( yz - wx ),
                                  ( xz - wy ),        -( yz + wx ),   -( 1 -xx -yy )   );
1个回答

2

OpenCV不直接支持四元数。与其修正计算,我会选择更简单的转换方式。最接近它的是使用轴角向量来表示3D旋转(也称为罗德里格斯角)。我会将其转换为轴角,然后将轴乘以角度以获得罗德里格斯角。之后,您可以使用OpenCV内置的函数,例如cv::Rodrigues将其转换为一个3x3旋转矩阵。


如果我错了,请纠正我。您引用的链接似乎与您所说的相反。它似乎是将角速度转换为四元数? - user4200570
完美,谢谢!最后一个问题,(如果这是一个新手问题,我提前道歉),但是 - 在我将四元数转换为罗德里格斯角之后,我是否使用罗德里格斯返回到camera_global [0] .R?或者我该如何处理这些角度? - user4200570
Rodrigues(v, camera_global[0].R) - SpamBot
请查看我在此处的最新问题:https://dev59.com/Tpnga4cB1Zd3GeqPcbR8,您可以在那里看到仅通过传递上述方程获得的结果。这被认为是“好”的吗?还是将其转换为罗德里格斯会获得更准确的结果? - user4200570

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接