通常的增强现实应用需要支持OpenGL的OpenCV来对真实场景进行渲染。从2.4.2版本开始,OpenCV在可视化窗口中支持OpenGL。这意味着在OpenCV中可轻松渲染任何3D内容。

若要在OpenCV中开始一个OpenGL窗口,需要做的第一件事是生成支持OpenGL的OpenCV。

在cmake的时候,应该设置标志:

cmake -D ENABLE_OPENGL=YES

如果现在有一个支持OpenGL的OpenCV库,可用其创建第一个OpenGL窗口。OpenGL窗口的初始化由创建一个命名的窗口开始,这需要设置一个OpenGL标志:

string openGLWindowName = "OpenGL Test";
cv::namedWindow(openGLWindowName, WINDOW_OPENGL);
openGLWindowName是一个字符串变量,保存着窗口的名称。
然后设置窗口大小
resizeWindow(openGLWindowName, , );

接下来需对此窗口设置上下文:

setOpenGlContext(openGLWindowName);

现在窗口就可以使用了。为了在窗口上画一些东西,应用以下方法注册一个回调函数:

setOpenGlDrawCallback(openGLWindowName, on_opengl, NULL);

该回调函数将被称为回调窗口。第一个参数为窗口名,第二个参数为回调函数,第三个可选参数将被传递给回调函数。

on_opengl是一个绘图函数,例如:

void on_opengl(void* param)
{
glLoadIdentity();
glTranslated(0.0, 0.0, -1.0);
glRotatef( , , , );
glRotatef( , , , );
glRotatef( , , , );
static const int coords[][][] = {
{ { +, -, - }, { -, -, - }, { -, +, - }, { +, +, - } },
{ { +, +, - }, { -, +, - }, { -, +, + }, { +, +, + } },
{ { +, -, + }, { +, -, - }, { +, +, - }, { +, +, + } },
{ { -, -, - }, { -, -, + }, { -, +, + }, { -, +, - } },
{ { +, -, + }, { -, -, + }, { -, -, - }, { +, -, - } },
{ { -, -, + }, { +, -, + }, { +, +, + }, { -, +, + } }
};
for (int i = ; i < ; ++i) {
glColor3ub( i*, +i*, i* );
glBegin(GL_QUADS);
for (int j = ; j < ; ++j) {
glVertex3d(0.2 * coords[i][j][], 0.2 * coords[i][j][], 0.2 * coords[i][j][]);
}
glEnd();
}
}

这个函数可以绘制一个长方体,程序执行效果如下所示:

同样的,我们可以写其他的绘制函数

void onDraw(void* param)
{
// Draw something using OpenGL here
glClearColor(0.0f, 0.0f, 1.0f, 1.0f); // background
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f); // draw rect
glFlush();
}

此函数的作用是在蓝色背景下绘制一个红色方块,程序运行效果如下:

完整代码下载地址:https://download.csdn.net/download/buaa_zn/10476956

												

opengl学习笔记(二):使用OpenCV来创建OpenGL窗口的更多相关文章

  1. OpenCV学习笔记二:OpenCV模块一览

    注:本系列博客基于OpenCV 2.9.0.0 一,一览图: 二,模块: /* 基础库 */ 1,opencv_core(链接) ,opencv最基础的库.包含exception,point,rect ...

  2. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  3. OpenGL学习笔记3——缓冲区对象

    在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...

  4. OpenGL学习笔记:拾取与选择

    转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...

  5. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  10. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

随机推荐

  1. Sql Server 跨服务器连接

    用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服 ...

  2. Spring父容器与子容器

    在使用spring+springMVC的web工程中,我们一般会在web.xml中做如下配置: <context-param> <param-name>contextConfi ...

  3. SQLServer------基本操作

    代码: --新增字段 ) --编辑字段名称 --注意: 更改对象名的任一部分都可能会破坏脚本和存储过程 EXEC sp_rename 'FTTxUser.[Modifiersss]','Creator ...

  4. Java查看内部类信息

    Java中支持在类的内部定义类,这种类成为内部类.内部类有些像Java中的方法,可以使用访问权限限定符修饰,可以使用static修饰等.编写程序,利用Java的反射机制来查看内部类的信息. 思路分析: ...

  5. 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期

    7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...

  6. Outlook 2007 实现自动添加密送的方法

    1)在Outlook里面键入Alt+F11打开VBA编辑器:     2)激活左边的工程面板,展开并双击上面的“Project (VbaProject.OTM)/Microsoft Office Ou ...

  7. solr java demo 基础入门

      <!--solr的maven依赖--> <dependencies> <dependency> <groupId>org.apache.solr&l ...

  8. 处理i18n国际电话区号的代码实践

    本文转载至 http://adad184.com/2015/08/18/practice-in-i18n-dialling-code/ 前言 上周在忙产品的国际化(i18n)的问题 其中一个很重要的地 ...

  9. iOS - 直播总结(理论到实践)

    一.直播原理及流程 1.一个完整直播app原理 直播原理:把主播录制的视频,推送到服务器,在由服务器分发给观众观看. 直播环节:推流端(采集.美颜处理.编码.推流).服务端处理(转码.录制.截图.鉴黄 ...

  10. Clock skewdetected. Your build may be incomplete.

    解决方法: find . -type f | xargs -n touch make clean make