由于项目需要需要结合Qt实现界面开发并需要实现增强现实效果,因此决定采用Qt所集成的openGL与Opencv实现增强现实。该博客对过程做了较为详尽的讲解:http://blog.csdn.net/aichipmunk/article/details/41489825 现将自己在此学习过程中的问题与开发过程作相应的总结,并且希望能够帮到需要的人。整个系统需要OPENCV和QT两个部分,因此先从如何使用QT部分的OPENGL模块说起。
openGL渲染3D立方体
首先基于VS2013配置开发环境,此处用到VS2013中QT5.6.0的配置。首先下载并安装qt部分的两个文件,一个qt文件一个qt与vs的插件。插件安装后就可以在VS界面中找到QT5的选项了。
能够运行说明开发环境配置成功了可以进行下一步开发了。
#include
void initializeGL();voidinitWidget();void paintGL();OpenGL中常用的几个函数。具体的代码及函数与普通OpengGL中的使用方法基本一样。以下代码实现了立方体的显示并在立方体表面贴上选定的图片,通过QTimer定义一个定时器定时刷新实现立方体的旋转。
#ifndef DEMO_H
#define DEMO_H
#include
#include "ui_demo.h"
#include
#include
class demo : public QGLWidget
{
Q_OBJECT
public:
demo(QWidget *parent = 0);
~demo();
QTimer clk;
float m_x, m_y, m_z;
GLuint textur;
protected:
void initializeGL();
void initWidget();
void paintGL();
void resizeGL(int width, int height);
void loadGLTextures();
private slots:
void updateWindow();
private:
Ui::demoClass ui;
};
#endif // DEMO_H
#include "demo.h"
demo::demo(QWidget *parent)
: QGLWidget(parent)
{
ui.setupUi(this);
initWidget();
initializeGL();
clk.start(30);
QObject::connect(&clk, SIGNAL(timeout()), this, SLOT(updateWindow()));
}
demo::~demo()
{
}
void demo::initializeGL()
{
loadGLTextures();
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void demo::initWidget()
{
setGeometry(0,200, 640, 480);
setWindowTitle(tr("opengl demo"));
}
void demo::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef( 0.0, 0.0, -6.0);//沿坐标轴移动
glRotatef(m_x, 1.0, 0.0, 0.0);//旋转
glRotatef(m_y, 0.0, 1.0, 0.0);
glRotatef(m_z, 0.0, 0.0, 1.0);
//绑定纹理特性
glBindTexture(GL_TEXTURE_2D, textur);
glBegin(GL_QUADS);
glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0);
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, -1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, -1.0);
glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, -1.0);
glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);
glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(1.0, -1.0, -1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(1.0, 1.0, -1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 1.0);
glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0);
glEnd();
}
void demo::resizeGL(int width, int height)
{
if (0 == height) {
height = 1;
}
glViewport(0, 0, (GLint)width, (GLint)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);
GLdouble aspectRatio = (GLfloat)width / (GLfloat)height;
GLdouble zNear = 0.1;
GLdouble zFar = 100.0;
GLdouble rFov = 50.0 * 3.14159265 / 180.0;
glFrustum(-zNear * tan(rFov / 2.0) * aspectRatio,
zNear * tan(rFov / 2.0) * aspectRatio,
-zNear * tan(rFov / 2.0),
zNear * tan(rFov / 2.0),
zNear, zFar);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void demo::updateWindow()
{
m_x += 1;
m_y += 2;
m_z += 3;
updateGL();//刷新界面
}
void demo::loadGLTextures()
{
QImage tex;
QImage buf;
if (!buf.load("E:\\qt\\QtOpenGL\\demo\\demo\\Resources\\butterfly.jpg"))
{
qWarning("load image failed!");
QImage dummy(128, 128, QImage::Format_RGB32);
dummy.fill(Qt::red);
buf = dummy;
}
tex = QGLWidget::convertToGLFormat(buf);
glGenTextures(1, &textur);
glBindTexture(GL_TEXTURE_2D, textur);
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}