在opengl纹理中加载带有alpha通道的opencv :: mat图像

时间:2013-10-06 17:45:46

标签: opengl opencv alpha

我想将带有alpha通道的opencv :: mat图像加载到OpenGL纹理。

在以下帖子的帮助下,我可以设法将RGB图像从opencv :: mat加载到OpenGL纹理中。

https://stackoverflow.com/questions/16809833/opencv-image-loading-for-opengl-texture

https://stackoverflow.com/questions/9097756/converting-data-from-glreadpixels-to-opencvmat/9098883#9098883

但是当我尝试使用Alpha通道加载图像时,会出现问题。

以下是调用glTexImage2D函数的方法。

glTexImage2D(GL_TEXTURE_2D,     // Type of texture
                        0,                 // Pyramid level (for mip-mapping) - 
                        GL_RGBA,            // Internal colour format to convert to
                        image.cols,          // Image width  
                        image.rows,          // Image height 
                        0,                 // Border width in pixels (can either be 1 or 0)
                        GL_BGRA_INTEGER, // Input image format 
                        GL_UNSIGNED_BYTE,  // Image data type
                        image.ptr());        // The actual image data itself

此外,在渲染之前,我使用glEnable(GL_BLEND);

启用混合

如果我指定输出图像格式和内部颜色格式都是GL_RGBA / GL_BGRA,我会得到一个分段错误,但如果我将其中任何一个或两者都设置为GL_RGBA_INTEGER,至少我可以看到窗口,但只是空白。

我可以更改透明度,因此窗口或多或少透明,但其中没有图像。在cv :: mat中有一个图像,因为我可以使用cv :: imshow看到它,但不知何故,将它传递给OpenGL纹理似乎有问题。

任何人都可以提出一些我可能会遗漏的事情。提前谢谢。

P.S:我是OpenGL的新手,如果解释得最细微,我真的很感激..:P

1 个答案:

答案 0 :(得分:0)

我在计算机上工作,能够加载并显示png纹理。

问题中的代码改编自以下链接中的最后一个答案。

OpenCV image loading for OpenGL Texture

我发布了我的工作代码(也改编自上述链接中的代码)

GLuint Texture;

cv::Mat image = cv::imread("textures/trashbin.png", -1);

cv::flip(image, image, 0);
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// Set texture clamping method
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);


glTexImage2D(GL_TEXTURE_2D,     // Type of texture
    0,                 // Pyramid level (for mip-mapping) - 0 is the top level
    GL_RGBA,            // Internal colour format to convert to
    image.cols,          // Image width  i.e. 640 for Kinect in standard mode
    image.rows,          // Image height i.e. 480 for Kinect in standard mode
    0,                 // Border width in pixels (can either be 1 or 0)
    GL_BGRA, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.)
    GL_UNSIGNED_BYTE,  // Image data type
    image.ptr());

注意3点:

  • 第二行的imread调用中的-1。它告诉OpenCV加载alpha通道。我相信这就是提问者遇到问题的地方。
  • 最后一次函数调用中的GL_RGBA和GL_BGRA。
  • cv :: flip(image,image,0);对我来说不是必需的,我实际上已经在我的项目中注释了它。原因可能是我首先打开了UV坐标。