我想将带有alpha通道的opencv :: mat图像加载到OpenGL纹理。
在以下帖子的帮助下,我可以设法将RGB图像从opencv :: mat加载到OpenGL纹理中。
https://stackoverflow.com/questions/16809833/opencv-image-loading-for-opengl-texture
但是当我尝试使用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答案 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点: