基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

时间:2022-06-04 23:15:25

由于项目需要需要结合Qt实现界面开发并需要实现增强现实效果,因此决定采用Qt所集成的openGLOpencv实现增强现实。该博客对过程做了较为详尽的讲解:http://blog.csdn.net/aichipmunk/article/details/41489825 现将自己在此学习过程中的问题与开发过程作相应的总结,并且希望能够帮到需要的人。整个系统需要OPENCVQT两个部分,因此先从如何使用QT部分的OPENGL模块说起。


 openGL渲染3D立方体

首先基于VS2013配置开发环境,此处用到VS2013QT5.6.0的配置。首先下载并安装qt部分的两个文件,一个qt文件一个qtvs的插件。插件安装后就可以在VS界面中找到QT5的选项了。

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)


能够运行说明开发环境配置成功了可以进行下一步开发了。



             基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)


#include <QtOpenGL/QtOpenGL>openGL的头文件包含进来,并将demo改为QGLWidget继承,因为从QWidget继承后显示的是程序的主窗体,这点当时纠结了很久,改完之后可以看到成功创建了使用OPENGL渲染的窗口。和OpenGL有关的详细说明可以参考相关资料,接下来就可以在vs中结合QT做基于openGL的开发了。

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)


void initializeGL();voidinitWidget();void paintGL();OpenGL中常用的几个函数。具体的代码及函数与普通OpengGL中的使用方法基本一样。以下代码实现了立方体的显示并在立方体表面贴上选定的图片,通过QTimer定义一个定时器定时刷新实现立方体的旋转。

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)


附代码:

Demo.h

#ifndef DEMO_H
#define DEMO_H

#include <QtWidgets/QWidget>
#include "ui_demo.h"
#include <QtOpenGL/QtOpenGL>
#include <QTimer>
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

Demo.cpp


#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);
}

下一篇将介绍如何将openGL渲染的窗口放到UI界面中,通过控件对立方体的状态进行控制。