2011-05-29 2 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(); 
} 

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

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

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

+0

Вы не должны использовать glDrawPixels, как обычно, это неловко медленно. Вместо этого вы должны визуализировать текстурированный объект, при этом ваше изображение будет текстурой. См. Http://www.opengl.org/resources/faq/technical/performance.htm. Обязательно отключите буфер глубины (или очистите его) при рисовании фона. – ypnos

+0

Да, я пробовал, что на самом деле у меня получаются хорошие результаты с текстурой ... однако дело в том, что у меня есть матрица вращения (что хорошо) и вектор трансляции (который немасштабирован), потому что openGL похоже, принимает только значения GL_MODELVIEW для положения камеры между -1 и 1 ... Я имею в виду, что openGL принимает для оси X -1 как левую сторону и +1 для правой стороны ... для оси Y берет - 1 для нижнего и +1 для верхнего ... Итак, дело в том, что кто-нибудь знает, как масштабировать, потому что я не знаю – daleotar

+0

'glMatrixMode (GL_TEXTURE);' может быть одним из способов, или как вы заявляете, что ваши координаты текстуры могут быть другой. То есть, трансформируйте свои координаты вручную, затем нажмите преобразованную координату. – EnabrenTane

ответ

2

Я работал с резюме для эго-поза оценки на The Artvertiser, и этот материал может сделать вашу голову.

Во-первых, вам нужно выяснить, почему вы ничего не можете видеть.Это может быть по ряду причин, скорее всего, это инверсия направления взгляда камеры (путаница путаницы), поэтому геометрия фактически «отстает» от камеры в пространстве OpenGL. Но первые отладочные вещи, которые я хотел бы попробовать бы:

  • рисовать землю сетку с помощью цикла от -1 до 1 с шагом 0.1f в х и г размеров, рисунок glLines определить часть у плоскости (предполагая правую систему координат с y = вверх/вниз: x справа, y вверх, z указывает на вас с экрана) (таким образом вы можете почувствовать масштаб мира и ориентацию вашей камеры матрица дает вам)
  • геометрию «за» на камерах (улов нажатий, чтобы переместить камеру назад и вперед, и двигаться вокруг немного, и посмотреть, если вы можете найти геометрию)
  • геометрия масштаб слишком большой/слишком малы (вылов нажатий клавиша для настройки глобального масштаба с использованием glScalef сразу после настройки камеры)
  • геометрии за пределами отсекающей плоскости (отрегулируйте плоскость отсечения)

Также: это выглядит немного подозрительным: this->modelViewMatrix[i] = cameraMatrix[i]; Вы пытались сначала инвертировать камеру?

+0

Нет, думаю, я понял, просто я полагал, что ось Z камеры отрицательная, но положительная ... – daleotar

 Смежные вопросы

  • Нет связанных вопросов^_^