opengl学习笔记(二):使用OpenCV来创建OpenGL窗口
通常的增强现实应用需要支持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窗口的更多相关文章
- OpenCV学习笔记二:OpenCV模块一览
注:本系列博客基于OpenCV 2.9.0.0 一,一览图: 二,模块: /* 基础库 */ 1,opencv_core(链接) ,opencv最基础的库.包含exception,point,rect ...
- InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- OpenGL学习笔记:拾取与选择
转自:OpenGL学习笔记:拾取与选择 在开发OpenGL程序时,一个重要的问题就是互动,假设一个场景里面有很多元素,当用鼠标点击不同元素时,期待作出不同的反应,那么在OpenGL里面,是怎么知道我当 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- Android学习笔记——Activity的启动和创建
http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
随机推荐
- MAP参数估计
(学习这部分内容大约需要40分钟) 摘要 在贝叶斯参数估计中, 除了先验是特别选定的情况下, 通常要积分掉所有模型参数是没有解析解的. 在这种情况下, 最大后验(maximum a posterior ...
- Laravel5.1 填充数据库
当我们创建好表结构后 通常都要生成一些测试用的数据来测试,应对这个场景呢 Laravel提供了相当好的服务 --seed Laravel的seeder都会放在:/database/seeders 目录 ...
- sql 理解
select b.*, b.model_ent_name+cast(m.year as varchar)as modelname, m.index_value as val into #tb fro ...
- Java通过复选框控件数组实现添加多个复选框控件
编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...
- Ubuntu 16.04服务器 配置
1. 修改用户名称:切换到root打开如下两个配置文件 sudo vim /etc/passwd 把我想改的"xxx"这个用户名改为"way"了,保存并退出 s ...
- 第四章 TCP粘包/拆包问题的解决之道---4.1---
4.1 TCP粘包/拆包 TCP是一个“流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可 ...
- flexbox父盒子flex-wrap属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 使用gradle 编译生成 apk出现的问题
首先出现的问题是: Failed to read key from keystore 是我的Key Alias 填写错了, 还有一种可能就是真的把key放错位置了
- >>和<<<区别
1.>>表示右移(有符号右移),如:15>>2的结果是3,-31>>3的结果是-4,左边以该数的符号位补充,移出的部分将被抛弃. 转为二进制的形式可能更好理解(省略 ...
- 中文解码Unicode
package com.j1.search.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder ...