《OpenCV 4计算机视觉项目实战 》 —3.5 OpenGL支持
3.5 OpenGL支持
OpenCV包括对OpenGL的支持。OpenGL是一个作为标准而集成在几乎所有图形卡中的图形库。OpenGL能够把2D图像绘制成复杂的3D场景。由于在许多任务中表现3D空间的重要性,OpenCV包括了对OpenGL的支持。要在OpenGL中允许支持窗口,必须在调用namedWindow创建窗口时设置WINDOW_OPENGL标志。
下面的代码创建一个支持OpenGL的窗口,并绘制一个旋转平面,我们将在其中显示网络摄像头框架:
我们一起来理解这段代码!
第一个任务是创建所需的全局变量,用来存储捕获的视频帧并保存帧,然后控制动画角度平面和OpenGL纹理:
在主函数中,必须打开摄像机以检索拍摄的帧:
如果摄相机正确打开,则使用WINDOW_OPENGL标志创建支持OpenGL的窗口:
在这个例子中,我们想在平面中绘制来自网络摄像头的图像,因此,需要启用OpenGL纹理:
现在,我们已准备好在窗口中用OpenGL进行绘制,但是需要像典型的OpenGL应用程序一样设置绘制OpenGL回调。OpenCV提供了带有两个参数的setOpenGLDrawCallback函数,其参数是窗口名称和回调函数:
在定义OpenCV窗口和回调函数之后,需要创建一个循环来加载纹理,并更新调用OpenGL绘图回调的窗口内容,最后更新角度位置。要更新窗口内容,我们用OpenCV函数更新窗口,并用窗口名称作为参数:
当用户按下Q键时进入循环。在编译示例应用程序之前,我们需要定义loadTexture函数和on_opengl回调绘制函数。loadTexture函数将Mat帧转换为OpenGL纹理图像,这样就可以在每个回调绘图中加载和使用。在将图像作为纹理加载之前,必须确保在帧矩阵中有数据,即检查数据变量对象是否为空:
如果帧矩阵中有数据,那么可以创建OpenGL纹理绑定,并将OpenGL纹理参数设置为线性插值:
现在,必须定义像素如何存储在矩阵中,以及如何使用OpenGL glTexImage2D函数生成像素。非常重要的是,要注意OpenGL默认使用RGB格式,而OpenCV默认使用BGR格式,因此必须在此函数中设置正确的格式:
现在,当我们在主循环中调用updateWindow时,只需在每个回调上完成平面绘制。我们使用常见的OpenGL函数,然后加载标识OpenGL矩阵以重置之前的所有更改:
我们还必须加载帧纹理:
在绘制平面之前,将所有变换应用到场景中。在这个例子中,我们将在1,1,1轴上旋转平面:
现在,场景已被正确设置,可以绘制平面了,我们将绘制四边形面(具有四个顶点的面),并用glBegin(GL_QUADS)来实现:
接下来,我们将绘制一个以0,0位置为中心的平面,其大小为2个单位。然后用glTextCoord2D和glVertex2D函数定义要使用的纹理坐标和顶点位置:
这个OpenGL代码已经过时,但它可以用来更好地理解OpenCV与OpenGL的集成,而无须复杂的OpenGL代码。想要了解现代OpenGL,可以阅读Packt Publishing出版的Introductionto Modern OpenGL。
我们可以在图3-10中看到结果。
图 3-10
- 点赞
- 收藏
- 关注作者
评论(0)