web-dev-qa-db-ja.com

OpenCVの回転と平行移動のベクトルをXYZ回転とXYZ位置に変換する

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

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

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

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

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

編集:これは、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>
15
John

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

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

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

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

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

14
MvG

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

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

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

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

2
Eric
  1. 3Dベクトルを同次座標(4D)に拡張します。これは、コンポーネント(X、Y、Z、1)を持つ4Dベクトルを意味します

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

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

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

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

2
ypnos