glFrustumによるARについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
peach

glFrustumによるARについて

#1

投稿記事 by peach » 5年前

現在、背景画像上に3Dモデルを描画するARのようなことをやろうとOpenCVとOpenGLを使ってプログラムを書いているのですが、なかなかうまくいかないので質問しました。

[1] 前提条件
[1-1] glOrtho(gluOrtho2D)ではなくglFrustum(gluPerspective)を用いる
[1-2] カメラパラメータは未知。したがって、ビュー行列、プロジェクション行列は自由に設定可能
(自由に設定して、上記を実現するのだから当然といえば当然ですが……)
[1-3] モデル行列の座標をx方向に1.0動かすと画面上(画像上)で1pixel動くようにしたい
[1-4] glOrthoの場合、奥行き(Z軸方向の並進)が反映されないので、glFrustumに置き換えたい

[2] 現状
[2-1] glOrtho(gluOrtho2D)を使えば実現できている
gluOrtho2Dに対して

コード:

cv::Mat img = cv::imread("入力画像", 0);

// 細かいOpenGLの設定
gluLookAt(0,0,200, //カメラ座標
  0, 0, 0 //焦点位置
  0, 1, 0 //ビューアップベクトル
  )

gluOrtho2D(0,0,img.cols, img.rows);
// glFrustum(0,0,img.cols, img.rows, 1e-2f, 1e6f);

glViewport(0, 0, 512, 512) // windowのサイズが512x512固定なので

void render()
{
// 3Dモデルの描画
// 画像の描画
}

という感じでやっています.

ただし、3Dモデルには任意の変形を加えた行列をモデル行列としています。
また、画像の描画時は、変換行列は全て単位行列にし、入力画像を正方形に変換してそれを画面全体埋め尽くす四角形に貼り付けることで背景画像として描画しています。

このコードをコメントアウトしているglFrustumに置き換えると変更前は表示されていた3Dモデルが表示されず困っています。

[2-2] glOrthoとglFrustumの自分の理解
[2-2-1] glOrtho(正投影)
画像上の1ピクセルとOpenGL上の1.0が1対1対応している。(今の設定であれば)
そのため、結構簡単にARのようなことができる
ただし、3DモデルをZ方向(奥行き方向に)動かしてもスケールが変化せず、無視される。
モデル行列にスケール行列をかければいいといえばその通りですが、それは無しでお願いします。

[2-2-2] glFrustum(透視投影)
画像上の1ピクセルとOpenGL上の1.0が1対1対応していない。
例えば3Dモデルを画像の右端に持っていくために、x,y方向に画像のサイズ文だけ並進させ、上記コードでコメントアウトしているglFrustumのパラメータで描画しても3Dモデルが見えない

[3] 困っている点のまとめ
・glOrthoからglFrustumに置き換えると3Dモデルが見えなくなる
・glFrustumに(x, y, near)を設定すると画像上の(x,y)に描画できるのではと思っているのですがそうはならない


[4] 環境
[4-1] OS:Windows 7 64bit
[4-2] 使用ライブラリ(使用用途):wxWidgets 3.0(GUI), OpenCV 3.0(画像処理、物体検出), OpenGL 1.0 {ドライバ的には4.3まで対応していますが使っているのは1.0のみ} (描画用)
[4-3] GPU:NVIDIA GeForce GTX 970
[4-4] 3Dモデルの寸法(AABBのサイズ):{-15 < x < 15, 18 < y < 18, -14 < z < 2}

よろしくお願いします。

“C言語何でも質問掲示板” へ戻る