11

cv::Mat構造に格納されている2つのクォータニオンを乗算したいと思います。関数をできるだけ効率的にしたいと思います。私はこれまでに次のコードを持っています:

/** 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での最速の方法ですか?固定小数点演算を使用すると最速になりますか?

4

3 に答える 3

4

このチュートリアルではさまざまなピクセルにアクセスするさまざまな方法について説明します。このMat::at関数は、おそらくデバッグモードでの追加のチェックが原因で、直接ピクセルアクセスと比較して約10%遅いことがわかりました。

パフォーマンスが本当に低下している場合は、テキストに記載されている3つの異なるメソッドを使用してメソッドを書き直してから、プロファイルを作成して、状況に最適なメソッドを見つける必要があります。

于 2012-05-28T15:50:54.947 に答える
2

ARMベクトル浮動小数点クォータニオンが乗算されていましたが、現在は見つかりません。私はこのSIMDライブラリを見つけることができました:

Bullet3Dゲームマルチフィジックスライブラリ

于 2012-06-08T16:09:24.433 に答える
0

クォータニオンは3Dベクトルを回転させるためによく使用されるため、1つのクォータニオンが純粋なベクトル(つまり、スカラーまたは実数部がゼロ)であることを確認することを検討してください。これにより、作業が12の乗算、8の加算/減算、および1つの符号反転に削減される可能性があります。

また、2つの純粋なベクトルで四元数の乗算を使用して、ドットと外積を同時に計算できるため、この特殊なケースをテストすることも価値があります。両方のクォータニオンが純粋なベクトルである場合は、9回の乗算、5回の加算/減算、および1回の符号反転のみを実行する必要があります。

于 2015-03-25T08:11:16.827 に答える