17

この質問に答えているように見えるGoogleの結果とstackoverflowの投稿がありますが、単純な事実は私がそれらを理解できないということです。どれだけ読んでも、四元数やオイラー角、ロドリゲス変換などに頭を悩ませることはできません。

OpenCVのsolvePnP()メソッドによって返される回転と平行移動のベクトルから3DグラフィックスアプリケーションにプラグインできるxyzPositionとxyzRotationの値を取得する方法を12歳のように説明してくれた人はいますか?

これは、C++の拡張現実アプリケーション用です。OpenCVパーツを起動して実行し、マーカーボードを追跡し、回転と平行移動のベクトルをグラフィックプログラムに送信していますが、その情報を使用して3Dオブジェクトのポーズをとる方法がわかりません。

私は本当にこの背後にある数学を理解したいと思います、そしてここで理論のどんな患者の説明にも感謝します。しかし、私はまた、コピー/貼り付けして別の日に理論を学ぶことができるいくつかのコードへのポインターに落ち着きます。実際、私は具体的なコードを見て理論に逆戻りすることで、このようなことをより早く学ぶようです。

編集:これがあるように...これは明らかに私を正しい方向に向けるべきですが、それは私が知っているすべての人のためのタイムマシンの計画かもしれません。高校の数学の修繕をお願いしているのではないかと思いましたが、初めてではありません。

編集:これは、solvePnP()から返される回転ベクトルと平行移動ベクトルの例です...グラフィックアプリケーションへの旅行のためにXMLに変換されます。私が見たこれらのすべてには、3つの行と1つの列が含まれていることに注意してください。

<Tvec type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>f</dt>
  <data>
    -2.50094433e+01 -6.59909010e+00 1.07882790e+02
  </data>
</Tvec>
<Rvec type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>f</dt>
  <data>
    -1.92100227e+00 -2.11300254e-01 2.80715879e-02
  </data>
</Rvec>
4

3 に答える 3

17

当初、私はOpenCVが使用するフォーマットについて何も知りませんでした。だから最初にいくつかの研究。のドキュメントをsolvePnP見ると、行列を返すように見えます。(Rodrigues2ドキュメントの古いバージョンで言及されている関数は、最近呼び出されているようRodriguesです。)

そこでの説明は、単一の行または単一の列のいずれかを持つ行列を期待できることを示しています。そのベクトルの方向は回転軸を示し、ベクトルの長さ(または「ノルム」)は角度を示します。

したがって、入力は角度軸表現になります。これは、xyz軸を中心とした同時回転として解釈できます。したがって、「XYZ回転」とは同時回転を意味する場合、すでにそこにいます。ただし、最初にx軸を中心に、次にy軸を中心に、次にz軸を中心に回転する組み合わせを意味する場合は、奇妙な設定になっているため、正しいAPIを使用していることを確認する必要があります。

あなたが求めているのがオイラー角である場合、それらを「XYZ回転」と呼ぶのはやや誤解を招きます。ウィキペディアの記事「三次元の回転形式」には、さまざまな形式のリストと、それらの間で変換する方法が記載されています。特に、軸と角度から行列に変換し、そこからオイラー角に変換する式を提供します。

グラフィックス出力機構に一致する正しい表現を使用していることを確認してください。または、選択肢がある場合は、回転マリックス表現を直接操作してみてください。これは、理解して操作するのが最も簡単なはずです。

于 2012-12-11T16:37:20.067 に答える
2
  1. 3Dベクトルを同次座標(4D)に拡張します。これは、コンポーネント(X、Y、Z、1)を持つ4Dベクトルを意味します

  2. 回転と平行移動のパラメータに基づいて、4x4の変換行列を作成します。これはアフィン変換と呼ばれます。あなたは回転行列に関する記事で正しい方向に進んでいます。

  3. 座標ベクトルに変換行列を掛けます。

このウィキペディアのセクションをチェックしてください:http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations

2D座標でポーズをとった例がありますが、3Dに拡張するのに十分なアイデアが得られると確信しています。

于 2012-12-11T16:36:55.820 に答える
2

私の推測では、OpenCvはすでにXYZ回転を返しています。左手を取り(左手の法則)、拳を閉じます。親指を上に向けて(z軸)、人差し指を真正面に伸ばし(x軸)、中指を右に伸ばします(y軸)。

特定の方向ベクトルは、最大3回転で指定できます。同等の回転を得ることができることを理解することが重要です。たとえば、インデックスが右を向くようにz軸を中心に回転します。同等の回転は、Z軸を含まない場合、Y、X、次にYになります。

ただし、完全な回転行列(3x3)を使用する場合は、これらの規則がすべて行列にマージされるため、これらの規則を気にする必要はありません。これはあなたがリンクした論文の内容であり、タイムトラベルではありません。これは、数学専攻のほとんどがタイムトラベルを行うことができ、人類を破滅させる可能性があるためです。

ただし、回転ベクトルは通常、オブジェクトが空間内でどのベクトルを中心に回転する必要があるかを示します。

于 2012-12-11T20:31:59.720 に答える