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

将OpenGL窗口背景替换为摄像头采集的场景

增强现实是在真实场景的基础上,通过算法计算出制定的位置并在上面渲染3D立体图像。现在能够渲染立体图像了,下一步就是要把摄像头采集的数据读进来放到窗口中。因为之后还涉及标记寻找等工作需要进行图像处理因此现在要加入OPENCV模块了,由于之前已经配置好了opencv的属性文件现在直接加载就行了,不会的可以搜下相关博客。之后在opengl类中添加头文件。并实例化摄像头工具VideoCapture camera;之后就可以对摄像头数据进行采集了。

#include
using namespace cv;

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

但是opencv显示图像的时候有自己的窗口如何将摄像头采集的数据放到opengl渲染的窗口中呢?首先需要将Mat类型的数据转换成QImage,值得注意的是opencv中图像为BGR编码需要转换成RGB不然会有色差。代码如下:

//获取摄像头图像并进行格式转换
camera >> frame; cvtColor(frame, frame, CV_BGR2RGB);
QImage buf, tex;
//将Mat类型转换成QImage
buf = QImage((const unsigned char*)frame.data, frame.cols, frame.rows, frame.cols * frame.channels(), QImage::Format_RGB888);
tex = QGLWidget::convertToGLFormat(buf);
glGenTextures(1, &texturFrame);//对应图片的纹理定义
glBindTexture(GL_TEXTURE_2D, texturFrame);//进行纹理绑定
//纹理创建
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窗口上新建一个四边形并填充至界面大小,将摄像头采集到的纹理数据绑定到四边形上即可实现摄像头采集的数据放到opengl窗口。纹理的绑定在图像采集结束后就进行绑定,在新建用来显示摄像头图像的四边形的时候需要将其向Z轴负方向移动足够的距离防止在之后就行3D物体渲染的时候产生遮挡。代码如下:

glLoadIdentity();//重置坐标系至屏幕中央
glTranslatef(3.2f, -0.6f, -100);//讲显示背景沿Z轴向后移动足够距离,防止遮挡渲染物体
glScalef(8.35f,8.35f,1.0f);//平移 放大 实现窗口填充-
//绑定纹理
glBindTexture(GL_TEXTURE_2D, texturFrame);
glBegin(GL_QUADS);//绘制图形接口,与glEnd()对应

glTexCoord2f(0.0, 0.0); glVertex3f(-4, -3, 0);//
glTexCoord2f(1.0, 0.0); glVertex3f(4, -3, 0);
glTexCoord2f(1.0, 1.0); glVertex3f(4, 3, 0);
glTexCoord2f(0.0, 1.0); glVertex3f(-4, 3, 0);
glDeleteTextures(1, &texturFrame);//及时释放不然会占用很多内存空间使电脑卡死
glEnd();

之后即实现了在摄像头采集的图像上面实现3D立方体的渲染,通过调节x,y,z可以调节立方体的转动,很自然的想到是否可以通过某种方法实现3D立方体的自动角度及位置调节实现自动跟踪调整?所以这就是基于标记的增强现实系统需要解决的问题,这部分将在下一部分总结。

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






你可能感兴趣的:(AR)