这个问题有点复杂,但是我想将GLSL用于预处理,然后将OpenCV用于后处理。基本上,我将纹理用作GLSL着色器的输入,而无论片段着色器的输出是什么,我都必须将其用作OpenCV的输入。gl_FragColor
之后,我使用glReadPixels
读取FBO,然后在OpenCV中将该数据设置为IplImage
。
GLubyte *pixels = new GLubyte[640*480*4];
glReadPixels(0, 0, 640,480, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
IplImage *img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,4);
cvSetData(img,pixels,640*4);
它工作完美,但是主要的问题是它确实很慢。
还有其他方法可以快速或直接将片段着色器(
gl_FragColor
)的输出设置为IplImage
吗?我使用的是OpenGL ES 2.0,因此存在一些限制。 最佳答案
我以前没有使用过GLSL,因此可能有一个您不能执行此操作的原因。但是,您是否考虑过删除这样的内存副本之一:
Mat_<Vec4b> glslImage(640, 480);
glReadPixels(0, 0, 640, 480, GL_RGBA, GL_UNSIGNED_BYTE, (GLubyte*)glslImage.data);
您是否有理由使用临时
pixels
缓冲区?