我一直在寻找将OpenGL纹理转换为OpenCV矩阵类型的方法。我发现了许多指南,显示了从OpenCV矩阵到OpenGL纹理的转换,但遗憾的是没有相反的方式。我还阅读了this及其answer,但这并没有让我更加明智。我用C ++编写并使用OpenCV3.1和OpenGL4.4。
编辑:更新的代码
main.cpp中:
data.raw_dict["key_1"]
Texture.cpp:
#include "CameraCapture.h"
#include "GUIMainWindow.h"
#include "glfw3.h"
#include "Texture.h"
using namespace std;
int main(int argc, char* argv[]) {
if (!glfwInit()) {
fprintf(stderr, "Failed to initialize GLFW \n");
return -1;
}
glfwWindowHint(GLFW_VISIBLE, GL_FALSE);
GLFWwindow* window = glfwCreateWindow(1929, 1341, "OpenGL", NULL, NULL);
if (window == NULL) {
fprintf(stderr, "Failed to make GLFW window.");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
CameraCapture *cc = new CameraCapture();
cc->CameraCapture::AvailableCameras();
GLuint texture = cc->CameraCapture::OpenCamera(0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
drawGLTexture(window);
Mat out = textureToMat(texture);
namedWindow("Raytrix feed", WINDOW_AUTOSIZE);
imshow("Raytrix feed", out);
waitKey(0);
return 0;
}
部首:
Mat textureToMat(GLuint texture_id) {
glBindTexture(GL_TEXTURE_2D, texture_id);
GLenum texture_width, texture_height;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, (GLint*)&texture_width);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, (GLint*)&texture_height);
unsigned char* texture_bytes = (unsigned char*)malloc(sizeof(unsigned char)*texture_width*texture_height * 4);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture_bytes);
return Mat(texture_height, texture_width, CV_8UC4, texture_bytes);
}
void drawGLTexture(GLFWwindow *window) {
glColor3f(1.0f, 1.0f, 1.0f);
glBegin(GL_TRIANGLES);
glTexCoord2f(0, 1);
glVertex2f(-1, -1);
glTexCoord2f(1, 1);
glVertex2f(1, -1);
glTexCoord2f(0, 0);
glVertex2f(-1, 1);
glTexCoord2f(1, 1);
glVertex2f(1, -1);
glTexCoord2f(1, 0);
glVertex2f(1, 1);
glTexCoord2f(0, 0);
glVertex2f(-1, 1);
glEnd();
glfwSwapBuffers(window);
glfwPollEvents();
glFlush();
glFinish();
}
答案 0 :(得分:2)
我已经测试了下面的代码,它似乎有效。 (请注意GL_BGR
中glGetTexImage()
的用法。
cv::Mat get_ocv_img_from_gl_img(GLuint ogl_texture_id)
{
glBindTexture(GL_TEXTURE_2D, ogl_texture_id);
GLenum gl_texture_width, gl_texture_height;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, (GLint*)&gl_texture_width);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, (GLint*)&gl_texture_height);
unsigned char* gl_texture_bytes = (unsigned char*) malloc(sizeof(unsigned char)*gl_texture_width*gl_texture_height*3);
glGetTexImage(GL_TEXTURE_2D, 0 /* mipmap level */, GL_BGR, GL_UNSIGNED_BYTE, gl_texture_bytes);
return cv::Mat(gl_texture_height, gl_texture_width, CV_8UC3, gl_texture_bytes);
}
答案 1 :(得分:0)
glGetTexImage
获取像素。伪代码:
{{1}}
https://www.opengl.org/sdk/docs/man2/xhtml/glGetTexImage.xml
https://www.opengl.org/sdk/docs/man2/xhtml/glGet.xml
https://www.opengl.org/sdk/docs/man2/xhtml/glGetTexLevelParameter.xml