私は自分の拡張現実アプリケーションを設計しています。使用しているパターンの4つのコーナーはすでに検出されています。適切な順序で4つのコーナーを検出した後、それらをcvFindExtrinsicCameraParams2に渡します。カメラフレームに対するオブジェクトの回転と平行移動で良い結果が得られています。次に、その情報(回転ベクトルと平行移動ベクトル)をOpenGLに入れて、何かを描画する必要があります。当然、私はcvRodrigues2を使用して、回転ベクトルから回転行列を取得しています。これに加えて、私はこのようにQGlWidgetでカメラを見ています:
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();
}
さて、メインウィンドウのコンストラクターの追加のメモとして、次のようなものがあります。
windowGL = new GLWidget();
windowGL.setParent(this);
GLウィンドウをメインウィンドウ内に配置するため。また、GLViewer.h内に次のような新しい変数を作成しました。
double modelViewMatrix[16] = {0.0};
したがって、3Dオブジェクトを表示するために、GLViewer内に次のようなメソッドを作成しました。
void GlViewer::setModelView(double cameraMatrix[]){
for(int i=0;i<16;i++){
this->modelViewMatrix[i] = cameraMatrix[i];
}
this->updateGL();
}
その後、glDrawPixels()で画像を描画した後、明らかに行列をポップした後、GLViewer :: 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)の後)、次のことができます。何も見えません...だから、私が言ったように、私は自分の外部カメラパラメータを取得しているので、ARToolkitを使用せずに拡張現実を備えたQtで動作するコードを持っている人がいるかどうかはわかりません...したがって、外部カメラパラメータを取得し、それらをopenGLプロジェクションおよびmodelviewマトリックスに変換する実用的なコードを誰かが持っている場合...うーん、非常に役立ちます...これは私がこの例を見つけたためです:
http://old.uvr.gist.ac.kr/wlee/web/techReports/ar/Camera%20Models.html
私は2つのカメラモデル間の変換を成功させるためにすべての手順を実行しました...誰かが動作するコードを持っているかどうか本当に感謝します...ありがとう!!!