基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)
来源:互联网 发布:iptv机顶盒安装软件 编辑:程序博客网 时间:2024/06/01 13:20
由于项目需要需要结合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 <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界面中,通过控件对立方体的状态进行控制。
- 基于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)实现增强现实(五)
- 【QT】VS2015+QT5.6.0+opencv3.1.0 增强现实(一)
- QT5 OPenGL(一)
- OpenGL与OpenCV实现增强现实
- OpenGL与OpenCV实现增强现实
- OpenGL与OpenCV实现增强现实
- OpenGL与OpenCV实现增强现实
- OpenGL与OpenCV实现增强现实
- OpenGL与OpenCV实现增强现实
- 【Vuforia】基于Vuforia增强现实开发(一)之识别图像播放声音
- 基于移动终端的增强现实技术方案(已实现)
- 基于AR(增强现实)的运动跟踪算法
- 探讨增强现实(AR)基于模型的追踪技术
- Xcode4.6 开发 metaio 增强现实 项目(二)--增强现实的实现
- JDK1.8 十大新特性详解
- 在Activity中,layout布局中控件的各种实例化
- 数据库与表的操作之创建表(CREATE TABLE)
- 数值方法:多项式插值
- odata初探01
- 基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)
- 第五周【项目二-建立链栈算法库】
- uva11134贪心加优先队列
- Codeforces 706C Hard problem
- 27 自定义View 和案例
- Android视频学习(四):网络编程2
- 洛谷 1373
- 中文分词的python实现-基于FMM算法
- 数据库与表的操作之编辑表结构(ALTER TABLE)