使用glGetTexImage()获取OpenCV材质

Using glGetTexImage() to aquire OpenCV Mat

本文关键字:OpenCV 材质 获取 glGetTexImage 使用      更新时间:2023-10-16

我正试图使用OpenGL的glGetTexImage()的输出制作一个OpenCV Mat()。我试图从中获取信息的纹理是使用调用生成的;

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8UI, iWidth, iHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pImageData);

所以我试着用;

    unsigned char* texture_bytes = (unsigned char*)malloc(sizeof(unsigned char)*texture_width*texture_height * 3);
    glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, texture_bytes);
    Matrix = Mat(texture_height, texture_width, CV_8UC3, texture_bytes);

我想知道的是,如果有人知道我应该将glGetTexImage()的格式和类型设置为什么,这样才能正常工作。另外,我应该将Mat()的类型设置为什么?

可以假设上下文设置正确,并且输入的纹理是正确的。我已经通过使用OpenGL在屏幕上显示纹理来验证这一点。提前感谢!

我最近遇到了从OpenGL到OpenCV获取数据的问题。不过我没有使用glGetTexImage

我所做的是在帧缓冲区中进行屏幕外渲染,纹理初始化如下:

GLuint texture;
if (glIsTexture(texture)) {
    glDeleteTextures(1, &texture);
}
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
glBindTexture(GL_TEXTURE_2D, 0);

然后在我的draw调用之后,我使用glReadPixels:获取数据

glPixelStorei(GL_PACK_ALIGNMENT, 1);
glReadBuffer(GL_COLOR_ATTACHMENT0);
cv::Mat texture = cv::Mat::zeros(height, width, CV_32FC3);
glReadPixels(0, 0, width, height, GL_BGR, GL_FLOAT, texture.data);

希望它能帮助你。

用于glGetTexImage()调用的格式参数与纹理的内部格式不匹配:

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8UI, iWidth, iHeight, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, pImageData);
...
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR, GL_UNSIGNED_BYTE, texture_bytes);

对于本例中的整数纹理,需要对适用于整数纹理的glGetTexImage()使用format参数。在您的示例中,这将是:

glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR_INTEGER, GL_UNSIGNED_BYTE, texture_bytes);

如果您在获得所需OpenGL行为时遇到任何问题,那么调用glGetError()总是一个好主意。在这种情况下,根据规范中的错误条件,您可能会得到GL_INVALID_OPERATION错误:

format是表8.3中的整数格式之一,并且纹理图像的内部格式不是整数,或者format不是表8.3中整数格式之一并且内部格式是整数。