1

我想将带有 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 纹理似乎存在问题。

任何人都可以建议我可能会丢失的东西。提前致谢。

PS:我是 OpenGL 的新手,如果能以最小的细节解释,我将不胜感激.. :P

4

1 回答 1

0

我让它在我的电脑上工作,能够加载和显示 png 纹理。

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

OpenGL 纹理的 OpenCV 图像加载

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

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。
  • 简历::翻转(图像,图像,0);对我来说不是必需的,实际上我已经在我的项目中将其注释掉了。原因可能是我首先翻转了 UV 坐标。
于 2017-05-10T09:32:07.880 回答