《OpenCV 4计算机视觉项目实战 》 —3.5 OpenGL支持

举报
华章计算机 发表于 2019/11/10 12:29:46 2019/11/10
【摘要】 本节书摘来自华章计算机《OpenCV 4计算机视觉项目实战》 一书中第三章,第3.5节,作者[西班牙]大卫·米兰·埃斯克里瓦(David Millán Escrivá)[西班牙]维尼休斯·G.门东萨(Vinícius G. Mendon)。

3.5 OpenGL支持

OpenCV包括对OpenGL的支持。OpenGL是一个作为标准而集成在几乎所有图形卡中的图形库。OpenGL能够把2D图像绘制成复杂的3D场景。由于在许多任务中表现3D空间的重要性,OpenCV包括了对OpenGL的支持。要在OpenGL中允许支持窗口,必须在调用namedWindow创建窗口时设置WINDOW_OPENGL标志。

下面的代码创建一个支持OpenGL的窗口,并绘制一个旋转平面,我们将在其中显示网络摄像头框架:

 image.png

image.png

image.png

我们一起来理解这段代码!

第一个任务是创建所需的全局变量,用来存储捕获的视频帧并保存帧,然后控制动画角度平面和OpenGL纹理:

 image.png

在主函数中,必须打开摄像机以检索拍摄的帧:

 image.png

如果摄相机正确打开,则使用WINDOW_OPENGL标志创建支持OpenGL的窗口:

 image.png

在这个例子中,我们想在平面中绘制来自网络摄像头的图像,因此,需要启用OpenGL纹理:

 image.png

现在,我们已准备好在窗口中用OpenGL进行绘制,但是需要像典型的OpenGL应用程序一样设置绘制OpenGL回调。OpenCV提供了带有两个参数的setOpenGLDrawCallback函数,其参数是窗口名称和回调函数:

 image.png

在定义OpenCV窗口和回调函数之后,需要创建一个循环来加载纹理,并更新调用OpenGL绘图回调的窗口内容,最后更新角度位置。要更新窗口内容,我们用OpenCV函数更新窗口,并用窗口名称作为参数:

 image.png

当用户按下Q键时进入循环。在编译示例应用程序之前,我们需要定义loadTexture函数和on_opengl回调绘制函数。loadTexture函数将Mat帧转换为OpenGL纹理图像,这样就可以在每个回调绘图中加载和使用。在将图像作为纹理加载之前,必须确保在帧矩阵中有数据,即检查数据变量对象是否为空:

 image.png

如果帧矩阵中有数据,那么可以创建OpenGL纹理绑定,并将OpenGL纹理参数设置为线性插值:

 image.png

现在,必须定义像素如何存储在矩阵中,以及如何使用OpenGL glTexImage2D函数生成像素。非常重要的是,要注意OpenGL默认使用RGB格式,而OpenCV默认使用BGR格式,因此必须在此函数中设置正确的格式:

 image.png

现在,当我们在主循环中调用updateWindow时,只需在每个回调上完成平面绘制。我们使用常见的OpenGL函数,然后加载标识OpenGL矩阵以重置之前的所有更改:

 image.png

我们还必须加载帧纹理:

 image.png

在绘制平面之前,将所有变换应用到场景中。在这个例子中,我们将在1,1,1轴上旋转平面:

 image.png

现在,场景已被正确设置,可以绘制平面了,我们将绘制四边形面(具有四个顶点的面),并用glBegin(GL_QUADS)来实现:

 image.png

接下来,我们将绘制一个以0,0位置为中心的平面,其大小为2个单位。然后用glTextCoord2D和glVertex2D函数定义要使用的纹理坐标和顶点位置:

 image.png

 

这个OpenGL代码已经过时,但它可以用来更好地理解OpenCV与OpenGL的集成,而无须复杂的OpenGL代码。想要了解现代OpenGL,可以阅读Packt Publishing出版的Introductionto Modern OpenGL。

我们可以在图3-10中看到结果。

 image.png

图 3-10


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。