2

2 台のカメラを使用した頭部姿勢推定プロジェクトに取り組んでいます。1 つのカメラ システムに対して動作し、各カメラ座標系に対する頭部の回転行列と並進ベクトルを返します。頭の動きを表すために回転および変換された OpenGL シーンでオブジェクトをレンダリングしました。計算された回転行列と並進ベクトルを表示するには、次の OpenGL コマンドを使用するだけです。

glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(pose_matrix);

ここで、ポーズ マトリックスは、頭部の回転マトリックスと並進ベクトルから構成される OpenGL ModelView マトリックスです。

現在、2 台のキャリブレーション済みカメラに対してこれを実行しようとしています。最初のカメラが顔の追跡を失ったが、2 番目のカメラが頭の姿勢を推定した場合、2 番目のカメラに対する回転と平行移動を表示し、その逆も同様です。どちらの場合も、1 つの OpenGl オブジェクトを表示して移動したいと考えています。そのためには、ポーズ行列を共通の座標フレームに転送する必要があります。

2 台のカメラの相対的なジオメトリを知っています。カメラの 1 つがワールド座標フレームであると仮定し、最初のカメラに対して 2 番目のカメラのポーズ マトリックスとキャリブレーション マトリックスを乗算することにより、2 番目のカメラのヘッド ポーズ マトリックスを最初のカメラのフレームに転送します。この乗算された行列を OpenGL ModelView 行列にロードすると、間違った結果が得られます。最初のカメラが顔をキャプチャすると、オブジェクトは右に移動しますが、2 番目のカメラではオブジェクトが平行移動および回転し、最初のカメラの場合と同じ場所にはありません。

何が問題なのですか?OpenGLの表示部分が間違っているのでしょうか?

4

1 に答える 1

0

安全なデフォルトの仮定: OpenGL は正しく、コードは間違っています。

コードを表示せずに、行列を印刷して、Matlab または Octave でそれらを使用して数学を再確認することをお勧めします。

よくある間違いは、OpenGL がデフォルトで ROW ベクトルを modelvie 行列 (実際にはすべての行列) で前乗算することを忘れることです。つまり、v_row * M として乗算され、行列は列優先順で格納されますが、ベクトルを COLUMN として扱い、M * v_col (格納された M行優先)。

後者の規則 (推奨) を使用する場合は、GL_ARB_transpose_matrix拡張機能を調べてください。

于 2012-10-03T13:48:49.470 に答える