2011-05-29 13 views
8

私は独自の拡張現実感アプリケーションを設計しています。 私はすでに働いているパターンの4つのコーナーを検出しました。適切な順番で4つのコーナーを検出したら、それらをcvFindExtrinsicCameraParams2に渡します。 オブジェクトをカメラのフレームに合わせて回転させたり、平行移動したりすると、良い結果が得られます。 今私はその情報(回転ベクトルと翻訳ベクトル)をOpenGLに入れて何かを描く必要があります。もちろん、私はcvRodrigues2を使って回転ベクトルから回転行列を取得しています。 は、これに加えて、私は、このようにQGlWidgetでカメラを見ている:OpenCV + OpenGL + Qt

GLWidget.h

#ifndef _GLWIDGET_H 
#define _GLWIDGET_H 

#include <QtOpenGL/QGLWidget> 
#include <cv.h> 
#include <cxcore.h> 

class GLWidget : public QGLWidget { 

    Q_OBJECT // must include this if you use Qt signals/slots 

public: 
    GLWidget(QWidget *parent = NULL); 
    IplImage *img; 
    void setImage(IplImage *imagen); 
protected: 
    void initializeGL(); 
    void resizeGL(int w, int h); 
    void paintGL(); 
}; 

#endif /* _GLWIDGET_H */ 

GLWidget.cpp

#include <QtGui/QMouseEvent> 
#include "GLWidget.h" 

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent) { 
    this->img = 0; 
} 

void GLWidget::initializeGL() { 
    glDisable(GL_TEXTURE_2D); 
    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_COLOR_MATERIAL); 
    glEnable(GL_BLEND); 
    glEnable(GL_POLYGON_SMOOTH); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glClearColor(0, 0, 0, 0); 
} 

void GLWidget::resizeGL(int w, int h) { 
    glViewport(0, 0, w, h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, w, 0, h); // set origin to bottom left corner 
// gluPerspective(52.0f, 1.3333f, 0.1f, 100.0f); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

} 

void GLWidget::paintGL() { 

    if(this->img) 
    { 
     glClear (GL_COLOR_BUFFER_BIT); 
     glClearColor(0.0,0.0,0.0,1.0); 
     glMatrixMode(GL_PROJECTION); 
     glPushMatrix(); 
     glLoadIdentity(); 
     gluOrtho2D(0.0,img->width, 0.0, img->width); 
     glMatrixMode(GL_MODELVIEW); 
     glPushMatrix(); 
     glLoadIdentity(); 
     glDrawPixels(img->width,img->height,GL_RGB,GL_UNSIGNED_BYTE,img->imageData); 
     glMatrixMode(GL_PROJECTION); 
     glPopMatrix(); 
     glMatrixMode(GL_MODELVIEW); 
     glPopMatrix(); 
    } 
} 
void GLWidget::setImage(IplImage *imagen) 
{ 
    this->img = imagen; 
    this->updateGL(); 
} 

オクラホマので、など私のMainWindowのコンストラクタの追加のメモには、次のようなものがあります。

windowGL = new GLWidget(); 
windowGL.setParent(this); 

GLウィンドウをMainWindowの内部に配置するためです。私は、その後

void GlViewer::setModelView(double cameraMatrix[]){ 
    for(int i=0;i<16;i++){ 
    this->modelViewMatrix[i] = cameraMatrix[i]; 
    } 
    this->updateGL(); 
} 

double modelViewMatrix[16] = {0.0}; 

ので、3Dオブジェクトを表示するために、私はこのようなGLViewer内のメソッドを作成しました。また、私はと呼ばれるGLViewer.h内に新しい変数を作成しましたGLViewerに入れglDrawPixels(で画像を描画した後、このような:: paintGL()メソッドの何か)と明らかに行列をポップした後:

glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixd(this->modelViewMatrix); 
    glPushMatrix(); 
    glColor3f(1,0,0); 

    glPushAttrib(GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT | GL_ENABLE_BIT) ; 
    glDisable(GL_LIGHTING) ; 
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) ; 
    glLineWidth(3); 

    glBegin(GL_LINES) ; 
      glColor3f(1,0,0) ; 
      glVertex3f(0,0,0) ; 
      glVertex3f(100,0,0); 

      glColor3f(0,1,0) ; 
      glVertex3f(0,0,0) ; 
      glVertex3f(0,100,0); 

      glColor3f(0,0,1) ; 
      glVertex3f(0,0,0) ; 
      glVertex3f(0,0,100); 
    glEnd() ; 

    glLineWidth(1) ; 
    glPopAttrib() ; 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix(); 

をだから、modelViewMatrixのために私は考慮しています行の代わりに列に並べ替えるか、または何かを入れ替える必要があります。 最後のステップとして、カメラ組み込み関数と外部関数を配列に変換した後に、作成した関数GLWidget :: setModelViewを呼び出します。

windowGL.setModelView(convertedFromIntrExtr); 

しかし、私は何も見てないよ...私はglutPerspectiveを(使用する場合、私は、コードを試みたと私は働いしかし...座標軸を描くが、射影行列なしていることを得る)(明らかにglMatrixMode後(GL_PROJECTION))私は何も見ることができません...だから、そこにいる誰かがQtにARToolkitを使わずに拡張​​された現実を持っているかどうかわかりません。なぜなら、私が言ったように、私自身のためのパラメータ...だから、誰かが外的なカメラパラメータとtraを取得する作業コードを持っているなら私は2つのカメラモデルの間の変換せずに達成するために、すべての手順に従っ

http://old.uvr.gist.ac.kr/wlee/web/techReports/ar/Camera%20Models.html 

:OpenGLの投影とモデルビュー行列にそれらをnslate ...よくうーん、私はこの例を見つけたので、これはある...非常に参考になります成功... 誰かが作業コードを持っているなら、本当に感謝します...ありがとう!!!

+0

通常、glDrawPixelsを使用しないでください。通常は扱いにくいです。その代わりに、イメージがテクスチャであるテクスチャオブジェクトをレンダリングする必要があります。 http://www.opengl.org/resources/faq/technical/performance.htmを参照してください。バックグラウンドを描画するときは、必ずデプスバッファを無効にする(または後でクリアする)ようにしてください。 – ypnos

+0

ええ、私はそれを試しましたが、実際にはテクスチャも素晴らしい結果を得ています...しかし、事実です:私は回転行列(niceです)と翻訳ベクトル(unscaledです)はOpenGL -1と1の間のカメラ位置のためのGL_MODELVIEW値だけを受け入れるようです...私は、OpenGLはX軸-1の左側と+1の右側を取っています... Y軸が取っている - 1つはボトム、もう1つはトップです。だから問題があるのは、私が知らないので誰かがそれをスケールする方法を知っているならばです。 – daleotar

+0

'glMatrixMode(GL_TEXTURE);'は1つの道ですか、テクスチャ座標が別のつまり、あなたの座標を手で変換し、変換された座標を押します。 – EnabrenTane

答えて

2

私は自我のポーズThe Artvertiserの推定を、そしてこのようなものがであなたの頭を行うことができますためCVで働いてきた。

まず、あなたは何を見ることができない理由を把握する必要があります。これは、カメラルックアサイン方向(手の混乱)の逆転である可能性が最も高いため、OpenGL空間のカメラの後ろにジオメトリが配置されている可能性があります。しかし、私はしようと最初のデバッグものがあろう。

  • は(Y平面の部分を定義するためにglLines描画、x及びz次元で0.1Fのステップで-1から1までループすることによって、接地グリッドを描きますy =上/下:xが右、yが上、zがあなたを指し示している右手座標系を仮定)(この方法で、世界のスケールとカメラの方向性を感じることができます行列は、あなたがジオメトリを見つけることができるかどうか
  • )前後にカメラを移動し、少し周りを移動して見ることがあなたに)カメラ (キャッチキー押下「背後」
  • ジオメトリを与えています
  • ジオメトリ規模が大きすぎる/小さすぎる

(クリッピング平面を調整する)クリッピング平面の外

  • ジオメトリ(キャッチキー押下は、右カメラを設定した後glScalefを使用してグローバル規模を調整するために)また、これは少し疑わしいように見える:this->modelViewMatrix[i] = cameraMatrix[i];あなたはcameraMatrixを先に反転させてみましたか?

  • +0

    いいえ、私はそれを得たと思う、ちょうど私はカメラのZ軸が負であるが正であると仮定していた... – daleotar

    関連する問題