我有一个OpenGL应用程序,它显示一个相机框架,上面有一些3d元素。 我想要做的是使用openGL来组合框架和元素,但然后使用OpenCv显示图像,而不是显示OpenGL窗口。这可能吗?
目前的代码是:
int main()
{
// Init GLUT window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
// Create GLUT window
glutInitWindowSize(wWnd, hWnd);
glutCreateWindow("Mapping");
// Initialize OpenGL
int res = initGL();
if (res != 0) {
std::cout << "Failed to initialize OpenGL" << std::endl;
return -1;
}
....
}
init
函数的位置:
int initGL() {
// Init glew after window has been created
glewInit();
glClearColor(0.0, 0.0, 0.0, 0.0);
// Create and Register OpenGL Texture for Image (RGBA -- 4channels)
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &imageTex);
glBindTexture(GL_TEXTURE_2D, imageTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wWnd, hWnd, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
cudaError_t err1 = cudaGraphicsGLRegisterImage(&cuda_gl_ressource, imageTex, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsWriteDiscard);
if (err1 != cudaError::cudaSuccess) return -1;
// Create GLSL Shaders for Mesh and Image
shader_mesh = new Shader((GLchar*) MESH_VERTEX_SHADER, (GLchar*) MESH_FRAGMENT_SHADER);
shMVPMatrixLoc = glGetUniformLocation(shader_mesh->getProgramId(), "u_mvpMatrix");
shColorLoc = glGetUniformLocation(shader_mesh->getProgramId(), "u_color");
shader_image = new Shader((GLchar*) IMAGE_VERTEX_SHADER, (GLchar*) IMAGE_FRAGMENT_SHADER);
texID = glGetUniformLocation(shader_image->getProgramId(), "texImage");
// Create Frame Buffer for offline rendering
// Here we render the composition of the image and the projection of the mesh on top of it in a texture (using FBO - Frame Buffer Object)
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
// Generate a render texture (which will contain the image and mesh in wireframe overlay)
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
// Give an empty image to OpenGL ( the last "0" as pointer )
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, wWnd, hWnd, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// Set "renderedTexture" as our color attachment #0
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);
// Set the list of draw buffers.
GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);
// Always check that our framebuffer is ok
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
std::cout << "invalid FrameBuffer" << std::endl;
return -1;
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
// Generate the Quad for showing the image in a full viewport
static const GLfloat g_quad_vertex_buffer_data[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f};
// Color of wireframe (soft blue)
vertices_color.r = 0.35f;
vertices_color.g = 0.65f;
vertices_color.b = 0.95f;
// Generate a buffer to handle vertices for the GLSL shader
glGenBuffers(1, &quad_vb);
glBindBuffer(GL_ARRAY_BUFFER, quad_vb);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
return 0;
}
我可以抓住framebuffer并将其转换为cv :: mat,我就可以了。我的问题是,如果没有GL Window,我似乎无法运行应用程序。
如果我注释掉glutCreateWindow
行,则init
会失败。
是否可以在后台运行openGL而不显示窗口? 谢谢。