将灰度 OpenCV 图像传递给 OpenGL 纹理
Passing grayscale OpenCV image to an OpenGL texture
我想在 GLSL 着色器中使用在 OpenCV 中生成的灰度图像。
根据 OpenCV image loading for OpenGL Texture 上的问题,我设法想出了将 RGB 图像传递给着色器的代码:
cv::Mat image;
// ...acquire and process image somehow...
//create and bind a GL texture
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, // Type of texture
0, // Pyramid level (for mip-mapping) - 0 is the top level
GL_RGB, // Internal colour format to convert to
image.cols, image.rows, // texture size
0, // Border width in pixels (can either be 1 or 0)
GL_BGR, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.)
GL_UNSIGNED_BYTE, // Image data type
image.ptr()); // The actual image data itself
glGenerateMipmap(GL_TEXTURE_2D);
然后在片段着色器中我只使用这个纹理:
#version 330
in vec2 tCoord;
uniform sampler2D texture;
out vec4 color;
void main() {
color = texture2D(texture, tCoord);
}
一切都很好。
但现在我想对该图像进行一些灰度处理,从 cv::cvtColor(image, image, CV_BGR2GRAY);
开始,对其进行更多 OpenCV 处理,然后将灰度传递给着色器。
我想我应该使用 GL_LUMINOSITY
作为要转换的颜色格式,也可能作为输入图像格式 - 但我得到的只是黑屏。
有人可以帮我吗?
输入格式
我会使用 GL_RED,因为 GL_LUMINANCE 格式已经 deprecated
内部格式
取决于您想在着色器中执行的操作,尽管您应该始终指定 sized 内部格式,例如GL_RGBA8 每通道 8 位。虽然,对于 GL_RGBA8,绿色、蓝色和 alpha 通道无论如何都将为零,因为您的输入数据只有一个通道,因此您可能应该改用 GL_R8 格式。另外,您可以使用 texture swizzling:
GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
当您访问着色器中的纹理时,这将导致所有通道都'mirror'红色通道。
我想在 GLSL 着色器中使用在 OpenCV 中生成的灰度图像。
根据 OpenCV image loading for OpenGL Texture 上的问题,我设法想出了将 RGB 图像传递给着色器的代码:
cv::Mat image;
// ...acquire and process image somehow...
//create and bind a GL texture
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, // Type of texture
0, // Pyramid level (for mip-mapping) - 0 is the top level
GL_RGB, // Internal colour format to convert to
image.cols, image.rows, // texture size
0, // Border width in pixels (can either be 1 or 0)
GL_BGR, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.)
GL_UNSIGNED_BYTE, // Image data type
image.ptr()); // The actual image data itself
glGenerateMipmap(GL_TEXTURE_2D);
然后在片段着色器中我只使用这个纹理:
#version 330
in vec2 tCoord;
uniform sampler2D texture;
out vec4 color;
void main() {
color = texture2D(texture, tCoord);
}
一切都很好。
但现在我想对该图像进行一些灰度处理,从 cv::cvtColor(image, image, CV_BGR2GRAY);
开始,对其进行更多 OpenCV 处理,然后将灰度传递给着色器。
我想我应该使用 GL_LUMINOSITY
作为要转换的颜色格式,也可能作为输入图像格式 - 但我得到的只是黑屏。
有人可以帮我吗?
输入格式
我会使用 GL_RED,因为 GL_LUMINANCE 格式已经 deprecated
内部格式
取决于您想在着色器中执行的操作,尽管您应该始终指定 sized 内部格式,例如GL_RGBA8 每通道 8 位。虽然,对于 GL_RGBA8,绿色、蓝色和 alpha 通道无论如何都将为零,因为您的输入数据只有一个通道,因此您可能应该改用 GL_R8 格式。另外,您可以使用 texture swizzling:
GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_RED};
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
当您访问着色器中的纹理时,这将导致所有通道都'mirror'红色通道。