opencv图像转换为opengl的texture

 //opengl
#include <GL/glew.h>
#include <GL/freeglut.h>

GLuint left_Tex;
GLuint right_Tex;

// GLUT initialization
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH );

    // Configure Window Postion
    //glutInitWindowPosition(50, 25);

    // Configure Window Size
    glutInitWindowSize(10, 10);

    // Create Window
    glutCreateWindow("ZED OGL interop");

    // init GLEW Library
    glewInit();
    // Create an OpenGL texture and register the CUDA resource on this texture for left image (8UC4 -- RGBA)
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &left_Tex);
    glBindTexture(GL_TEXTURE_2D, left_Tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    //glTexCoord2f(0, 1.0);
    glBindTexture(GL_TEXTURE_2D, 0);//0 represents unbind status

以上是初始化和开辟内存的工作的,接下来就是使用的时候将数据导入到内存上。

            glBindTexture(GL_TEXTURE_2D, right_Tex);//选中要使用的内存号
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, right_extension.cols, right_extension.rows, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, right_extension.ptr());//GL_BGRA_EXT,right_extension is cv::Mat
            glBindTexture(GL_TEXTURE_2D, 0);//用完解绑

### 使用 OpenCVOpenGL 实现多张图像融合 #### 图像融合概述 图像融合是指将两张或多张不同来源的图像合成一张新图的技术。通过这种方式可以增强目标区域的信息量,提高视觉效果或突出特定特征。 #### 准备工作 为了使用OpenCVOpenGL来完成这项任务,需要先确保已经正确安装并配置好了这两个库[^1]。对于C++开发环境来说,还需要设置好编译器链接路径以便能够调用相应的API函数。 #### 数据结构转换 考虑到效率问题,在实际操作过程中通常会利用`cv::Mat`作为内部表示形式来进行各种运算处理;而在渲染阶段,则可能更倾向于采用纹理的形式传递给GPU端进行加速绘制。因此涉及到两者间的数据交换时就需要做适当格式上的调整: - **从OpenCVOpenGL**: 可以直接读取`cv::Mat`中的像素值创建对应的纹理对象; - **从OpenGL回到OpenCV**: 利用FBO(帧缓冲区对象)捕获屏幕内容再转存回矩阵中去[^3]。 #### 融合算法设计 一种常见的做法就是按照一定权重比例线性叠加各输入图片的颜色分量得到最终输出结果。具体公式如下所示: \[ R(x,y)=\alpha_1*I_1(x,y)+...+\alpha_n*I_n(x,y)\] 其中\(R\)代表融合后的图像,\(I_i\)为第i幅原始素材,而系数\(\alpha_i\)决定了各自贡献程度大小. 下面是具体的代码实现: ```cpp #include <opencv2/opencv.hpp> #define GL_GLEXT_PROTOTYPES #ifdef _WIN32 #include <GL/glut.h> // Windows下需包含此头文件 #else #include <GL/freeglut.h>// Linux/MacOSX环境下应选用这个版本 #endif // 将OpenCV Mat转化为OpenGL Texture ID GLuint matToTexture(const cv::Mat& img){ GLuint textureID; glGenTextures(1,&textureID); glBindTexture(GL_TEXTURE_2D,textureID); glTexImage2D( GL_TEXTURE_2D, 0,GL_RGB,img.cols,img.rows,0,GL_BGR,GL_UNSIGNED_BYTE,(void*)img.data ); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); return textureID; } int main(){ std::vector<cv::String> filenames={"image1.jpg","image2.png"}; std::vector<cv::Mat> images(filenames.size()); for(size_t i=0;i<filenames.size();++i) images[i]=cv::imread(filenames[i]); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA ); glutCreateWindow("Image Fusion"); glEnable(GL_TEXTURE_2D); float alpha[] = {0.7f , 0.3f}; // 权重参数设定 while(true){ glBegin(GL_QUADS); for(int j=0;j<(int)images.size();j++){ GLuint texId = matToTexture(images[j]); glColor4f(alpha[j],alpha[j],alpha[j],1.f); glBindTexture(GL_TEXTURE_2D,texId); glTexCoord2d(0.,0.); glVertex2d(-1,-1); ... glEnd(); glDeleteTextures(1,&texId); } glutSwapBuffers(); char key = (char)cvWaitKey(33); if(key==27)// ESC键退出循环 break; } return 0; } ``` 这段程序展示了如何加载多个静态图像资源并通过加权平均的方式将其混合在一起展示出来。需要注意的是这里简化了很多细节部分比如错误检查机制等,在真实应用场景里应当加以完善补充[^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值