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

由于项目需要需要结合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)实现增强现实(一)_第1张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第2张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第3张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第4张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第5张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第6张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第7张图片

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第8张图片


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



             基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第9张图片


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



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

基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(一)_第10张图片


附代码:

Demo.h

#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

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


你可能感兴趣的:(AR)