使用cv :: Mat进行高效的C++四元数乘法

Jav*_*ock 11 c++ opencv quaternions

我想乘以2个四元数,它们存储在cv :: Mat结构中.我希望功能尽可能高效.到目前为止,我有以下代码:

/** Quaternion multiplication
 *
 */
void multiplyQuaternion(const Mat& q1,const Mat& q2, Mat& q)
{
    // First quaternion q1 (x1 y1 z1 r1)
    const float x1=q1.at<float>(0);
    const float y1=q1.at<float>(1);
    const float z1=q1.at<float>(2);
    const float r1=q1.at<float>(3);

    // Second quaternion q2 (x2 y2 z2 r2)
    const float x2=q2.at<float>(0);
    const float y2=q2.at<float>(1);
    const float z2=q2.at<float>(2);
    const float r2=q2.at<float>(3);


    q.at<float>(0)=x1*r2 + r1*x2 + y1*z2 - z1*y2;   // x component
    q.at<float>(1)=r1*y2 - x1*z2 + y1*r2 + z1*x2;   // y component
    q.at<float>(2)=r1*z2 + x1*y2 - y1*x2 + z1*r2;   // z component
    q.at<float>(3)=r1*r2 - x1*x2 - y1*y2 - z1*z2;   // r component
}
Run Code Online (Sandbox Code Playgroud)

这是OpenCV最快的方式吗?使用定点算法会最快吗?

inf*_*inf 4

本教程介绍了访问不同像素的不同方法Mat::at与直接像素访问相比,该函数的速度大约慢 10%,这可能是由于调试模式下的额外检查所致。

如果您确实不追求性能,则应该使用文中提到的 3 种不同方法重写您的方法,然后进行分析以找到最适合您情况的方法。