8

私は自分の拡張現実アプリケーションを設計しています。使用しているパターンの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つのカメラモデル間の変換を成功させるためにすべての手順を実行しました...誰かが動作するコードを持っているかどうか本当に感謝します...ありがとう!!!

4

1 に答える 1

2

私は、The Artvertiserでエゴポーズ推定のために CV を使用しましたが、このようなものはあなたの頭を働かせることができます.

まず、なぜ何も見えないのかを理解する必要があります。いくつかの理由が考えられますが、最も可能性が高いのはカメラの視線方向の反転 (利き手の混乱) であるため、ジオメトリは実際には OpenGL 空間でカメラの「後ろ」にあります。しかし、私が試す最初のデバッグは次のとおりです。

  • x および z 次元で 0.1f のステップで -1 から 1 までループすることによってグラウンド グリッドを描画し、glLines を描画して y 平面の一部を定義します (y=up/down の右手座標系を想定: x は右、y は上、z は画面の外で自分の方を向いています) (このようにして、カメラ マトリックスが与える世界のスケールと向きを感じることができます)
  • カメラの「後ろ」のジオメトリ(キーを押してカメラを前後に動かし、少し動き回ってジオメトリが見つかるかどうかを確認します)
  • ジオメトリ スケールが大きすぎる/小さすぎる(カメラをセットアップした直後に、glScalef を使用してグローバル スケールを調整するためのキープレスをキャッチします)
  • クリッピング プレーンの外側のジオメトリ(クリッピング プレーンを調整します)

また、これは少し疑わしいように見えます:this->modelViewMatrix[i] = cameraMatrix[i];最初に cameraMatrix を反転しようとしましたか?

于 2011-06-10T17:19:32.573 に答える