私は独自の拡張現実感アプリケーションを設計しています。 私はすでに働いているパターンの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 ...よくうーん、私はこの例を見つけたので、これはある...非常に参考になります成功... 誰かが作業コードを持っているなら、本当に感謝します...ありがとう!!!
通常、glDrawPixelsを使用しないでください。通常は扱いにくいです。その代わりに、イメージがテクスチャであるテクスチャオブジェクトをレンダリングする必要があります。 http://www.opengl.org/resources/faq/technical/performance.htmを参照してください。バックグラウンドを描画するときは、必ずデプスバッファを無効にする(または後でクリアする)ようにしてください。 – ypnos
ええ、私はそれを試しましたが、実際にはテクスチャも素晴らしい結果を得ています...しかし、事実です:私は回転行列(niceです)と翻訳ベクトル(unscaledです)はOpenGL -1と1の間のカメラ位置のためのGL_MODELVIEW値だけを受け入れるようです...私は、OpenGLはX軸-1の左側と+1の右側を取っています... Y軸が取っている - 1つはボトム、もう1つはトップです。だから問題があるのは、私が知らないので誰かがそれをスケールする方法を知っているならばです。 – daleotar
'glMatrixMode(GL_TEXTURE);'は1つの道ですか、テクスチャ座標が別のつまり、あなたの座標を手で変換し、変換された座標を押します。 – EnabrenTane