OpenCV + OpenGL + Qt

Я разрабатываю собственное приложение дополненной реальности. Я уже определил 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();
}

Хорошо, поэтому в качестве дополнительной заметки в конструкторе моего MainWindow у меня есть что-то вроде:

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

Чтобы поместить окно GL в MainWindow. Также я создал новую переменную внутри 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();
}

После этого я помещаю в GLViewer :: paintGL () что-то вроде этого после рисования изображения с помощью glDrawPixels () и, очевидно, после выталкивания матриц:

    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, потому что, как я уже сказал, я получаю внешние параметры камеры для себя ... Итак, если у кого-то есть рабочий код, в котором вы получаете внешние параметры камеры и преобразовать их в матрицы проекции openGL и просмотра модели ... хм, было бы очень полезно ... это потому, что я нашел этот пример:

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

Я безуспешно выполнил все шаги, чтобы добиться этого преобразования между двумя моделями камер ... Я буду очень признателен, если у кого-то есть рабочий код ... спасибо !!!

8
задан dabhaid 29 May 2011 в 09:52
поделиться