Я разрабатываю собственное приложение дополненной реальности. Я уже обнаружил 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 камеры без успех ... Я буду очень признателен, если у кого-то есть рабочий код ... спасибо !!!
Вы не должны использовать glDrawPixels, как обычно, это неловко медленно. Вместо этого вы должны визуализировать текстурированный объект, при этом ваше изображение будет текстурой. См. Http://www.opengl.org/resources/faq/technical/performance.htm. Обязательно отключите буфер глубины (или очистите его) при рисовании фона. – ypnos
Да, я пробовал, что на самом деле у меня получаются хорошие результаты с текстурой ... однако дело в том, что у меня есть матрица вращения (что хорошо) и вектор трансляции (который немасштабирован), потому что openGL похоже, принимает только значения GL_MODELVIEW для положения камеры между -1 и 1 ... Я имею в виду, что openGL принимает для оси X -1 как левую сторону и +1 для правой стороны ... для оси Y берет - 1 для нижнего и +1 для верхнего ... Итак, дело в том, что кто-нибудь знает, как масштабировать, потому что я не знаю – daleotar
'glMatrixMode (GL_TEXTURE);' может быть одним из способов, или как вы заявляете, что ваши координаты текстуры могут быть другой. То есть, трансформируйте свои координаты вручную, затем нажмите преобразованную координату. – EnabrenTane