我尝试使用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在屏幕上显示纹理来验证这一点。提前致谢!
答案 0 :(得分:0)
我最近遇到过从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);
然后在我的绘制调用之后,我使用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);
希望它对你有所帮助。
答案 1 :(得分:0)
用于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()
,它适用于整数纹理。在您的示例中,那将是:
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGR_INTEGER, GL_UNSIGNED_BYTE, texture_bytes);
如果您在获得所需的OpenGL行为时遇到任何问题,最好调用glGetError()
。在这种情况下,根据规范中的错误条件,您会收到GL_INVALID_OPERATION
错误:
格式是表8.3中的整数格式之一,纹理图像的内部格式不是整数,或格式不是表8.3中的整数格式之一,内部格式是整数。