Эффективное умножение кватернионов C++ с использованием cv:: Mat

Я хочу умножить 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
}

Это самый быстрый способ с OpenCV? Будет ли быстрее всего использовать арифметику с фиксированной точкой?

3 ответов


на этой учебник различные способы доступа к различным пикселей. The Mat::at функция оказалась примерно на 10% медленнее по сравнению с прямым доступом к пикселям, вероятно, из-за дополнительной проверки в режиме отладки.

Если вы действительно выключены для производительности, вы должны переписать свой метод с 3 различными методами, упомянутыми в тексте, а затем профиль, чтобы найти тот, который лучше всего в вашей ситуации.


там-был вектор ARM с плавающей точкой кватернион умножить там я не могу найти сейчас. Я мог бы найти эту библиотеку SIMD:

пуля 3D игры Multiphysics библиотека


кватернионы часто используются для поворота 3D-векторов, поэтому вы можете проверить, что один кватернион является чистым вектором (т. е. скалярная или реальная часть равна нулю). Это может сократить вашу работу до 12 умножает, 8 добавляет / вычитает и один знак флип.

вы также можете использовать умножение кватернионов на двух чистых векторах для одновременного вычисления их точечных и перекрестных произведений, поэтому тестирование для этого особого случая также может стоить того. Если оба кватерниона являются чистыми векторами, вам нужно только сделать 9 умножает, 5 добавляет / вычитает и один знак флип.