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

来源:互联网 发布:iptv机顶盒安装软件 编辑:程序博客网 时间:2024/06/01 13:20

由于项目需要需要结合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的选项了。










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



             


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



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



附代码:

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_OBJECTpublic: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界面中,通过控件对立方体的状态进行控制。


2 0